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

MySQL Slave 同步錯誤 Duplicate Entry 解決實戰:Binlog 位點手動校正與避坑指南

     編輯:MySQL 綜合教學

MySQL Slave 同步錯誤 Duplicate Entry 解決實戰

生產環境 Master-Slave 架構中,Slave SQL Thread 因 Duplicate entry '1169595' for key 'PRIMARY' 停止,導致報表資料滯後 20 天。本文記錄從錯誤發現、錯誤日誌分析、Binlog 位點手動校正到恢復同步的完整排查過程。

現象與初步診斷

SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_SQL_Error: Error 'Duplicate entry ...' on query 'INSERT INTO user ...'

IO 正常,SQL 停止 → Relay Log 已收到,但執行失敗。

錯誤日誌分析

151028 01:28:55 mysqld: Normal shutdown
151028 01:29:00 mysqld: Starting... Recovery...
151028 01:29:16 IO error
151028 01:30:19 SQL error, Slave SQL thread aborted

非正常關閉 → 重啟恢復 → 位點記錄滯後 → 部份 Binlog 重複執行 → 主鍵衝突。

手動校正位點流程

  1. 確認錯誤位點:錯誤日誌給出 mysql-bin.000274 pos 504869752
  2. 檢視 Binlog 事件:
    SHOW BINLOG EVENTS IN 'mysql-bin.000274' FROM 504869752 LIMIT 20;
    
  3. 在 Slave 逐條比對:取 Binlog 中的 SQL,到 Slave 對應表查是否已存在
  4. 定位首條未執行 SQL 的位點:假設為 504873114
  5. 重設 Master 位點並啟動:
    STOP SLAVE;
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000274', MASTER_LOG_POS=504873114;
    START SLAVE;
    SHOW SLAVE STATUS\G
    # Slave_SQL_Running: Yes → 恢復成功
    

核心指令速查

# 檢視 Binlog 事件
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] count];

# 手動跳過單條錯誤(不推薦,可能導致資料不一致)
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

# 完整重做(若位點難以確定)
# 1. Master 重新備份
# 2. Slave 還原備份
# 3. CHANGE MASTER TO ... 新位點
# 4. START SLAVE

根因與預防

根因預防措施
MySQL 非正常關閉,位點未及時刷盤機器重啟前手動 STOP SLAVE,正常關閉 MySQL
無監控告警,錯誤持續 20 天未發現部署 Slave 狀態監控(Slave_SQL_Running、Seconds_Behind_Master)
單點故障,報表庫與業務庫同機架構分離,跨機房部署 Slave

避坑提醒

  • 切勿直接 SET GLOBAL sql_slave_skip_counter 跳過,除非確認該筆資料已同步且業務允許
  • GTID 模式下用 CHANGE MASTER TO MASTER_AUTO_POSITION=1 更簡單
  • 定期演練 Slave 重建流程,確保 RTO 可控
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved