MySQL主從 常見的錯誤及解決方案


一、錯誤日志解析:

(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檢查數據一致性。

 

檢查完后可以在從庫執行這條語句查看有無數據不一致表:

 

 

 

針對核心表,可以定制自動數據校驗腳本,每周進行數據校驗,但必須要在業務低谷進行校驗哦!

 ————————————————————

推薦閱讀:

【干貨】Linux監控 sar命令解析

【干貨】Linux Shell常用經典腳本收藏

教你分分鍾搞定Python之Flask框架

網頁加載性能調優


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM