zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

MySQL常见问题以及解决方法

2023-02-18 16:34:37 时间

MySQL常见问题以及解决方法

  1. 数据损坏或丢失

  2. serverid不唯一

  3. 主从节点存在复制延迟

  4. 主从节点数据不一致

  5. 数据表主键冲突

数据损坏或丢失
  • 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的日志位置:
造成数据不一致的原因:
  1. 二进制日志格式问题:Master的二进制日志格式为Statement,同步到从库执行后可能造成主从不一致

  2. master关闭二进制日志:主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据

  3. 从节点未设置只读,误操作写入数据

  4. 主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致

  5. 主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面可能不支持该功能

  6. MySQL自身bug导致

如何避免主从不一致
  1. 主库binlog采用ROW格式

  2. 主从实例数据库版本保持一致

  3. 主库做好账号权限把控,不可以执行set sql_log_bin=0

  4. 从库开启只读,不允许人为写入

  5. 定期进行主从一致性检验