發現 MySQL 主從複寫中斷,Slave_SQL_Running: No 是典型徵兆。本文提供兩種分級處理策略:方案一:跳過錯誤繼續同步(適用資料差異小、容忍不一致);方案二:完全重建主從(適用資料差異大、嚴格一致性要求)。
-- Master 端檢查
SHOW MASTER STATUS;
-- 記錄 File 與 Position
-- Slave 端檢查
SHOW SLAVE STATUS\G
-- 重點觀察:
-- 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
注意:sql_slave_skip_counter 僅對 SQL 執行緒錯誤有效;若 IO 執行緒報錯,需檢查網路、權限、Binlog 檔案是否存在。
適用場景:主從資料差異大、業務要求強一致性、方案一跳過後仍報錯。
FLUSH TABLES WITH READ LOCK;
-- 保持此連線不中斷,另開視窗備份
mysqldump -u root -p --all-databases --master-data=2 --single-transaction > /backup/master_full.sql
UNLOCK TABLES;
SHOW MASTER STATUS;
-- 記錄 File (如 mysql-bin.000001) 與 Position (如 3260)
scp /backup/master_full.sql root@slave_ip:/tmp/
STOP SLAVE;
mysql -u root -p < /tmp/master_full.sql
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_pass',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001', -- 步驟2 記錄的 File
MASTER_LOG_POS=3260; -- 步驟2 記錄的 Position
START SLAVE;
SHOW SLAVE STATUS\G
-- 確認 Slave_IO_Running: Yes, Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0 表示追上進度
binlog_format=ROW 減少非確定性 SQL 導致的同步錯誤。sync_binlog=1、innodb_flush_log_at_trx_commit=1 保證主庫資料不丟失。Seconds_Behind_Master,設定告警閾值(如 > 300 秒)。pt-table-checksum)。