MySQL 主從架構在生產環境中長期運行,必然遭遇各類異常。本文針對六大高頻故障——中繼日志暴增、同步報錯、IO 線程卡 Connecting、主鍵衝突 1062、從庫延遲、Change Master 報 1201——給出成因分析、緊急處理與根治配置。
從庫 Relay_Log_Space 持續增長,未自動清理舊中繼日志。
默認 relay_log_purge=ON,但 SQL 線程處理緩慢或 IO 線程拉取過快,導致清理來不及;或參數被誤關閉。
# 1. 確認參數開啟
SHOW VARIABLES LIKE 'relay_log_purge'; -- 必須為 ON
# 2. 臨時手動清理(謹慎)
PURGE RELAY LOGS TO 'relay-bin.000123'; -- 清理到指定文件前
# 3. 根治:限制中繼日志總大小(MySQL 5.7+)
[mysqld]
relay_log_space_limit = 10G # 超過限制 IO 線程暫停,倒逼 SQL 線程消費
# 跳過 1 個事件(到事務結束)
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
# 跳過 N 個事件
SET GLOBAL sql_slave_skip_counter = N;
[mysqld]
slave-skip-errors = 1062,1032,1007 # 常見:主鍵衝突、記錄不存在、庫已存在
# 或忽略所有(極度危險,僅極端場景)
# slave-skip-errors = all
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; 記錄 File/Position。mysqldump --single-transaction --master-data=2 -A > full.sql。CHANGE MASTER TO ... → START SLAVE。| 原因 | 排查命令/動作 |
|---|---|
| 網絡不通/防火牆 | telnet master_ip 3306、iptables -L -n、雲廠商安全組 |
| 復制用戶密碼/主機名錯誤 | 主庫 SHOW GRANTS FOR 'repl'@'%'; 核對密碼、Host |
| MASTER_LOG_POS 不正確 | 重新 CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...; |
主庫 bind_address 綁定 127.0.0.1 | 改為 0.0.0.0 或具體內網 IP,重啟主庫 |
Statement 格式 Binlog 下,非確定性函數(UUID()、NOW())、自增鎖模式導致從庫重放時主鍵衝突。
[mysqld]
# 1. 行級/混合 Binlog 格式(推薦)
binlog_format = ROW # 或 MIXED
# 2. 自增鎖模式調整(配合 ROW 格式)
innodb_autoinc_lock_mode = 2 # 交換模式,高併發插入性能最佳
ntpdate pool.ntp.org 確保主從時鐘一致,Seconds_Behind_Master 才準確。top/iostat/sar 檢查 CPU、IO、內存、網絡;MyISAM 表鎖導致讀寫阻塞 → 全面遷移 InnoDB。SHOW PROCESSLIST 找長事務;主庫拆分大事務、避免大表 DDL。slave_parallel_workers > 0、slave_parallel_type = LOGICAL_CLOCK 並行複製。ERROR 1201 (HY000): Could not initialize master info structure
從庫已存在舊的主從元數據(master.info/relay-log.info),直接 CHANGE MASTER 衝突。
STOP SLAVE;
RESET SLAVE ALL; -- MySQL 5.7.6+ 清空所有主從元數據
# 或舊版
RESET SLAVE;
# 再執行 CHANGE MASTER TO ...
slave_parallel_workers=4 起步,按核心數調整。Seconds_Behind_Master、Relay_Log_Space、Slave_SQL_Running_State 納入告警。