線上從庫報錯 Last_Errno: 1062、Last_Error: Duplicate entry ... for key 'PRIMARY',SQL 執行緒停止。本文記錄一次完整的排查過程:從錯誤現場到 Binlog 對比、從 Relay Log 到主庫驗證,最終採用跳過錯誤恢復同步,並分析根因與預防措施。
SHOW SLAVE STATUS\G
# 關鍵輸出
Slave_SQL_Running: No
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '250.1.1-rding-changelogs/myIDENTITY/250/xxxx.xml' for key 'PRIMARY''
on query: INSERT INTO `DATABASECHANGELOG` ...
表結構顯示主鍵為 PRIMARY KEY (ID, AUTHOR, FILENAME),複合主鍵設計非標準單一自增 ID。
SELECT * FROM DATABASECHANGELOG WHERE AUTHOR='rding';
# 返回兩條記錄,包含衝突的 250.1.1
解析 Relay_Master_Log_File: mysql-bin.000152,僅發現 一條 插入 250.1.1 的 INSERT 語句。
解析 Relay_Log_File: mysql-relay-bin.000455,同樣只有 一條 對應 INSERT。
| 節點 | DATEEXECUTED |
|---|---|
| 從庫 | 2013-08-12 20:41:22 |
| 主庫 | 2013-08-12 19:54:29 |
從庫寫入時間比主庫晚約 47 分鐘,說明該記錄在從庫 已經存在,且非由當前 Binlog 事件產生。
解析從庫近期 5 個 Binlog (mysql-bin.004268~004272),均無 針對該記錄的 INSERT 操作。第 4 個 Binlog 解析報錯 ERROR: Error in Log_event::read_log_event(): 'read error', data_len: 438, event_type: 2(後續單獨分析)。
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
SHOW SLAVE STATUS\G
# Slave_SQL_Running: Yes, Seconds_Behind_Master: 3434734 (大量延遲需追趕)
跳過錯誤後同步恢復,但需關注追趕進度與資料一致性。
INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 實現冪等寫入。核心教訓:資料層面的 SQL 萬萬不能輕易動,應從應用源頭解決重複提交問題。