從庫因主鍵衝突停止同步,如何快速恢復一致性?本文對比三種方案,詳細講解 SQL_SLAVE_SKIP_COUNTER 跳過事務、Binlog 事件定位、長 SQL 診斷與 STOP SLAVE 卡死處理。
SHOW SLAVE STATUS\G 顯示 Slave_SQL_Running: NoDuplicate entry 'xxx' for key 'PRIMARY'(主鍵衝突)| 策略 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 1. 重新同步(備份主庫恢復) | 數據極不一致、測試環境 | 徹底乾淨 | 需鎖表、耗時長、業務中斷 |
| 2. 重置 Slave 位點到主庫最新 | 不關心歷史不一致、測試環境 | 簡單快速 | 數據實際不一致,業務風險 |
| 3. 跳過報錯事務 | 明確知曉衝突原因、生產環境 | 無停機、精準修復 | 需確認跳過內容安全 |
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;
建議:循環執行並觀察 SHOW SLAVE STATUS 中的 Last_SQL_Error,確認每個跳過的事務內容。
Relay_Master_Log_File、Exec_Master_Log_PosSHOW BINLOG EVENTS IN 'mysql-bin.000217' FROM 673146776 LIMIT 20;mysqlbinlog:mysqlbinlog mysql-bin.000217 --start-position=673146776SQL_SLAVE_SKIP_COUNTER = N
同步啟動後 Seconds_Behind_Master 緩慢上升,SHOW PROCESSLIST 見 State: Sending data。
開啟 Profiling 定位:
SET profiling=1; -- 等待問題 SQL 執行 SHOW PROFILES; SHOW PROFILE FOR QUERY;
確認耗時在 Sending data 階段,通常因大量磁盤隨機讀。

mysqld_safe --user=mysql)。Slave failed to initialize relay log info。重啟從庫多試幾次,或檢查 relay_log_info_repository=TABLE 衝突。Seconds_Behind_Master、Slave_*_Running、Last_SQL_Errorbinlog_format=ROW 減少非確定性函數導致的不一致pt-table-checksum + pt-table-sync