一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何修复MySQL主从复制错误1236

时间:2026-08-15 10:22:49 编辑:袖梨 来源:一聚教程网

1236错误主因是主库缺失从库所需的binlog文件或GTID位置,需先确认是否真丢失(查SHOW BINARY LOGS及物理文件)、区分GTID/pos模式再操作,严禁混用;server-id冲突和max_allowed_packet不一致也会触发同类报错。

1236 错误不是网络不通或权限不对,而是主库确实找不到从库要的 binlog 文件或 GTID 位置——文件被删了,或者压根没生成过。修复前必须先确认是哪类原因,再选对应操作,混用模式会直接失败。

查主库是否真丢了 binlog 文件

错误信息里一般会带缺失文件名,比如 could not find next log; the first event "mysql-bin.000042"。重点就是 mysql-bin.000042 这个名字。

  1. 登录主库,执行 SHOW BINARY LOGS;,看列表里有没有这个文件
  2. 如果有但实际不存在(比如磁盘损坏、路径配置错),用 ls -l /var/lib/mysql/mysql-bin.000042 确认物理文件
  3. 检查两个保留参数: expire_logs_daysbinlog_expire_logs_seconds(MySQL 8.0.28+),别只查一个
  4. 如果文件已删且没备份,说明位点真的不可逆丢失,重设位点只是跳过错误,数据一致性需人工核对

区分 GTID 模式还是 file/pos 模式再操作

执行 SELECT @@global.gtid_mode;,返回 ON 就是 GTID 模式,否则是传统模式。修复方式完全不兼容,不能猜着来。

  1. GTID 模式下严禁执行 RESET MASTER ——它会清空 gtid_executedgtid_purged,后续 START SLAVE 必报 “master has purged binary logs containing GTIDs that the slave requires”
  2. GTID 模式正确做法:STOP SLAVE → 查从库 SELECT @@global.gtid_executed; → 查主库 SELECT @@global.gtid_purged; → 合并去重后执行 SET GLOBAL gtid_purged = 'A:1-10,B:1-5,C:1-3';
  3. file/pos 模式下:STOP SLAVECHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4;START SLAVE;注意 pos 必须是 4,不是 0 或 123

排查 server-id 冲突和 max_allowed_packet 不一致

这两类问题也会触发 1236,但日志表现相似,容易误判为日志丢失。

  1. server-id 必须是非零整数,且在整个复制拓扑中全局唯一;主从设成一样(比如都是 1),IO 线程会拒绝连接,但错误提示不直白
  2. 如果错误含 log event entry exceeded max_allowed_packet,说明主库产生的 binlog event 太大,从库接收失败
  3. 确保主从 max_allowed_packet 值一致;MySQL 5.6+ 可额外设置 slave_max_allowed_packet_size 覆盖该限制
  4. 调大后需重启复制:STOP SLAVE;SET GLOBAL max_allowed_packet = 1073741824;START SLAVE;

真正容易被忽略的是:1236 报错本身不区分“可修复”和“不可逆丢失”。当 binlog_expire_logs_seconds 过短,或 DBA 手动 PURGE BINARY LOGS 后又没及时同步从库,那个 binlog 就真的没了——此时任何位点重设都只是掩盖问题,数据一致性已无法自动保障。

热门栏目