現象:Slave_IO_Running: Yes、Slave_SQL_Running: No。SQL 線程因重放錯誤 (重複鍵、外鍵失敗、字元集、版本不兼容) 停止。修復策略取決於 資料一致性要求 與 主從差異程度。
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1; -- 跳過 1 個事件,視錯誤數量調整
START SLAVE;
SHOW SLAVE STATUS\G
-- 確認 Slave_SQL_Running: Yes
pt-table-checksum 校驗差異,必要時 pt-table-sync 修復。FLUSH TABLES WITH READ LOCK;SHOW MASTER STATUS; 記錄 File、Position (或 GTID 模式記錄 Executed_Gtid_Set)。mysqldump --single-transaction --master-data=2 --all-databases > master_full.sqlUNLOCK TABLES;scp master_full.sql slave_host:/tmp/STOP SLAVE;mysql < /tmp/master_full.sqlCHANGE MASTER TO MASTER_HOST='...', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=3260;CHANGE MASTER TO MASTER_HOST='...', MASTER_AUTO_POSITION=1;START SLAVE;SHOW SLAVE STATUS\G 確認 Slave_IO_Running: Yes, Slave_SQL_Running: Yes, Seconds_Behind_Master: 0。
主從不同步 (SQL_Running=No)
│
├─ 核心業務表 / 強一致性要求 / 差異未知 / 近期無備份
│ → 方案二:重做從庫 (最安全、最徹底)
│
└─ 非核心表 / 可容忍秒級不一致 / 已知單一錯誤 / 有近期備份可校驗
→ 方案一:跳過錯誤 (最快、無停機)
│
└─ 跳過後 pt-table-checksum 發現大量差異
→ 回退方案二
| 錯誤類型 | 典型 Last_SQL_Error | 根因 | 預防 |
|---|---|---|---|
| 重複鍵 | Duplicate entry 'x' for key 'PRIMARY' | 從庫誤寫入 / 重複導入 / 主庫重試 | 從庫 read_only=ON、super_read_only=ON |
| 外鍵失敗 | Cannot add or update a child row: a foreign key constraint fails | 主從表結構不一致 / 載入順序錯誤 | 避免生產用外鍵、或確保結構同步 |
| 字元集/排序規則 | Illegal mix of collations | 主從字元集配置不同 | 統一 utf8mb4_unicode_ci |
| 版本不兼容 | Unknown column / Table doesn't exist | 主庫 DDL 未同步 / 版本差異 | DDL 走線上變更工具、版本對齊 |
| 大事務超時 | Lock wait timeout exceeded | 主庫大事務導致從庫重放超時 | 拆分大事務、調大 slave_transaction_retries |
Slave_*_Running、Seconds_Behind_Master、Last_SQL_Error 即時告警。pt-table-checksum 主從一致性校驗。