mysql> SHOW SLAVE STATUS\G ... Last_SQL_Error: Could not execute Write_rows event on table xxx; Duplicate entry '123' for key 'PRIMARY' Slave_SQL_Running: No
| 策略 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 1. 重新搭建從庫 | 數據量小、容忍停機、要求絕對一致 | 徹底乾淨 | 耗時長、需鎖主庫/停寫入 |
| 2. 從備份恢復 + Binlog 重放 | 數據量大、有冷備份、Binlog 全量 | 不鎖主庫、可控 | 操作步驟多、需精確時間點 |
| 3. 跳過錯誤事務 (SQL_SLAVE_SKIP_COUNTER) | 錯誤明確、數據影響可控、需快速恢復 | 最快、無停機 | **可能導致數據不一致** |
STOP SLAVE SQL_THREAD;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE SQL_THREAD; SHOW SLAVE STATUS\G -- 確認 Slave_SQL_Running: Yes
建議: 先用 SHOW BINLOG EVENTS 分析主庫 Binlog 確認錯誤事務數量,再批量設置計數器。
SHOW SLAVE STATUS\G -- 關鍵字段: Master_Log_File: mysql-bin.000217 Read_Master_Log_Pos: 673146776
SHOW BINLOG EVENTS IN 'mysql-bin.000217' FROM 673146776\G -- 或命令行 mysqlbinlog mysql-bin.000217 --start-position=673146776
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N; -- N 為需跳過事務數 START SLAVE SQL_THREAD;
跳過事務啟動後,Seconds_Behind_Master 緩慢下降,SHOW PROCESSLIST 顯示復制 SQL 線程狀態 Sending data 耗時極長。
SET profiling=1; -- 等待該長查詢結束 SHOW PROFILES; SHOW PROFILE FOR QUERY;
同樣定位到大字段/溢出頁/無索引掃描等問題,**從庫同步執行同樣受主庫慢查詢影響**。
STOP SLAVE 執行不返回,疑被長查詢/鎖阻塞START SLAVE 報此錯mysqld_safe --user=mysql 啟動正常,mysqld 直接啟動報錯Slave_SQL_Running、Seconds_Behind_Master、Last_SQL_Error