MySQL主从数据不一致问题处理
分析问题
-
网络延迟#
mysql主从复制默认的是异步复制,通过网络传输binlog日志文件,可能你从库在设计之初就是跨机房或者网络故障,导致binlog传输出现延迟或故障,从而导致不同步或不一致。 -
服务器负载#
如果其中某一台服务器负载太高或者磁盘占用100%,涉及msyql主从复制的3个线程可能会出现资源分配不足的情况,任何一个线程出现罢工现象,都会导致主从不同步或者同步不一致 -
其它可能#
max_allowed_packet设置不一致,主从库的key自增键开始的键值跟自增步长不一致,出现binlog或者relaylog文件出现损坏,mysql本身的bug,主从数据库版本不一致等等。
解决问题
-
忽略错误,继续同步#
#第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
-
保证主从完全一致,再重新同步#
#第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
-
提示:
1)在flush tables with read lock成功获得锁之前,必须等待所有语句执行完成(包括SELECT)。所以如果有个慢查询在执行,或者一个打开的事务,或者其他进程拿着表锁,flush tables with read lock就会被阻塞,直到所有的锁被释放,另外在退出mysql终端的时候都会隐式的执行unlock tables
2)数据库备份最好写个shell脚本定期进行备份 -
以上就是MySQL主从不同步或同步不一致的解决方案,不过对于具体问题还得具体分析,当然有兴趣的也可以使用一些开源工具进行主从数据库不一致进行修复,比如percona toolkit工具中的mk-table-sync就是用来解决主从数据不一致的情况的。引用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律