mysql主從異常分析

mysql 主從錯誤情況

1,master 上刪除一條記錄是從庫報錯 找不到該記錄

引起原因:master出現宕機或者從庫已經刪除。

解決方案:stop slave;set global sql_slave_skip_counter=1;start slave;

2,主鍵衝突

引起原因:master宕機或者從庫宕機

解決方案:刪除此主鍵,重新start slave;

3,update 時候slave上找不到次數據

引起原因:master宕機或者從庫做了刪除操作

解決方案:master上扎到次數據插入到從庫

4,slave 中繼日誌損壞

引起原因:slave 宕機

解決方案:找到同步的位置,重置從庫複製點

5,slave上同步位置大於主庫現在位置

引起原因:主庫宕機

解決方案:直接重置從庫複製點到新的binlog裏的新節點

6,binlog_ignore_db引起同步複製故障

  解決方案:replicate_ignore_db代替


爲什麼主庫宕機會引起主從不一致?

事務的提交過程:

存儲引擎實現事務的通用方式是基於 redo log 和 undo log。

簡單來說,redo log 記錄事務修改後的數據, undo log 記錄事務前的原始數據。

所以當一個事務執行時實際發生過程簡化描述如下:

1.先記錄 undo/redo log,確保日誌刷到磁盤上持久存儲。

2.更新數據記錄,緩存操作並異步刷盤。

3.提交事務,在 redo log 中寫入 commit 記錄。


MySQL 執行事務過程中如果因故障中斷,可以通過 redo log 來重做事務或通過 undo log 來回滾,確保了數據的一致性。

這些都是由事務性存儲引擎來完成的(innodb_flush_log_at_tx_commit),

但 binlog 不在事務存儲引擎範圍內,而是由 MySQL Server 來記錄的(sync_binlog)。

那麼就必須保證 binlog 數據和 redo log 之間的一致性,所以開啓了 binlog 後實際的事務執行就多了一步,如下:

1.先記錄 undo/redo log,確保日誌刷到磁盤上持久存儲。

2.更新數據記錄,緩存操作並異步刷盤。

3.將事務日誌持久化到 binlog。

4.提交事務,在 redo log 中寫入commit記錄。

這樣的話,只要 binlog 沒寫成功,整個事務是需要回滾的,而 binlog 寫成功後即使 MySQL Crash 了都可以恢復事務並完成提交。

要做到這點,就需要把 binlog 和事務關聯起來,而只有保證了 binlog 和事務數據的一致性,才能保證主從數據的一致性。

所以 binlog 的寫入過程不得不嵌入到純粹的事務存儲引擎執行過程中,並以內部分佈式事務(xa 事務)的方式完成兩階段提交。

 情況一:

  mysql事務提交先刷新到binlog,然後刷新到redo log。當刷新到binlog後宕機,mysql下次啓動時,由於redo log裏沒有該事務記錄就回滾,

 但二進制日誌已經記錄該事務信息,不會回滾,所以slave會和主庫不一樣。

 XA事務可以保證 innodb redo log 和binlog一致性。innodb_support_xa=1解決此種情況,但影響性能

 

 情況二:

 當sync_binlog=0的情況,很容易出現主從異常

 sync_binlog=0,當事務提交之後,MySQL不做fsync之類的磁盤同步指令刷新binlog_cache中的信息到磁盤

等待系統決定什麼時候刷新,或者cache滿了之後同步到磁盤

 sync_binlog=n,當每進行n次事務提交之後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。

 當 sync_binlog=0的時候,一旦系統Crash,在binlog_cache中的所有binlog信息都會被丟失,即master binlog 文件的 flush log buffer 中的數據未刷新到磁盤。

 但Slave IO 線程在讀取master dump 線程的位置,一般是直接讀取log buffer的,這個位置,可能遠遠大於binlog文件實際大小。

 也就是當master出現宕機的時候,slave IO線程也許已經把master binlog buffer中的數據已經讀到slave中繼日誌並在slave上執行,導致主庫和從庫出現不一樣現象。

 sync_binlog=1可以解決這種情況,但影響性能

 

如何幹淨清除slave同步信息??

 reset slave 會刪除master.info和relay-log.info文件,但是不清除同步信息

 reset slave all 可以清除所有同步信息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章