1. 程式人生 > >MySQL主從 常見的錯誤及解決方案

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

數據對比 線程 redirect 創建 主鍵 不一致 執行 如果 避免

技術分享圖片

一、錯誤日誌解析:

(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框架

網頁加載性能調優

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