Got fatal error 1236原因和解决方法

本文探讨了MySQL主从复制过程中常见的Error1236问题,包括log event过大、binlog文件缺失、主库空间不足及主库异常断电等情况,并提供了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://blog.itpub.net/22664653/viewspace-1714269/

一 前言
  MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到Got fatal error 1236 from master when reading data from binary log” 这类的报错/报警。本文整理了常见的几种 error 1236 报错,并给出相应的解决方法,有所不足之处,当然也希望各位读者朋友指正。

二 常见的error 1236 报错
2.1 logevent超过max_allowed_packet 大小

  1. Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the start event position from 'mysql-bin.006730' at 290066246, the last event was read from '/u01/my3309/log/mysql-bin.006730

原因
   此类报错和max_allowed_packet相关。首先max_allowed_packet控制着主从复制过程中,一个语句产生的二进制binlog event大小,它的值必须是1024的倍数 。出现此类错误的常见原因是
 1 该参数在主备库的配置大小不一样,主库的配置值大于从库的配置值。 从主库传递到备库的binlog event大小超过了主库或者备库的max_allowed_packet大小。
 2 主库有大量数据写入时,比如在主库上执行 laod data,insert into .... select 语句,产生大事务。
当主库向从库传递一个比从库的max_allowed_packet 大的packet ,从库接收该packet失败,并报 “log event entry exceeded max_allowed_packet“。
如何解决
 需要确保主备配置一样,然后尝试调大该参数的值。

  1. set global max_allowed_packet =1*1024*1024*1024;
  2. stop slave;
  3. start slave

另外,5.6 版本中的 slave_max_allowed_packet_size 参数控制slave 可以接收的最大的packet 大小,该值通常大于而且可以覆盖 max_allowed_packet 的配置, 进而减少由于上面的问题导致主从复制中断。

2.2 slave 在主库找不到binlog文件
 

  1. Got fatal error 1236 from master when reading data from binary log:

原因
 该错误发生在从库的io进程从主库拉取日志时,发现主库的mysql_bin.index文件中第一个文件不存在。出现此类报错可能是由于你的slave 由于某种原因停止了好长一段是时间,当你重启slave 复制的时候,在主库上找不到相应的binlog ,会报此类错误。或者是由于某些设置主库上的binlog被删除了,导致从库获取不到对应的binglog file。
如何解决
 1 为了避免数据丢失,需要重新搭建slave 。
 2 注意主库binlog的清理策略,选择基于时间过期的删除方式还是基于空间利用率的删除方式。
  不要使用rm -fr 命令删除binlog file,这样不会同步修改mysql_bin.index 记录的binlog 条目。在删除binlog的时候确保主库保留了从库 show slave status 的Relay_Master_Log_File对应的binlog file。

2.3 主库空间问题,
日志被截断

  1. Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event; consider out of disk space on master; the start event position from 'mysql-bin.006730' at 290066434, the last event was read from '/u01/my3309/log/mysql-bin.006730

原因
 该错误和主库的空间问题和sync_binlog配置有关,当主库 sync_binlog=N不等于1且磁盘空间满时,MySQL每写N次binary log,系统才会同步到磁盘,但是由于存储日志的磁盘空间满而导致MySQL 没有将日志完全写入磁盘,binlog event被截断。slave 读取该binlog file时就会报错"binlog truncated in the middle of event;"
 当sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。
 当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

如何解决
 在从库重新指向到主库下一个可用的binlog file 并且从binlog file初始化的位置开始

  1. stop slave;
  2. change master to master_log_file='mysql-bin.006731', master_log_pos=4;
  3. start slave;

2.4 主库异常断电,从库读取错误的position

  1. 120611 20:39:38 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236) 
  2. 120611 20:39:38 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position', Error_code: 1236
  3. 120611 20:39:38 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000143', position 664526789

【原因】
 该问题也是和sync_binlog=N不等于1有关,多出现在主机异常crash ,比如磁盘损坏,raid 卡损坏,或者主机异常掉电导致binlog 未及时同步到磁盘。从库读取了主库binlog file中的不存在的binlog position ,一般比binlogfile 的end position 的值还要大。
