MySQL 8.0 主从复制报 Error 1236 且涉及 binlog 格式问题,通常是因为主从版本差异导致binlog_checksum配置不一致(如 CRC32 与 NONE),或max_allowed_packet大小不匹配。处理核心是统一主从校验和配置或调整包大小限制,严禁在主库直接执行RESET MASTER清空 GTID。
先说结论:Error 1236 伴随 binlog 格式报错多为校验和冲突,需优先检查主从binlog_checksum值是否一致,再确认 GTID 状态。
- 先确认:执行
SHOW VARIABLES LIKE 'binlog_checksum'对比主从差异 - 先处理:在高版本主库设置
binlog_checksum=NONE或升级从库版本 - 再验证:执行
START SLAVE后观察Slave_IO_Running是否为 Yes
命令速用版
以下命令用于快速定位校验和配置及复制状态,需在主库和从库分别执行对比。
\s-- 查看校验和配置 SHOW VARIABLES LIKE 'binlog_checksum'; -- 查看最大包大小 SHOW VARIABLES LIKE 'max_allowed_packet'; -- 查看复制状态 SHOW SLAVE STATUS\G;
为什么会这样
Error 1236 报 binlog 格式错误本质是主从版本特性不兼容。MySQL 5.6.5 以后版本默认开启binlog_checksum=crc32,而低版本默认为none,当低版本从库读取高版本主库带校验和的 binlog 事件时会报错。
此外,若主库写入事务产生的 binlog event 大小超过从库max_allowed_packet限制,也会触发 1236 错误,提示log event entry exceeded max_allowed_packet。这两种情况都属于配置不一致导致的复制中断。
分步处理
按照以下顺序排查并修复,避免盲目重置主库导致 GTID 丢失。
第一步:检查主从版本与校验和
在主库和从库分别执行SELECT VERSION();和SHOW VARIABLES LIKE 'binlog_checksum';。若主库为 CRC32 而从库不支持或配置为 NONE,需统一配置。
第二步:调整主库配置(谨慎操作)
若业务允许,可在主库动态设置SET GLOBAL binlog_checksum=NONE;,但需注意新产生的 binlog 将不再带校验和。若主库已产生大量带校验和的 binlog,此方法可能无效,需考虑升级从库。
第三步:检查包大小限制
若报错信息包含exceeded max_allowed_packet,需确保主从max_allowed_packet值一致且足够大。执行SET GLOBAL max_allowed_packet=1073741824;(1GB)后重启复制线程。
第四步:重置复制线程
配置修改后,在从库执行STOP SLAVE;然后START SLAVE;。若仍报错,需检查 GTID 模式是否开启,GTID 模式下严禁使用RESET MASTER。
怎么验证是否生效
执行SHOW SLAVE STATUS\G,重点关注以下字段:
Slave_IO_Running:必须为Yes,若为No查看Last_IO_Error是否仍有 1236Seconds_Behind_Master:数值应逐渐减小至 0,若为 NULL 说明复制线程未启动Last_IO_Errno:应为 0,若仍为 1236 说明配置未生效或 binlog 文件确实缺失
常见坑
处理 Error 1236 时容易误操作导致数据不一致,需注意以下边界:
- GTID 模式风险:开启 GTID 时,主库执行
RESET MASTER会清空gtid_executed,导致从库无法同步,严禁随意执行 - 文件缺失误区:若报错提示
Could not find first log file,通常是主库 binlog 被清理(expire_logs_days过短),此时调整格式配置无效,需重做从库 - 跳过事务隐患:使用
sql_slave_skip_counter跳过错误会导致主从数据不一致,仅适用于临时止血,不可作为长期方案
常见问题
Error 1236 报 GTID 错误和格式错误有什么区别?
GTID 错误通常提示master has purged binary logs containing GTIDs,表示事务 ID 缺失;格式错误提示Slave can not handle replication events with the checksum,表示校验和不兼容。
主从 binlog_format 不一致会导致 1236 吗?
通常不会直接报 1236,但会导致数据不一致。主从binlog_format(ROW/STATEMENT/MIXED)建议保持一致,否则可能引发同步逻辑错误。
修改 max_allowed_packet 需要重启 MySQL 吗?
不需要。该参数支持动态修改,执行SET GLOBAL后立即生效,但建议同时修改配置文件my.cnf以防重启后失效。
参考来源
- CSDN 博客 - mysql binlog_checksum_【MySQL】复制 1236 错误 (不同版本间 binlog_checksum 配置问题)
- 博客园 - 如何解决 MySQL 主从复制中 ERROR 1236 导致的 Binlog 找不到?
- CSDN 博客 - mysql error 1236_【MySQL】Got fatal error 1236 原因和解决方法
- 博客园 - MySQL 主从复制数据不一致,怎么办?