MySQL主从不同步或同步不一致怎么解决

Java技术 潘老师 2年前 (2022-02-24) 1659 ℃ (0) 扫码查看

MySQL主从同步往往可能会因为各种原因出现主从数据库不同步或者同步数据不一致的情况,出现这种情况,我们应该如何去解决?

MySQL主从不同步或同步不一致原因分析

首选我们需要具体问题具体分析,针对不同的情况采取不同的措施。下面我们来说下可能导致该问题的一些原因:

1)网络延迟原因

mysql主从复制默认的是异步复制,通过网络传输binlog日志文件,可能你从库在设计之初就是跨机房或者网络故障,导致binlog传输出现延迟或故障,从而导致不同步或不一致。

2)服务器负载

如果其中某一台服务器负载太高,涉及msyql主从复制的3个线程可能会出现资源分配不足的情况,任何一个线程出现罢工现象,都会导致主从不同步或者同步不一致。

3)其他原因

当然,还有一些其他的原因,比如max_allowed_packet设置不一致,主从库的ey自增键开始的键值跟自增步长不一致,出现binlog或者relaylog文件出现损坏,mysql本身的bug,主从数据库版本不一致等等。

MySQL主从不同步或同步不一致怎么解决

一般有两种方案来解决不同步或者不一致问题,第一种就是不一致数据较少的情况且这些丢失的部分数据不是特别重要,不会对业务造成致命性的影响,这种我们可以直接忽略这部分数据即可,第二种就是,主从库数据相差较多,或者数据非常重要,我们必要保证主从库数据的一致性,这时我们就需要彻底地重新同步。

第1种:忽略错误,继续同步

针对相差数据少或数据不重要,我们采取忽略策略,步骤如下:

#第1步:先登入从库mysql
mysql -uroot -p密码
#第2步:停止slave
stop slave;
#第3步:表示跳过1步错误(后面的数字可自行调整)
set global sql_slave_skip_counter =1;
#第4步:启动slave
start slave
#第5步:检查同步状态,查看IO线程和SQL线程是否为Yes
show slave status\G

第2种:保证主从完全一致,再重新同步

数据差距较大或者数据一致性要求较高,适合此种方案,步骤如下:

#第1步:登入主库mysql,禁止写入(全局读锁定),并保持该对话
flush tables with read lock;
#第2步:新建对话,备份主库数据,比如这里指定test库
mysqldump -uroot -p test > /tmp/test.sql;
#第3步:将备份文件远程复制到从库
scp /tmp/test.sql  root@192.168.xx.xx:/tmp/test.sql;
#第4步:查看主库状态,记下file和position,后面要用
show master status
#第5步:登入从库mysql,停止从库的状态
stop slave
#第6步:在从库还原备份数据
use test
source /tmp/test.sql
#第7步:设置主从同步,注意master_log_file 和master_log_pos的值要和master中的保持一致
change master to master_host = '192.168.xx.xx', master_user = 'syncuser', master_port=3306, master_password='xxxx', master_log_file = 'mysql-bin.000003', master_log_pos=1560;
#第8步:开启从库状态
start slave
#第9步:退出主库mysql对话或手动解锁
unlock tables
#第10步:查看同步状态
show slave status\G

总结

以上就是MySQL主从不同步或同步不一致的解决方案,不过对于具体问题还得具体分析,当然有兴趣的也可以使用一些开源工具进行主从数据库不一致进行修复,比如percona toolkit工具中的mk-table-sync就是用来解决主从数据不一致的情况的。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/4556.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】