mysql从库报错1236的根本原因是主库缺失从库所需的binlog文件或position越界,需先确认binlog是否存在、是否被purge、磁盘是否异常,并严格区分gtid/传统模式采取对应修复措施。

MySQL从库报Got fatal error 1236,根本不是网络或权限问题,而是主库上确实没有从库要的那个 binlog 文件,或者那个 position 已经超出文件末尾——要么被删了,要么压根没生成过。
查主库是否真丢了 binlog 文件
错误信息里一般会带具体文件名和位置,比如'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 /var/lib/mysql/mysql-bin.000081返回No such file,说明磁盘损坏、路径配置错,或文件被手动删过 - 即使文件存在,也要验证
Read_Master_Log_Pos是否超出实际长度:用mysqlbinlog --base64-output=DECODE-ROWS -v /var/lib/mysql/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是否一致
报错含log event entry exceeded max_allowed_packet时,不是 binlog 缺失,而是主从参数不匹配或事务过大。
- 检查主从两边的
max_allowed_packet值是否一致(注意单位:必须是字节,且建议设为相同整数,如1073741824) - MySQL 5.6+ 可额外检查
slave_max_allowed_packet_size,它控制从库接收 packet 的上限,通常应 ≥max_allowed_packet - 调大后需执行
STOP SLAVE; START SLAVE;才生效,不能只靠SET GLOBAL
最容易被忽略的是:GTID 模式下gtid_purged不是直接抄主库的值,而是必须把从库自己已执行的 GTID 合并进去;传统模式下CHANGE MASTER TO指定的MASTER_LOG_POS哪怕只差 1 字节,也会触发 1236 —— 它校验极严,不接受“大概对”。











