MySQL主从数据库不同步的2种解决方法
当MySQL主从复制出现故障(如Slave_SQL_Running: No)时,解决方案取决于对数据一致性的要求。如果允许少量差异,可通过命令跳过当前错误继续同步;如果需要严格的数据一致性,则需要锁定主库、备份数据并在从库重建同步链路。
故障现象诊断
在主库和从库均运行正常的情况下,若发现主从不同步,首先需要通过以下命令排查状态:
1. 检查主库(Master)状态
- 使用
show processlist;查看是否有大量Sleep进程或异常查询。 - 使用
show master status;确认可写位置及二进制日志文件名。正常输出应包含File(如mysqld-bin.000001)和对应的Position。
2. 检查从库(Slave)状态
登录从库执行:show slave status\G
重点关注以下两个字段:
Slave_IO_Running:应为Yes,表示IO线程正常接收主库日志。Slave_SQL_Running:若显示为No,则表示SQL线程执行出错,导致同步中断。
方法一:忽略错误后,继续同步
适用场景:主从库数据相差不大,或者对数据一致性要求不严格(允许短暂不一致或个别记录丢失),仅希望快速恢复同步状态。
操作步骤
通过设置全局变量跳过当前出错的SQL事务步骤:
- 停止从库同步:
stop slave; - 设置跳过计数器:
set global sql_slave_skip_counter = 1;
此命令指示 Slave 线程在重连后,跳过当前的一个事件(通常是引发错误的那个语句)。若问题复杂可能需要多次执行,但通常设为1即可应对多数因语句报错导致的停滞。 - 启动从库同步:
start slave; - 验证状态:
再次执行show slave status\G,确认Slave_IO_Running和Slave_SQL_Running均变为Yes。
方法二:重新做主从,完全同步
适用场景:主从库数据相差较大,或业务要求主从数据必须完全一致。该方法风险较高,需先在生产环境进行完整备份。
重要提醒:在执行任何数据覆盖操作前,请务必确保已有有效的全量备份。
第1步:主库锁表与备份
为防止备份期间有新数据写入导致数据不一致:
- 锁定主库为只读:
mysql> flush tables with read lock;
注意:该状态下主库仅支持读取,无法写入。 - 记录当前同步点:
打开另一个窗口或通过其他工具查询show master status;,记下File(日志文件名)和Position(偏移量)的值。例如:File: mysqld-bin.000001,Position: 3260。 - 执行数据导出:
mysqldump -uroot -p -hlocalhost > mysql.bak.sql - 解锁主库:
unlock tables;(完成导出后立即解锁,减少业务影响时间)。
第2步:传输与恢复数据到从库
- 传输备份文件:
使用scp或其他安全传输工具将mysql.bak.sql复制到从库服务器。[root@server01 mysql]# scp mysql.bak.sql root@从库IP:/tmp/ - 停止从库同步服务:
mysql> stop slave; - 恢复数据:
登录从库 MySQL,执行源数据导入。mysql> source /tmp/mysql.bak.sql
第3步:重新配置并开启同步
- 设置主从连接参数:
在从库中执行change master to命令,指定新的同步起点。参数包括主库IP、账号密码以及第二步记录的日志文件和位置点。change master to
master_host='主库IP',
master_user='rsync',
master_port=3306,
master_password='',
master_log_file='mysqld-bin.000001',
master_log_pos=3260;
注意:请根据实际环境的用户名、密码及第1步查到的具体 File/Position 值替换上述参数。 - 开启同步:
mysql> start slave;
(注:原文此处误写为 stop slave,实际操作应为 start 开启) - 最终检查:
show slave status\G
确认Slave_IO_Running和Slave_SQL_Running均为Yes,且无报错信息。
以上就是 MySQL 主从数据库不同步的详细内容,更多关于 MySQL 主从同步配置与维护的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













