mysql數據庫集羣出現1236錯誤致使主庫與從庫沒法同步的問題解析

/etc/my.cnf中sync_binlog參數設置累積多少個事務數後落盤數據庫

 

說明:ide

1.     數據存到數據庫和binlog落盤是同時進行的spa

2.     數據是先存在內存中,達到設置的事務數後才落盤的日誌

3.     從庫讀的是主庫的內存中的數據,並不是落盤的數據blog

4.     寫入數據時,只要主庫存活,就寫入到主庫事務

 

image.png

過程狀態記錄:內存

 前提:50個事務一落盤同步

1.     未斷電前:主庫內存中正在從50進行到60,從庫讀取主庫內存中到58並存入從庫it

2.     斷電:主庫中50-60的數據存在於內存中,binlog沒法落盤,數據沒有保存到數據庫文件。開始寫數據到從庫中,數據進行到61,以後數據逐漸寫入從庫class

3.     主庫重啓:主庫上的50-60的binlog丟失,數據丟失,數據開始寫入主庫,binlog記錄從50開始。從庫從主庫內存中讀數據,讀到50時,從庫發現本身已經接收過50的數據,就再也不接收,就不進行同步了。此時狀態爲:只寫數據到主庫,從庫不一樣步。

4.     最終結果:從庫中的數據爲1-58,61-…,缺乏的是58-60的,主庫中的數據是1-49,…-…,

 

 

完整過程描述:

50個事務後落盤,主庫正在寫數據,此時斷電,內存中寫到60,從庫從主庫內存中讀到58,從庫讀取到58後產生數據到從庫上,主庫因爲未到50個事務,不會存盤。致使50-60之間的事務,未能生成binlog日誌到盤上,同時數據也未寫入到數據庫文件上,致使58-60的數據既不在主庫上也不在從庫上,丟失。主庫重啓後,因爲盤上記錄的數據是到49,於是從50開始記錄,此時從庫再從主庫上讀的時候發現本身已經有50了,這樣就產生衝突,就沒法繼續讀取主庫的數據了。

 

現象:同步損壞,主庫重啓後,再寫數據,只到主庫

相關文章
相關標籤/搜索