天天看點

常見的error 1236 報錯

一, 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.000042' at 203688051, the last event was read from '/data/3309/mysql-bin.000042      

【原因】

此類報錯和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 的配置, 進而減少由于上面的問題導緻主從複制中斷。

二, 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。

三,主庫空間問題,日志被截斷

\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.000042' at 203693686, the last event was read from '/data/3309/mysql-bin.000042        

【原因】

該錯誤和主庫的空間問題和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.000043', master_log_pos=4;
\3. start slave;      

四,主庫異常斷電,從庫讀取錯誤的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.000042', position 203696075      
  1). stop slave;
  2). change master to master_log_file='mysql-bin.000043', master_log_pos=4;
  3). start slave;      

繼續閱讀