MySQL复制之常见Got fatal error 1236错误

本文探讨了MySQL主从复制过程中常见的Error1236问题,包括log event过大、binlog文件缺失、主库空间不足及主库异常断电等场景,并提供了具体的排查与解决方法。

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

一 、前言
      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的时候,会带来性能下降。 

三 、相关阅读及参考
1、max_allowed_packet 官方介绍
2、Percona MySQL的特性 max_binlog_files   
3、sync_binlog innodb_flush_log_at_trx_commit 浅析  

### 回答1: 这是一个 MySQL 错误,表示在从二进制日志中读取数据时出现了严重错误 1236,原因是找不到二进制日志索引文件中的第一个日志文件名。建议检查日志文件和索引是否存在以及是否有读取权限,如果有必要可以尝试重建日志文件和索引。 ### 回答2: MySQL数据库出现“got fatal error 1236 from master when reading data from binary log: 'could not find first log file name in binary log index file'”这个错误,一般是由于MySQL的主从复制机制出了问题而引起的。 这个错误通常出现在MySQL主从复制过程中,因为主库的binary log文件找不到导致从库无法继续进行复制操作,从而导致复制过程被中断。 造成这种错误的原因很多,在MySQL主从复制的过程中,可能会由于网络问题、磁盘故障、权限设置不当等多种原因导致需要复制的binary log文件丢失或者找不到,从而引起这个问题的出现。 对于这个错误,可以尝试以下几种常见的解决方法: 1. 查找丢失的binary log文件和索引文件,将其复制到从库中对应的位置。 2. 检查从库的权限和配置是否正确,确保从库可以读取主库的binary log。 3. 确保MySQL版本在主从库之间一致。 4. 尝试重新启动MySQL服务,并检查MySQL日志文件是否有其他错误信息。 总的来说,出现这个错误需要仔细排查问题,找到出现问题的原因并及时解决。只有在解决了这个问题之后,才能恢复MySQL主从复制的正常运行,保证数据的正确性。 ### 回答3: 这个错误提示表明在从二进制日志中读取数据时,主服务器出现了致命错误1236,并且无法在二进制日志索引文件中找到第一个日志文件的名称。可能的原因是二进制日志索引文件已损坏或被删除,或者日志文件已被清除导致不匹配。 解决此问题的方法是: 1.检查二进制日志索引文件 运行“show binary logs”命令,查看二进制日志文件的名称和位置。查看索引文件是否存在,如果不存在,则尝试恢复或重新创建该文件。如果该文件存在,但因某些原因包含不正确或损坏的数据,则可能需要手动编辑它来更新正确的文件名称和位置。 2.查找缺失的日志文件 如果主服务器无法找到第一个日志文件的名称,则可能是因为该文件已被删除或移动。在主数据库的日志目录中检查缺失的日志文件,如果找到,请将它们移回原始位置。如果日志文件已经丢失,则可能需要从备份中恢复丢失的数据。 3.重启主服务器 有时,重启主服务器可以清除潜在的错误状态,从而解决此问题。在重启前,建议停止从服务器上的复制进程,并确保所有活动连接都已关闭。 总之,当出现“从主服务器读取二进制日志时发生致命错误1236”的错误时,您需要检查二进制日志索引文件和缺失的日志文件,并尝试修复或恢复它们,或者从备份中恢复缺失的数据。如果问题仍然存在,请重启主服务器并查看错误日志以获取更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值