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 slave all; -- 清除所有中继日志,彻底清理环境 change master to ... master_log_pos=157; -- 重新配置正确位点 start slave;
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,保持同步健康。
6. 总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论