一、錯誤日志解析:
(1) 【ERROR】1452:無法在外鍵的表插入參考主鍵沒有的數據
1452:無法在外鍵的表插入或更新參考主鍵沒有的數據。由於item_discovery.itemid字段(外鍵)參考了items.itemid字段(主鍵),當要在item_discovery表插數據時,如果items表的主鍵沒有對應的數據,則無法插入,報1452錯誤。此時可以檢查參考的表的主鍵是否有主庫對應的數據,如果有,則插入參考的表相應的數據,再開啟復制恢復SQL線程。
(2) 【ERROR】1032:刪除或更新數據,從庫找不到記錄
1032:刪除或更新從庫的數據,從庫找不到記錄。此時,主庫的數據是比從庫新的,可以采取從庫添加相同的數據在開啟復制恢復SQL線程。
(3) 【ERROR】1062:從庫插入數據,發生唯一性沖突
1062:從庫插入數據,發生唯一性沖突。此時從庫已經有相同主鍵的數據,如果再插入相同主鍵值的數據則會報錯。可以查看主庫的改行數據與從庫的要插入數據是否一致,如一致則跳過錯誤,恢復SQL線程,如不一致,則以主庫為准,將從庫的該行記錄刪除,再開啟復制。
如果當前高可用架構為Master-Master,則以下均在從庫的操作都必須set sql_log_bin=0,避免從庫執行的語句同步到主庫(恢復時以主庫的數據為准)。
二、怎么解決問題:
1.臨時解決方案(業務運行期間不適宜使用數據對比和修復工具)
【ERROR】1452:
普通主從復制環境
從庫:
主庫:
查看主庫在出錯的相應位置的執行語句,可通過SQL得出當時insert或者update的對應的主鍵值。
查詢item_discovery的外鍵約束c_item_discovery_1參考的表items對應主鍵值的數據行。
從庫:
在items表插入主庫查詢出來的數據。
基於GTID復制環境
與普通主從復制環境處理方式相同。
【ERROR】1032:
發生1032可能是delete或者update時從庫沒有對應數據行,可以分兩種情況處理:
(1)如果是Could not execute Delete_rows,則可以直接跳過錯誤
普通主從復制環境
從庫:
基於GTID復制環境
從庫:
找出復制出錯時的executed_Gtid_Set,若出現多個,則選擇跟Master_uuid相同的那一條。
(2)如果是Could not execute Update_rows,則需要在二進制日志找出出錯位置的SQL,再找出該表在主庫的對應的數據行,然后直接在從庫插入這條數據,開啟SQL線程恢復。
普通主從復制環境
從庫:
主庫:
查看主庫在出錯的相應位置的執行語句,可通過SQL得出當時update的對應的主鍵值。
查詢item_discovery的對應主鍵值的數據行。
從庫:
在items表插入主庫查詢出來的數據。
基於GTID復制環境
與普通主從復制環境處理方式相同。
【ERROR】1062:
普通主從復制環境
從庫:
主庫:
查看主庫在出錯的相應位置的執行語句,可通過SQL得出當時insert的對應的主鍵值。
查詢trends_uint表對應主鍵值的數據行。
從庫:
在trends_uint表刪除主庫查詢出來的數據。
基於GTID復制環境
與普通主從復制環境處理方式相同。
2.徹底解決方案
使用pt-table-checksum和pt-table-sync徹底修復數據不一致。
注意:使用pt工具包首先要安裝pt工具包和安裝perl模塊。
(1) 從庫停止復制
(2) 在主庫創建校驗信息表
(3) 在主庫用pt-table-checksum校驗主從數據一致性
在從庫執行以下語句,查看Last_Error,發現數據不一致的表:
然后返回操作系統執行以下命令:
該命令可以查看該表是否發生數據不一致情況,若有,則使用pt-table-sync修復。
(4) 在主庫用pt-table-sync打印出修復不一致數據的SQL(如果有外鍵約束,修復數據應先從外鍵參考的字段所屬表開始修復),后將修復語句在從庫執行。
三、優化建議
在復制由於1045、1032、1062的原因中斷后,應使用三.1的臨時解決方案,恢復復制后再在業務低谷使用pt-check-sum檢查數據一致性。
檢查完后可以在從庫執行這條語句查看有無數據不一致表:
針對核心表,可以定制自動數據校驗腳本,每周進行數據校驗,但必須要在業務低谷進行校驗哦!
————————————————————
推薦閱讀: