主从不同步的情况
1.网络延迟
由于mysql主从复制是基于binlog的一种异步复制,通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计。
2.主从两台机器的负载不一致,由于mysql主从复制是主数据库上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。
3.max_allowed_packet设置不一致,主数据库上面设置的max_allowed_packet比从数据库大,当一个大的sql语句,能在主数据库上面执行完毕,从数据库上面设置过小,无法执行,导致的主从不一致。
4.自增键不一致,key自增键开始的键值跟自增步长设置不一致引起的主从不一致。
5.同步参数设置问题,mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。
6.主库binlog格式未Statement,同步到从库执行后可能造成主从不一致。
7.主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。
8.从节点未设置只读,误操作写入数据。
9.主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致
10.主从实例版本不一致,特别是高版本是主,低版本是从的情况下,主数据库上面支持的功能从数据库上面可能不支持
11.MYSQL自身bug导致
主从不一致查看
主库上查看是否有太多sleep线程, 发现线程正常
mysql>show processlist;+----+----------+------------------+------+------------------+------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+----------+------------------+------+------------------+------+-----------------------------------------------------------------------+------------------+
| 1 | repluser | 10.0.0.216:48640 | NULL | Binlog Dump GTID | 3595 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 3 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+----------+------------------+------+------------------+------+-----------------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
查看主库,状态也正常
mysql>show master logs;+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| localhost-bin.000001 | 9839 |
+----------------------+-----------+
1 row in set (0.00 sec)
由此可见是从库的问题
从库解决方法1:重新实现从库
主库数据量较大的话,这个方法恢复时间比较慢,而且有时候从库也承担一部分的查询操作,不能贸然重建。
从库解决方法2:使用percona-toolkit工具辅助
从库解决方法3:手动重建不一致的表
在从库发现某几张与主库数据不一致,而这几张表数据量也比较大,手工对比数据不现实,重做整个库也比较慢,这个时候可以只重做这几张表来修复主从不一致
这个方案缺点是在执行导入期间需要暂时停止从库复制
实现思路:
假设A,B,C这三张表主从数据不一致
1.停止从库复制
2.在主库上dump这三张表,并且记录下同步的binlog和POS点
3.查看A_B_C.sql文件,找出记录的binlog和POS点
4.把A_B_C.sql拷贝到slave机器上,并做指定复制到的位置