1236错误本质是主库找不到从库请求的binlog文件或gtid位置,非日志损坏而是位点失配;需先用show binary logs确认文件是否真丢失,再据gtid或file/pos模式选择修复路径。

1236 错误不是日志损坏,而是主库根本找不到从库要的那个 binlog 文件或位置——修复前必须先确认文件是否真丢了,再按 GTID 或传统模式选操作路径。
怎么快速确认主库 binlog 文件是否已被删除
错误信息里一般会带具体文件名和位置,比如 mysql-bin.000081 at 480141113。登录主库后直接查:
- 执行
SHOW BINARY LOGS;,看列表里有没有mysql-bin.000081 - 如果不在列表里,再查
SHOW VARIABLES LIKE 'expire_logs_days';和SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';——8.0.28+ 优先用后者,只调大前者可能无效 - 如果文件名在列表里,但
ls -l /var/lib/mysql/mysql-bin.000081返回No such file,说明磁盘异常、路径错或被手动删过 - 即使文件存在,也要用
mysqlbinlog --base64-output=DECODE-ROWS -v /var/lib/mysql/mysql-bin.000081 | tail -20查末尾end_log_pos,确认是否小于从库请求的Read_Master_Log_Pos
GTID 模式下设置 gtid_purged 的硬约束
从库报错含 master has purged binary logs containing GTIDs that the slave requires,说明 GTID 断链了。不能直接 SET GLOBAL gtid_purged = '...',因为有两条铁律:
- 执行前必须确保
@@global.gtid_executed为空,否则报错Variable 'gtid_purged' can only be set when @@global.gtid_executed is empty;清空它得靠RESET MASTER(注意:这会丢掉本机所有已执行 GTID 记录) -
gtid_purged的值不是随便填的,它必须是:主库 gtid_purged ∪ (从库 gtid_executed ∩ 主库 UUID 集)——漏掉从库自己已执行的那部分 GTID,会导致重复拉取、主键冲突 - 主库上查
SELECT @@global.gtid_executed, @@global.gtid_purged\G,从库上查SELECT @@global.gtid_executed\G,合并去重后才可设
传统 file/pos 模式下重设位点的关键动作
当错误含 Client requested master to start replication from impossible position 或 Could not find first log file name in binary log index file,说明从库记的 Master_Log_File 在主库上已不存在,或 Read_Master_Log_Pos 超出文件长度。此时应:
- 在主库执行
SHOW MASTER STATUS;,拿到当前File(如mysql-bin.000082)和Position(通常为4) - 在从库执行三步:
STOP SLAVE;→CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000082', MASTER_LOG_POS=4;→START SLAVE; - 严禁用
RESET SLAVE——它会清空master.info和 relay log,反而增加恢复难度 - 不要用
SET GLOBAL sql_slave_skip_counter = 1,日志文件本身已缺失,跳事件没意义
升级 MySQL 后出现 1236 的隐蔽坑点
MySQL 升级(尤其是 5.7→8.0)常因配置重置或默认行为变更引发 1236,重点检查:
-
server-id是否被模板覆盖成1或0:主从两端都执行SELECT @@global.server_id;,注意配置文件里写的是server-id(短横线),不是server_id(下划线无效) -
gtid_mode是否不一致:主库SELECT @@global.gtid_mode;返回ON,但从库SHOW SLAVE STATUS\G中Master_Auto_Position是0,必须先STOP SLAVE; CHANGE MASTER TO MASTER_AUTO_POSITION = 1; -
max_allowed_packet是否被重置为 4MB:主从两边都查该值,单位必须一致;若主库产生大事务 event,从库接收失败也会报 1236 -
binlog_format是否混用:8.0+ 默认ROW,老从库若仍用MIXED或STATEMENT,解析失败可能间接触发 1236
真正麻烦的不是修,是判断“位点是否真的不可逆丢失”——如果主库 binlog_expire_logs_seconds 设得太小,或 DBA 手动 PURGE BINARY LOGS 后没及时同步从库,那重设位点只是掩盖问题,数据一致性已无法回溯。











