【MySQL】主从复制故障排查与修复总结
1. 问题现象
- 初始状态:
Slave_IO_Running: No,Slave_SQL_Running: Yes - 核心报错:
Last_IO_Error: Got fatal error 1236 ... 'Client requested source to start replication from position > file size' - 含义:从库请求的起始同步位点(Position)大于主库对应二进制日志文件的实际大小。
2. 根因分析
通过对比主从信息,精准定位了问题:
| 检查项 | 从库 (Slave) | 主库 (Master) |
|---|---|---|
| 日志文件 | mysql-bin.000001 | mysql-bin.000001 |
| 位置/大小 | 请求位置Read_Master_Log_Pos = 886 | 实际文件大小File_size = 157 |
结论:MASTER_LOG_POS=886是当初执行CHANGE MASTER时手误填写的错误值,导致从库试图读取不存在的字节位置,I/O 线程报错中断。
3. 解决方案与调整过程
- 初次尝试(方案一):直接执行
CHANGE MASTER TO ... MASTER_LOG_POS=157,但错误依旧。 - 根本解决(彻底重置):在从库执行了更彻底的重置操作,清除了旧的中继日志和缓存信息,并重新指向主库当前正确的位点。
STOP SLAVE;RESET SLAVE;-- 清除旧的 master 信息RESET SLAVEALL;-- 清除所有中继日志,彻底清理环境CHANGE MASTERTO...MASTER_LOG_POS=157;-- 重新配置正确位点STARTSLAVE;
4. 最终结果
Slave_IO_Running: Yes:I/O 线程成功连接主库并读取日志。Slave_SQL_Running: Yes:SQL 线程正常回放日志。Read_Master_Log_Pos: 157:从库已从正确的位置开始同步,Last_IO_Error已清空,复制恢复正常。
5. 核心经验与要点
- 错误 1236 的指向性:该报错基本锁定为位点(Position)填写错误或主库 binlog 已被清理。
- 排查关键:通过
SHOW SLAVE STATUS获取从库请求的位点,通过主库SHOW BINARY LOGS获取文件实际大小,对比即可确诊。 - 重置技巧:当
CHANGE MASTER无法生效时,务必使用RESET SLAVE ALL彻底清空从库的复制环境再重试,避免旧缓存干扰。 - 数据一致性提醒:本次因主库刚初始化(无业务数据),直接跳转位点安全可行。若主库已有大量业务数据,位点丢失时必须使用
mysqldump重导数据重新搭建,否则会导致数据冲突。 - 日常维护:后续定期关注
Seconds_Behind_Master字段,确保延迟为 0,保持同步健康。