如何解决
1 在从库重新指向到主库下一个可用的binlog file 并且从binlog file初始化的位置开始

  1. stop slave;
  2. change master to master_log_file='mysql-bin.000144', master_log_pos=4;
  3. start slave;

2 主备库设置 sync_binlog=1,但是设置为1的时候,会带来性能下降。 

三 相关阅读
max_allowed_packet 官方介绍
Percona MySQL的特性 max_binlog_files   
sync_binlog innodb_flush_log_at_trx_commit 浅析  

<think>我们面对的是MySQL主从复制中的致命错误1236,具体表现为从节点请求的GTID不在主节点的二进制日志中。这个问题通常发生在主库的二进制日志被清理或损坏,导致从库请求的GTID位置在主库的binlog中不存在。根据引用[2][3][4],我们得知这种错误与二进制日志位置或GTID的丢失有关。以下是系统的解决方案:###错误原因分析-**问题本质**:从库记录的GTID集合指向了主库已经清除或缺失的二进制日志位置(例如主库进行了日志清理或异常崩溃导致日志不连续)[^2][^4]。-**错误表现**:在`SHOWSLAVESTATUS`中会看到类似`Couldnotfindfirstlogfilenameinbinarylogindexfile`或`Gotfatalerror1236`的报错[^4]。###解决方案步骤####方法1:重建从库(推荐)当主库仍保留完整数据时,重建从库是最安全的方式:1.**主库备份**:```bashmysqldump--single-transaction--master-data=2--triggers--routines--all-databases-uroot-p>full_backup.sql```-`--single-transaction`:确保一致性快照(仅适用于InnoDB)[^3]-`--master-data=2`:记录备份时刻的二进制日志位置(以注释形式保存)2.**从库数据重置**:```sqlSTOPSLAVE;RESETSLAVEALL;--清除所有复制配置DROPDATABASEIFEXISTSyour_database;--根据实际情况选择是否删除数据```3.**导入备份**:```bashmysql-uroot-p<full_backup.sql```4.**重新配置复制**:-如果使用GTID模式(推荐):```sqlCHANGEMASTERTOMASTER_HOST='master_ip',MASTER_USER='repl_user',MASTER_PASSWORD='password',MASTER_AUTO_POSITION=1;STARTSLAVE;```-如果未启用GTID,使用备份文件中的位置信息:```sql--在备份文件中查找类似以下内容(通常在开头):--CHANGEMASTERTOMASTER_LOG_FILE='mysql-bin.00000X',MASTER_LOG_POS=XXX;CHANGEMASTERTO...--根据备份文件中的位置配置```####方法2:强制跳过错误位置(仅应急)>**警告**:此方法可能导致数据不一致,仅用于临时恢复服务,事后仍需重建从库[^2][^4]。1.停止从库复制:```sqlSTOPSLAVE;```2.获取主库当前有效GTID集合:```sql--在主库执行SHOWMASTERSTATUS;--记录Executed_Gtid_Set(例如:d2f4b52a-4d1a-11ee-bd7a-0242ac110001:1-1000)```3.在从库重置GTID位置:```sqlRESETMASTER;--清空从库本地的GTID执行记录(谨慎操作!)SET@@GLOBAL.GTID_PURGED='主库的Executed_Gtid_Set';--与主库完全一致[^3]```4.重新启动复制:```sqlCHANGEMASTERTOMASTER_AUTO_POSITION=1;STARTSLAVE;```###关键预防措施1.**延长二进制日志保存周期**修改主库配置(`my.cnf`):```ini[mysqld]expire_logs_days=7#至少保留7天日志```2.**启用复制延迟备份**建议配置延迟从库(延迟1-24小时),当主库误删日志时可从延迟库恢复:```sqlCHANGEMASTERTOMASTER_DELAY=3600;--延迟1小时```3.**定期监控GTID连续性**使用脚本检查主库的GTID连续性:```sqlSHOWGLOBALVARIABLESLIKE'gtid_executed';--应无间隔```###流程图:错误处理决策```mermaidgraphTDA[发生错误1236]-->B{主库是否仍存所需binlog?}B-->|是|C[尝试重建复制链路]B-->|否|D[检查备份可用性]D-->|有近期备份|E[用备份重建从库]D-->|无备份|F[强制重置从库GTID位置]F-->G[数据校验]-->H[确认业务影响]```>**重要提醒**:强制跳过错误位置后,务必使用`pt-table-checksum`进行数据校验[^2][^3]。若发现数据差异,需立即修复。§§相关问题§§1.如何配置MySQL的延迟复制?2.使用`pt-table-checksum`进行主从数据校验的具体操作步骤是什么?3.MySQL二进制日志管理的最佳实践有哪些?</think>### 解决MySQL主从复制错误1236(GTID不在主节点binlog) #### 错误原因分析 错误 `Got fatal error 1236` 并提示 **"GTID not in master binlog"** 通常由以下原因引起: 1. **主库二进制日志被清除**(最常见):主库的 `expire_logs_days` 设置导致所需GTID对应的binlog已被自动删除[^2][^4] 2. **主库异常断电**:导致binlog损坏或不连续[^2] 3. **从库GTID位置错误**:从库记录的GTID超出了主库当前binlog范围[^3] 4. **主库reset操作**:执行了 `RESET MASTER` 清空binlog[^4] --- ### 完整解决方案 #### 方法1:重建从库(推荐) 这是最安全可靠的解决方案,尤其当主库有完整数据时: ```bash # 1. 主库创建备份(使用GTID一致性参数) mysqldump --single-transaction --master-data=2 --set-gtid-purged=ON -u root -p --all-databases > full_backup.sql # 2. 从库停止复制并重置 mysql -u root -p -e "STOP SLAVE; RESET SLAVE ALL;" # 3. 导入备份到从库 mysql -u root -p < full_backup.sql # 4. 重新配置复制(GTID模式) mysql -u root -p -e " CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='your_password', MASTER_AUTO_POSITION=1; START SLAVE; " ``` #### 方法2:强制同步GTID位置(应急方案) > ⚠️ 仅用于临时恢复服务,可能导致数据不一致[^3] ```sql -- 在从库执行 STOP SLAVE; -- 获取主库当前GTID集合 -- 在主库执行:SHOW MASTER STATUS\G -- 记录 Executed_Gtid_Set 值 (例: 3a9b150a-8a44-11ee-bd7a-00155d016201:1-1000) -- 在从库重置GTID RESET MASTER; SET @@GLOBAL.GTID_PURGED = '3a9b150a-8a44-11ee-bd7a-00155d016201:1-1000'; -- 重新启动复制 CHANGE MASTER TO MASTER_AUTO_POSITION=1; START SLAVE; ``` #### 方法3:跳过缺失的GTID(高风险) ```sql -- 在从库执行 STOP SLAVE; SET GTID_NEXT='3a9b150a-8a44-11ee-bd7a-00155d016201:1001'; -- 替换为缺失的GTID BEGIN; COMMIT; SET GTID_NEXT='AUTOMATIC'; START SLAVE; ``` --- ### 关键预防措施 1. **延长binlog保存时间** 修改主库配置 `/etc/my.cnf`: ```ini [mysqld] expire_logs_days = 7 # 至少保留7天日志 ``` 2. **定期备份binlog** 使用脚本定期备份binlog到安全存储: ```bash # 每天备份binlog rsync -av /var/lib/mysql/mysql-bin.* backup-server:/mysql-binlog-backup/ ``` 3. **启用复制监控** 配置告警规则: ```sql SHOW SLAVE STATUS WHERE Slave_IO_Running != 'Yes' OR Slave_SQL_Running != 'Yes' OR Seconds_Behind_Master > 60; ``` 4. **使用延迟从库** 配置一个延迟1小时的从库作为保险: ```sql CHANGE MASTER TO MASTER_DELAY = 3600; ``` --- ### 数据一致性验证 修复后必须进行数据校验: ```bash # 使用Percona Toolkit检查 pt-table-checksum --host=master_ip --user=check_user --password=pass --databases=your_db # 修复差异(谨慎使用) pt-table-sync --execute --sync-to-master h=slave_ip,D=your_db,t=your_table ``` > **重要提示**:方法23可能导致数据丢失,修复后应立即使用 `pt-table-checksum` 校验数据一致性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值