生產環境主從複寫最常遇到的 6 大異常:Relay Log 暴增、同步中斷、IO Thread 掛起、主鍵衝突、延遲過大、CHANGE MASTER 報錯,附標準排查流程與修復指令。
# my.cnf [mysqld]
relay_log_purge = 1 # 預設即為 1,若為 0 請改回
# 重啟生效
SQL Thread 執行完 Event 後會自動判斷並刪除不再需要的 Relay Log。
-- 單次跳過 1 個 Event (到事務結束)
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
-- 指定錯誤碼永久跳過 (需重啟)
# my.cnf [mysqld]
slave_skip_errors = 1062,1032 # 常見:主鍵衝突、找不到行
⚠️ 跳過後主從資料**已不一致**,需配合 pt-table-checksum + pt-table-sync 修補。
排查順序:
telnet master_ip 3306、防火牆、Security Group。SHOW GRANTS FOR 'repl'@'%'、密碼正確、主機名允許。MASTER_LOG_FILE/MASTER_LOG_POS 是否正確 (手動 CHANGE MASTER 易出錯)。binlog_format、binlog_row_image 相容性。常見於 Statement-based Replication (SBR) 非確定性函數 (UUID、NOW) 導致。
# 方案 A:改 Row-based
SET GLOBAL binlog_format = 'ROW'; -- 或 MIXED
# 方案 B:調整自增鎖模式
SET GLOBAL innodb_autoinc_lock_mode = 2; -- interleaved (5.1.22+)
| 可能原因 | 排查指標 |
|---|---|
| 系統時間不同步 | date / ntpdate 對時 |
| 從庫硬體較弱 / IO 壓力大 | iostat -x 2, top, sar -n DEV |
| 大事務/長鎖阻塞 SQL Thread | SHOW ENGINE INNODB STATUS\G 看鎖等待 |
| 單執行緒 SQL Thread 瓶頸 | 升級 5.7+ 開啟 slave_parallel_workers |
| MyISAM 表鎖爭用 | 盡量轉 InnoDB、減少長鎖操作 |
-- 原因:Slave 已有複寫中繼資料
RESET SLAVE ALL; -- 5.5.16+ 含 GTID 資訊清除
-- 或舊版
RESET SLAVE;
STOP SLAVE;
CHANGE MASTER TO ...;
START SLAVE;
SHOW SLAVE STATUS\G
-- 關注:Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master,
-- Last_IO_Error, Last_SQL_Error, Relay_Master_Log_File, Exec_Master_Log_Pos
建立監控告警:Seconds_Behind_Master > 300 或 Slave_*_Running != Yes 立即通知。