首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Slave 同步錯誤 Duplicate Entry 解決實戰:Binlog 位點手動校正、GTID 模式對比與監控建議

     編輯:MySQL 綜合教學

MySQL Slave 同步錯誤 Duplicate Entry 解決實戰(增訂版)

補充 GTID 模式下的簡化恢復、監控指標體系、自動化修復腳本思路,幫助團隊建立完整的主從運維體系。

錯誤現象回顧

SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_SQL_Error: Duplicate entry '1169595' for key 'PRIMARY'
Last_Errno: 1062

傳統模式手動校正流程(回顧)

  1. SHOW BINLOG EVENTS IN 'mysql-bin.000274' FROM 504869752 LIMIT 50;
  2. 在 Slave 逐條比對 SQL 是否已執行
  3. 定位首條未執行位點 504873114
  4. STOP SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.0000274', MASTER_LOG_POS=504873114; START SLAVE;

GTID 模式簡化恢復 (MySQL 5.6+)

若啟用 gtid_mode=ON,無需手動找位點:

# 1. 確認已執行事務集合
SHOW MASTER STATUS;  -- Executed_Gtid_Set

# 2. Slave 重新從 Master 同步 (自動定位)
STOP SLAVE;
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
START SLAVE;

# 3. 或跳過單一錯誤事務
STOP SLAVE;
SET GTID_NEXT='aaaa-bbbb-cccc:12345';  -- 錯誤事務 GTID
BEGIN; COMMIT;  -- 空事務佔位
SET GTID_NEXT='AUTOMATIC';
START SLAVE;

監控指標體系(建議接入 Prometheus/Grafana)

指標正常值告警閾值說明
Slave_IO_RunningYesNoIO 線程狀態
Slave_SQL_RunningYesNoSQL 線程狀態
Seconds_Behind_Master0-10> 300延遲秒數
Relay_Log_Space穩定持續增長Relay Log 堆積
Last_Errno0!= 0最近錯誤碼
Executed_Gtid_Set 差集空非空GTID 模式下缺失事務

自動化修復腳本思路

#!/bin/bash
# fix_slave_duplicate.sh
# 僅供參考,生產環境需嚴格測試

ERR=$(mysql -e "SHOW SLAVE STATUS\G" | grep Last_Errno | awk '{print $2}')
if [ "$ERR" = "1062" ]; then
    # 1. 取得錯誤事務 GTID (需 GTID 模式)
    GTID=$(mysql -e "SHOW SLAVE STATUS\G" | grep Retrieved_Gtid_Set | awk '{print $2}')
    # 2. 空事務佔位跳過
    mysql -e "STOP SLAVE; SET GTID_NEXT='$GTID'; BEGIN; COMMIT; SET GTID_NEXT='AUTOMATIC'; START SLAVE;"
    # 3. 通知
    echo "Slave 1062 錯誤已嘗試自動跳過,請人工複核資料一致性" | mail -s "MySQL Slave Auto-Fix" dba@company.com
fi

根因分類與預防矩陣

根因檢測手段預防措施恢復難度
非正常關閉導致位點滯後錯誤日誌、Seconds_Behind_Master 飆升重啟前 STOP SLAVE、正常 shutdown、GTID 模式低 (手動校正位點)
DDL 未同步執行Schema diff 工具線上 DDL 工具、變更流程管控中 (需補 DDL)
非冪等重複執行Binlog 事件分析業務冪等設計、主鍵衝突處理邏輯低 (跳過/校正)
網路分區導致 Binlog 丟失Master Binlog 完整性檢查雙 Master/半同步、跨可用區部署高 (需重做 Slave)

運維檢查清單

  • [ ] 啟用 GTID 模式 (gtid_mode=ON, enforce_gtid_consistency=ON)
  • [ ] 部署監控告警 (Seconds_Behind_Master > 5min 觸發)
  • [ ] 定期演練 Slave 重建 (每季至少一次)
  • [ ] 保留 Binlog 至少 7 天 (expire_logs_days=7)
  • [ ] 文檔化恢復流程,含手動校正、GTID 跳過、完整重做三種方案
  • [ ] 核心業務表建立資料校驗任務 (定期 checksum 對比)

總結

Duplicate Entry 是主從同步最常見錯誤,核心在於位點管理與冪等性。GTID 模式大幅簡化恢復,監控體系讓問題早發現,演練流程讓團隊不慌亂。建議所有生產環境遷移至 GTID 模式並建立自動化運維體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved