主從同步,常見故障!
1、在master上删除一條記錄,在slave上找不到。
Last_SQL_Error.Could not execute Delete_rows event on table ….Error_code:1032……
2、主鍵沖突,在slave已經有該記錄, 又在master上插入了同一條記錄
Last_SQL_Error.Could not execute Write_rows event on table…… Error_Code :1062……
3、在master上更新一條記錄,在slave上找不到資料
Last_SQL_Error.Could not execute Update_rows event …… Error_Code: 1032……
以上三種情況在HA切換過程中,由于異步複制且sync_binlog=0 時,會造成小部分binlog 沒接受完而導緻報錯。
4、slave中繼日志損壞
Last_SQL_Error:Error initializing relay log postion: I/O error reading the header from the binary log
Last_SQL_Error:Error initializing relay log positon:Binlog has bad magic number:it’s not a binary log file that can be used by this version of MySQL.
Slave 當機或非法關機,電源故障、硬體故障,造成中繼日志損壞。
解決方法:
對于第一種情況: master要删除一條記錄,而slave上找不到相應記錄而報錯。Master上已經删除,slave 并沒有改記錄,可以直接跳過:
Stop slave ; set global sql_slave_skip_counter=1;start slave;
對于監控的情況: 出現情況報警,如何控制呢? 調用腳本?
對于第二種情況的處理:對于重複的記錄,需要删除重複的鍵值。!
第三種情況: master更新的記錄,在slave上找不到。通過 Mysqlbinlog 分析出真實的語句,将slave缺少的記錄進行手動填充。!
第四種:找到salve 同步執行到master的位置。重新做同步。
查找變量:
Relay_Master_Log_File:
Exec_Master_Log_Pos:
從這兩個位置重新同步。
如果業務允許的話,可以設定下面兩個變量:
slave-skip-errors=1022,1032,1062 (必須在 my.cnf中進行設定,隻讀的系統變量)
(1022 :Message: Can't write; duplicate key in table '%s')
(1032: Message: Can't find record in '%s')
(1062: Message: Duplicate entry '%s' for key %d)
slave_exec_mode (可在全部變量中進行設定)
可選項為STRICT(預設)和IDEMPOTENT 模式, STRICT遇到任何問題,都會導緻複制的停止。
IDEMPOTENT 對于 duplicate key 和 no-key-found錯誤跳過。
注:以上兩個參數的設定,如果出現跳過的情況,則會在錯誤日志中進行記錄。(如何把出現問題的時候 出現的監控中呢? 問題一!)
錯誤我們可以解決,那主從資料的一緻性我們該如何驗證呢?可以參考這邊文章:
<a href="http://weipengfei.blog.51cto.com/1511707/976545">http://weipengfei.blog.51cto.com/1511707/976545</a>
在出現主從資料不一緻的情況,如何修複呢?
本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1068258,如需轉載請自行聯系原作者