数据库主从同步中断故障排查修复方案

数据库主从同步中断全流程排查与修复指南

主从同步断开是 MySQL 运维里最常遇到的故障之一,一旦 Slave 线程停止,从库数据就会滞后甚至完全不可用。
很多新手一看到 Slave_IO_Running: NoSlave_SQL_Running: No 就慌了,其实按顺序排查通常都能修好。
下面直接从现象开始,一步步带你走完排查和修复过程。

准备工作:确认同步状态和错误信息

在动手修复之前,必须先搞清楚断开的具体原因。
登录从库 MySQL 终端,执行下面的命令查看同步线程状态:

SHOW SLAVE STATUS\G

重点关注几个关键字段:

  • Slave_IO_Running:如果为 No,说明 IO 线程无法从主库拉取 binlog。
  • Slave_SQL_Running:如果为 No,说明 SQL 线程执行中继日志时出错(例如表结构冲突、主键重复)。
  • Last_IO_Error / Last_SQL_Error:直接告诉你上次失败的具体报错,这是最关键的线索。
  • Seconds_Behind_Master:如果为 NULL 或持续增大,同样代表不同步。

确认错误信息后,不要急着执行 stop slave / start slave,先搞清楚错误类型再动手。

分步排查与修复操作

针对不同的状态,修复方法也不同。
这里列出最常见的 3 种场景及对应操作:

场景一:Slave_IO_Running: No(IO 线程连不上主库)

报错通常是 Error connecting to masterGot fatal error 1236 from master when reading data from binary log

排查方向:

  1. 检查主库网络是否可达:ping 主库IP
  2. 确认主库的复制账号是否正常:SELECT user, host FROM mysql.user WHERE user='你的复制用户';
  3. 在主库上检查 SHOW MASTER STATUS;,看 File 和 Position 是否发生变化。如果 File 不存在(比如 binlog 已被 purge),需要重新同步。

修复命令示例(重新指定主库信息):

STOP SLAVE;
CHANGE MASTER TO
  MASTER_HOST='主库IP',
  MASTER_USER='复制用户',
  MASTER_PASSWORD='密码',
  MASTER_LOG_FILE='从SHOW MASTER STATUS获取的binlog文件名',
  MASTER_LOG_POS=从SHOW MASTER STATUS获取的位置号;
START SLAVE;

对于 GTID 模式,可以不用指定日志文件和位置:

STOP SLAVE;
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
START SLAVE;

场景二:Slave_SQL_Running: No(SQL 线程执行报错)

常见错误码 1062(主键冲突)或 1032(记录不存在)。

修复思路:

  • 如果错误很少(比如只有几条数据冲突),可以手动补全或删除冲突数据,然后跳过一个事务:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
  • 如果错误太多,或者主从数据差异很大,建议重新同步从库(全量 dump + 增量)。

场景三:两者都为 No,且 Last_IO_Error 显示 binlog 丢失

说明主库的 binlog 已被清理,从库跟不上。
必须重新做全量同步:

  1. 主库导出数据:mysqldump -u root -p --all-databases --master-data=2 > full.sql
  2. 把导出的 SQL 传到从库并导入:mysql -u root -p < full.sql
  3. 然后执行 CHANGE MASTER(带上导出的日志文件名和 Position,或者使用 MASTER_AUTO_POSITION=1 如果是 GTID)。

避坑指南:这些操作千万别做错

  • 不要直接用 reset slaveRESET SLAVE 会清空 relay log 信息和 master info,但不会改主库的 binlog 状态,容易造成重新配置后依然报错。应该先 stop slave,再 change master。
  • 跳过错误要谨慎SQL_SLAVE_SKIP_COUNTER 只能跳过单条错误,如果错误重复出现(比如表结构不一致),跳过了也没用,必须修复表或重新同步。
  • 检查主库 binlog 保留时间:通过 SHOW VARIABLES LIKE 'expire_logs_days'; 检查,建议设置不少于 7 天,避免从库临时断连后 binlog 被清理。
  • 修改参数后记得重启从库 SQL 线程:改完 server_idlog_slave_updates 等参数需要重启 MySQL 生效。

验证同步是否已恢复

修复后执行以下检查:

SHOW SLAVE STATUS\G

确认两个 Running 字段都为 Yes,并且 Seconds_Behind_Master 在几秒内从高值降为 0 或很小的数字。
同时可以对比主从库同一张表的数据行数:

SELECT COUNT(*) FROM 某张重要表;   -- 主库执行
SELECT COUNT(*) FROM 某张重要表;   -- 从库执行

数量一致说明基本没问题。
如果还有延迟,可以查看 SHOW PROCESSLIST; 确认是否有大查询阻塞。

高频问题 FAQ

Q:Seconds_Behind_Master 为 0 但数据不一致怎么办?
A:Seconds_Behind_Master 只代表从库执行中继日志的滞后时间,不代表数据绝对一致。如果表结构不一致或者出现 relay log 损坏,会有差异。建议用 pt-table-checksum 做一致性校验。

Q:执行 CHANGE MASTER 后 IO 线程还是 No,怎么办?
A:检查主库的复制账号权限是否完整(至少 REPLICATION SLAVEREPLICATION CLIENT),同时确认防火墙没有阻断 3306 端口。

Q:主从同步中断时间很长,能不能不重新全量同步?
A:如果主库的 binlog 还没有被 purge,可以尝试指定更早的日志文件和位置(通过 SHOW BINARY LOGS; 查找)。但通常建议重新做一次全量同步,更安全可靠。

如果你正在处理主从同步中断,建议先按本文排查错误信息,再选择对应场景修复,遇到复杂错误时优先考虑重新同步。

分享到:
上一篇
多语言外贸站点Nginx完整多域名配置教程
下一篇
磁盘空间爆满自动清理无用日志定时任务
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意