首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 主從複寫不同步兩大解決方案(跳過錯誤 vs 重建同步)

     編輯:MySQL 資料庫相關知識

發現 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 檔案是否存在。

方案二:完全重建主從同步(資料零差異,耗時較長)

適用場景:主從資料差異大、業務要求強一致性、方案一跳過後仍報錯。

步驟詳解

  1. Master 鎖表備份:
    FLUSH TABLES WITH READ LOCK;
    -- 保持此連線不中斷,另開視窗備份
    mysqldump -u root -p --all-databases --master-data=2 --single-transaction > /backup/master_full.sql
    UNLOCK TABLES;
  2. 記錄 Master Binlog 座標:
    SHOW MASTER STATUS;
    -- 記錄 File (如 mysql-bin.000001) 與 Position (如 3260)
  3. 傳輸備份檔至 Slave:
    scp /backup/master_full.sql root@slave_ip:/tmp/
  4. Slave 停止複寫並匯入資料:
    STOP SLAVE;
    mysql -u root -p < /tmp/master_full.sql
  5. 重設 Slave 複寫起點:
    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
  6. 啟動複寫並驗證:
    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)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved