一、錯誤日誌解析: (1) 【ERROR】1452:無法在外鍵的表插入參考主鍵沒有的數據 1452:無法在外鍵的表插入或更新參考主鍵沒有的數據。由於item_discovery.itemid欄位(外鍵)參考了items.itemid欄位(主鍵),當要在item_discovery表插數據時,如果it ...
一、錯誤日誌解析:
(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檢查數據一致性。
檢查完後可以在從庫執行這條語句查看有無數據不一致表:
針對核心表,可以定製自動數據校驗腳本,每周進行數據校驗,但必須要在業務低谷進行校驗哦!
————————————————————
推薦閱讀: