【MySQL】Got fatal error 1236原因和解决方法
生活随笔
收集整理的這篇文章主要介紹了
【MySQL】Got fatal error 1236原因和解决方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一 前言
? MySQL 的主從復(fù)制作為一項高可用特性,用于將主庫的數(shù)據(jù)同步到從庫,在維護主從復(fù)制數(shù)據(jù)庫集群的時候,作為專職的MySQL DBA,筆者相信大多數(shù)人都會遇到“Got fatal error 1236 from master when reading data from binary log” 這類的報錯/報警。本文整理了常見的幾種 error 1236 報錯,并給出相應(yīng)的解決方法,有所不足之處,當(dāng)然也希望各位讀者朋友指正。
【原因】
? ?此類報錯和max_allowed_packet相關(guān)。首先max_allowed_packet控制著主從復(fù)制過程中,一個語句產(chǎn)生的二進制binlog event大小,它的值必須是1024的倍數(shù) 。出現(xiàn)此類錯誤的常見原因是
?1 該參數(shù)在主備庫的配置大小不一樣,主庫的配置值大于從庫的配置值。 從主庫傳遞到備庫的binlog event大小超過了主庫或者備庫的max_allowed_packet大小。
?2 主庫有大量數(shù)據(jù)寫入時,比如在主庫上執(zhí)行?laod data,insert into .... select 語句,產(chǎn)生大事務(wù)。
當(dāng)主庫向從庫傳遞一個比從庫的max_allowed_packet 大的packet ,從庫接收該packet失敗,并報 “l(fā)og event entry exceeded max_allowed_packet“。
【如何解決】
?需要確保主備配置一樣,然后嘗試調(diào)大該參數(shù)的值。
另外,5.6 版本中的 slave_max_allowed_packet_size 參數(shù)控制slave 可以接收的最大的packet 大小,該值通常大于而且可以覆蓋 max_allowed_packet 的配置, 進而減少由于上面的問題導(dǎo)致主從復(fù)制中斷。
2.2 slave 在主庫找不到binlog文件?
【原因】
?該錯誤發(fā)生在從庫的io進程從主庫拉取日志時,發(fā)現(xiàn)主庫的mysql_bin.index文件中第一個文件不存在。出現(xiàn)此類報錯可能是由于你的slave 由于某種原因停止了好長一段是時間,當(dāng)你重啟slave 復(fù)制的時候,在主庫上找不到相應(yīng)的binlog ,會報此類錯誤?;蛘呤怯捎谀承┰O(shè)置主庫上的binlog被刪除了,導(dǎo)致從庫獲取不到對應(yīng)的binglog file。
【如何解決】
?1 為了避免數(shù)據(jù)丟失,需要重新搭建slave 。
?2 注意主庫binlog的清理策略,選擇基于時間過期的刪除方式還是基于空間利用率的刪除方式。
? 不要使用rm -fr 命令刪除binlog file,這樣不會同步修改mysql_bin.index 記錄的binlog 條目。在刪除binlog的時候確保主庫保留了從庫 show slave status 的Relay_Master_Log_File對應(yīng)的binlog file。
2.3 主庫空間問題,日志被截斷
【原因】
?該錯誤和主庫的空間問題和sync_binlog配置有關(guān),當(dāng)主庫 sync_binlog=N不等于1且磁盤空間滿時,MySQL每寫N次binary log,系統(tǒng)才會同步到磁盤,但是由于存儲日志的磁盤空間滿而導(dǎo)致MySQL 沒有將日志完全寫入磁盤,binlog event被截斷。slave 讀取該binlog file時就會報錯"binlog truncated in the middle of event;"
?當(dāng)sync_binlog 的默認(rèn)值是0,像操作系統(tǒng)刷其他文件的機制一樣,MySQL不會同步到磁盤中去而是依賴操作系統(tǒng)來刷新binary log。
?當(dāng)sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日志binary log時,會使用fdatasync()函數(shù)將它的寫二進制日志binary log同步到磁盤中去。
【如何解決】
?在從庫重新指向到主庫下一個可用的binlog file 并且從binlog file初始化的位置開始
2.4 主庫異常斷電,從庫讀取錯誤的position
【原因】
?該問題也是和sync_binlog=N不等于1有關(guān),多出現(xiàn)在主機異常crash ,比如磁盤損壞,raid 卡損壞,或者主機異常掉電導(dǎo)致binlog 未及時同步到磁盤。從庫讀取了主庫binlog file中的不存在的binlog position ,一般比binlogfile 的end position 的值還要大。
【如何解決】
1 在從庫重新指向到主庫下一個可用的binlog file 并且從binlog file初始化的位置開始
2 主備庫設(shè)置 sync_binlog=1,但是設(shè)置為1的時候,會帶來性能下降。?
? MySQL 的主從復(fù)制作為一項高可用特性,用于將主庫的數(shù)據(jù)同步到從庫,在維護主從復(fù)制數(shù)據(jù)庫集群的時候,作為專職的MySQL DBA,筆者相信大多數(shù)人都會遇到“Got fatal error 1236 from master when reading data from binary log” 這類的報錯/報警。本文整理了常見的幾種 error 1236 報錯,并給出相應(yīng)的解決方法,有所不足之處,當(dāng)然也希望各位讀者朋友指正。
二 常見的error 1236 報錯
2.1 logevent超過max_allowed_packet 大小
【原因】
? ?此類報錯和max_allowed_packet相關(guān)。首先max_allowed_packet控制著主從復(fù)制過程中,一個語句產(chǎn)生的二進制binlog event大小,它的值必須是1024的倍數(shù) 。出現(xiàn)此類錯誤的常見原因是
?1 該參數(shù)在主備庫的配置大小不一樣,主庫的配置值大于從庫的配置值。 從主庫傳遞到備庫的binlog event大小超過了主庫或者備庫的max_allowed_packet大小。
?2 主庫有大量數(shù)據(jù)寫入時,比如在主庫上執(zhí)行?laod data,insert into .... select 語句,產(chǎn)生大事務(wù)。
當(dāng)主庫向從庫傳遞一個比從庫的max_allowed_packet 大的packet ,從庫接收該packet失敗,并報 “l(fā)og event entry exceeded max_allowed_packet“。
【如何解決】
?需要確保主備配置一樣,然后嘗試調(diào)大該參數(shù)的值。
另外,5.6 版本中的 slave_max_allowed_packet_size 參數(shù)控制slave 可以接收的最大的packet 大小,該值通常大于而且可以覆蓋 max_allowed_packet 的配置, 進而減少由于上面的問題導(dǎo)致主從復(fù)制中斷。
2.2 slave 在主庫找不到binlog文件?
【原因】
?該錯誤發(fā)生在從庫的io進程從主庫拉取日志時,發(fā)現(xiàn)主庫的mysql_bin.index文件中第一個文件不存在。出現(xiàn)此類報錯可能是由于你的slave 由于某種原因停止了好長一段是時間,當(dāng)你重啟slave 復(fù)制的時候,在主庫上找不到相應(yīng)的binlog ,會報此類錯誤?;蛘呤怯捎谀承┰O(shè)置主庫上的binlog被刪除了,導(dǎo)致從庫獲取不到對應(yīng)的binglog file。
【如何解決】
?1 為了避免數(shù)據(jù)丟失,需要重新搭建slave 。
?2 注意主庫binlog的清理策略,選擇基于時間過期的刪除方式還是基于空間利用率的刪除方式。
? 不要使用rm -fr 命令刪除binlog file,這樣不會同步修改mysql_bin.index 記錄的binlog 條目。在刪除binlog的時候確保主庫保留了從庫 show slave status 的Relay_Master_Log_File對應(yīng)的binlog file。
2.3 主庫空間問題,日志被截斷
【原因】
?該錯誤和主庫的空間問題和sync_binlog配置有關(guān),當(dāng)主庫 sync_binlog=N不等于1且磁盤空間滿時,MySQL每寫N次binary log,系統(tǒng)才會同步到磁盤,但是由于存儲日志的磁盤空間滿而導(dǎo)致MySQL 沒有將日志完全寫入磁盤,binlog event被截斷。slave 讀取該binlog file時就會報錯"binlog truncated in the middle of event;"
?當(dāng)sync_binlog 的默認(rèn)值是0,像操作系統(tǒng)刷其他文件的機制一樣,MySQL不會同步到磁盤中去而是依賴操作系統(tǒng)來刷新binary log。
?當(dāng)sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日志binary log時,會使用fdatasync()函數(shù)將它的寫二進制日志binary log同步到磁盤中去。
【如何解決】
?在從庫重新指向到主庫下一個可用的binlog file 并且從binlog file初始化的位置開始
2.4 主庫異常斷電,從庫讀取錯誤的position
【原因】
?該問題也是和sync_binlog=N不等于1有關(guān),多出現(xiàn)在主機異常crash ,比如磁盤損壞,raid 卡損壞,或者主機異常掉電導(dǎo)致binlog 未及時同步到磁盤。從庫讀取了主庫binlog file中的不存在的binlog position ,一般比binlogfile 的end position 的值還要大。
【如何解決】
1 在從庫重新指向到主庫下一個可用的binlog file 并且從binlog file初始化的位置開始
2 主備庫設(shè)置 sync_binlog=1,但是設(shè)置為1的時候,會帶來性能下降。?
總結(jié)
以上是生活随笔為你收集整理的【MySQL】Got fatal error 1236原因和解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: swift水波效果
- 下一篇: 【案例】常驻查询引发的thread po