生產環境 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 重複執行 → 主鍵衝突。
mysql-bin.000274 pos 504869752SHOW BINLOG EVENTS IN 'mysql-bin.000274' FROM 504869752 LIMIT 20;
504873114STOP 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 跳過,除非確認該筆資料已同步且業務允許CHANGE MASTER TO MASTER_AUTO_POSITION=1 更簡單