ERROR 1236 表示从库请求的 binlog 文件或位置主库不存在,需先通过 SHOW BINARY LOGS 确认文件是否被 PURGE 或过期删除,再区分 GTID/传统模式谨慎处理,严禁盲目执行 RESET MASTER,并检查 max_allowed_packet 一致性。

ERROR 1236 不是 binlog “坏了”,而是从库要的文件或位置,主库根本没存——要么被删了,要么压根没生成过。
确认主库是否真丢了 binlog 文件
错误信息里通常会带具体文件名和位置,比如 Could not find first log file name in binary log index file 或 the first event 'mysql-bin.000081' at 480141113。关键就是 mysql-bin.000081 这个文件名。
- 登录主库执行
SHOW BINARY LOGS;,看列表里有没有该文件名 - 如果不在列表里,说明已被
PURGE BINARY LOGS或自动过期策略删掉(查binlog_expire_logs_seconds和expire_logs_days两个参数) - 如果在列表里,但
ls -l /path/to/mysql-bin.000081返回No such file,说明磁盘损坏、路径配置错,或文件被手动删过 - 即使文件存在,也要验证
Read_Master_Log_Pos是否超出实际长度:用mysqlbinlog --base64-output=DECODE-ROWS -v /path/to/mysql-bin.000081 | tail -20查末尾end_log_pos,比对是否小于从库请求的位置
区分 GTID 模式还是传统 file/pos 模式再操作
盲目执行 RESET MASTER 或 SET GLOBAL gtid_purged 很可能让问题更糟——模式判断错了,轻则复制起不来,重则数据不一致。
- 先查主库:
SELECT @@global.gtid_mode;返回ON就是 GTID 模式;返回OFF则走传统模式 - GTID 模式下禁用
RESET MASTER:它会清空gtid_executed和gtid_purged,导致后续START SLAVE报master has purged binary logs containing GTIDs that the slave requires - 传统模式下可安全执行
STOP SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4; START SLAVE;,但必须确保指定的文件真实存在且位置合法(一般从SHOW MASTER STATUS取最新文件 + pos=4) - GTID 模式下真正该做的是合并设置:
SET GLOBAL gtid_purged = 'UUID1:1-370,UUID2:1-2';,这个值必须包含从库自己已执行的全部 GTID(SELECT @@global.gtid_executed;)+ 主库gtid_purged中属于主库 UUID 的部分
max_allowed_packet 不一致也会触发 1236
报错含 log event entry exceeded max_allowed_packet 时,不是 binlog 缺失,而是主从参数不匹配或事务过大。
- 检查主从两边的
max_allowed_packet值是否一致(注意单位:必须是 1024 的倍数) - MySQL 5.6+ 还有
slave_max_allowed_packet_size参数,它优先级高于max_allowed_packet,建议设为比主库略大(如主库 1G,从库设 1.2G) - 临时修复:主从都执行
SET GLOBAL max_allowed_packet = 1073741824;,然后STOP SLAVE; START SLAVE; - 长期方案:统一写入 my.cnf 并重启,避免因大事务(如
LOAD DATA、INSERT ... SELECT)再次中断
真正容易被忽略的是:当主库 binlog_expire_logs_seconds 设得太短,或 DBA 手动 PURGE BINARY LOGS 后又没及时同步从库,那个位点就真的没了——此时重设位点只是让复制“跑起来”,但数据一致性已不可逆丢失。修复前务必先评估缺失范围,别只顾 START SLAVE。


















