ERROR 1236本质是主库找不到从库请求的binlog文件或GTID位置,非日志损坏而是位点失配;常见原因包括主库binlog被purge、expire_logs_days过短、主库重启轮转、人为PURGE或从库长期宕机导致日志缺失。

为什么会出现 ERROR 1236?
这个错误本质是主库的二进制日志(binlog)在从库重放时“找不到了”——不是内容损坏,而是位置失效。常见原因有:主库 expire_logs_days 自动清理了从库还没读完的日志;主库重启后 binlog 文件被轮转;人为执行了 PURGE BINARY LOGS;或者从库宕机太久,落后太多导致日志已被删。
SHOW SLAVE STATUS 中关键字段怎么看?
先运行 SHOW SLAVE STATUS\G,重点看三组值:
-
Master_Host和Master_Port确认连的是哪个主库 -
Relay_Master_Log_File表示从库上次成功执行到的主库binlog文件名(比如mysql-bin.000042) -
Exec_Master_Log_Pos是该文件内的偏移量(比如123456789) -
Seconds_Behind_Master: NULL或IO_Running: No+SQL_Running: Yes组合,基本锁定是 IO 线程卡在拉日志阶段
如果 Relay_Master_Log_File 对应的文件在主库上已不存在(用 SHOW BINARY LOGS; 查),那就确认是日志缺失。
怎么安全跳过或重建同步?
不能直接 SET GLOBAL sql_slave_skip_counter = 1 —— 这只跳过当前事件,但日志文件本身已丢失,跳了也没用。正确做法分两种场景:
- 如果主库
binlog确实没了,且从库数据允许短暂不一致:停掉从库STOP SLAVE,用CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000043', MASTER_LOG_POS=4指向主库最新日志开头(SHOW MASTER STATUS查),再START SLAVE。风险是跳过中间变更,必须确保业务能接受 - 如果数据一致性要求高:用
mysqldump或Percona XtraBackup对主库做一致性备份,恢复到从库,再基于备份时的File/Position配置同步。这是最稳妥的方式 - 注意:
GTID模式下不能用MASTER_LOG_FILE/POS,得用SET GTID_NEXT+BEGIN; COMMIT;注入空事务来跳过,但前提是gtid_purged包含缺失段——否则仍报 1236
如何避免下次再出现?
核心是延长主库日志保留时间,并监控同步延迟:
- 调大主库
expire_logs_days(建议 ≥ 7 天),并确认磁盘空间足够 - 从库开启
relay_log_purge=OFF(仅调试期临时用,生产慎开),防止 relay log 被自动清掉 - 用
pt-heartbeat或监控脚本定期查Seconds_Behind_Master,延迟超过阈值(如 300 秒)就告警 - 主库开启
binlog_checksum=CRC32,让从库能更早发现日志传输损坏(虽不直接防 1236,但提升整体可靠性)
真正麻烦的不是修复动作本身,而是判断「能不能跳」——没做应用层幂等或补偿逻辑的系统,强行跳过 binlog 位置等于把数据一致性交给运气。


















