MySQL常见问题以及解决方法
MySQL常见问题以及解决方法
-
数据损坏或丢失
-
serverid不唯一
-
主从节点存在复制延迟
-
主从节点数据不一致
-
数据表主键冲突
数据损坏或丢失
-
Master:采用MHA+semisync replication的方式解决
-
Slave:重新复制
serverid不唯一
重新复制
主从节点存在复制延迟:
通过需要额外的监控工具的辅助
主从节点数据不一致:
通过手动备份数据不一致的表来实现数据的同步。在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且重做整个库也比较慢,这个时候可以只重做这几张表来修复主从不一致
注意:在执行导入期间需要暂时停止从库复制
范例:A,B,C这三张表主从数据不一致
1、从库停止Slave复制
mysql>stop slave;
2、在主库上dump这三张表,并记录下同步的binlog和POS点
mysqldump -uroot -pmagedu -q --single-transaction --master-data=2 testdb A B C >/backup/A_B_C.sql
3、查看A_B_C.sql文件,找出记录的binlog和POS点
head A_B_C.sql
例如:MASTERLOGFILE='mysql-bin.888888', MASTERLOGPOS=666666;
#以下指令是为了保障其他表的数据不丢失,一直同步直到那个点结束,A,B,C表的数据在之前的备份已经生成了一份快照,只需要导入进入,然后开启同步即可
4、把A_B_C.sql拷贝到Slave机器上,并做指向新位置
mysql>start slave until MASTERLOGFILE='mysql-bin.888888', MASTERLOGPOS=666666; 5、在Slave机器上导入A_B_C.sql
mysql -uroot -predhat testdb
mysql>set sql_log_bin=0;
mysql>source /backup/A_B_C.sql
mysql>set sql_log_bin=1; 6、导入完毕后,从库开启同步即可。
mysql>start slave;
START SLAVE UNTIL:将数据同步到指定二进制日志的指定位置
例如:START SLAVE UNTIL MASTER_LOG_FILE='上一步中服务器B日志名称', MASTER_LOG_POS=上一步中服务器B日志位置;
表示将使用 START SLAVE UNTIL 语句将数据同步到服务器B的日志位置:
造成数据不一致的原因:
-
二进制日志格式问题:Master的二进制日志格式为Statement,同步到从库执行后可能造成主从不一致
-
master关闭二进制日志:主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据
-
从节点未设置只读,误操作写入数据
-
主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致
-
主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面可能不支持该功能
-
MySQL自身bug导致
如何避免主从不一致
-
主库binlog采用ROW格式
-
主从实例数据库版本保持一致
-
主库做好账号权限把控,不可以执行set sql_log_bin=0
-
从库开启只读,不允许人为写入
-
定期进行主从一致性检验