在 MySQL 主从复制环境中,如果从节点(Slave)出现异常或中断,需要及时恢复以保证数据一致性。恢复复制节点的关键是确保从节点能重新连接到主节点,并从中断的位置继续同步数据。
检查复制状态
登录到从节点执行:
SHOW SLAVE STATUS\G重点关注以下两个字段:
Slave_IO_Running:是否正常拉取主库的 binlog Slave_SQL_Running:是否正常执行中继日志中的 SQL Last_Error:最近的错误信息,用于定位问题如果任一状态为 No,说明复制已中断,需进一步处理。
常见中断原因及恢复方法
根据错误类型选择合适的恢复方式:
1. 数据冲突或重复键错误(如主键冲突)
这类错误通常导致 SQL 线程停止。若确认跳过该事务不影响业务,可手动跳过错误事务:
STOP SLAVE;SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
注意:
sql_slave_skip_counter = 1表示跳过下一个事件。适用于基于语句或混合格式复制。如果是基于行的复制(ROW),可能需跳过多条事件,建议谨慎操作。
2. 主库 binlog 被清理,导致从库无法获取日志
错误提示类似:
Could not find first log file name in binary log index file或
Got fatal error 1236 from master。
此时从库请求的 binlog 已被主库删除,无法继续增量同步。必须重新初始化从库:
在主库执行FLUSH TABLES WITH READ LOCK;,然后导出数据: mysqldump -u root -p --all-databases --master-data=2 > backup.sql 记录导出文件中的
CHANGE MASTER TO所需的 binlog 文件名和位置 释放锁:
UNLOCK TABLES;将备份导入从库并重启复制: STOP SLAVE;
RESET SLAVE ALL;
SOURCE /path/to/backup.sql;
START SLAVE;
3. 主库重启或故障切换后位置变化
如果主库发生过重置或重建,binlog 位置已变,需确认新的同步起点。可通过 GTID 模式简化恢复:
启用 GTID 复制的环境,可在从库使用:
STOP SLAVE;RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION = 1;
START SLAVE;
MySQL 会自动协商从哪个事务开始同步,避免手动定位位置。
预防措施与最佳实践
开启 GTID 模式,便于故障恢复和主从切换 合理设置主库的expire_logs_days,避免过早清理 binlog 定期监控复制延迟和状态,使用工具如
pt-heartbeat从库定期备份,避免频繁全量重建
基本上就这些。关键是先看错误、再判断是否能跳过或必须重建。GTID 能大大降低恢复复杂度。
