萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 5.6 並行複寫冷遷移錯誤 1755 解決與最佳實踐

錯誤現場

來源:MySQL 5.6.23,已啟用並行複寫 slave_parallel_workers=4。
操作:停庫 → 拷貝 datadir 到新機器(冷遷移) → 新機器 START SLAVE 爆錯:

Last_SQL_Error: Cannot execute the current event group in the parallel mode.
Encountered event Stop, relay-log name ./relay-log.000294, position 245347905
which prevents execution of this event group in parallel mode.
Reason: possible malformed group of events from an old master.
Last_SQL_Errno: 1755

根因分析

  • 冷遷移複製的是運行中的 datadir,包含未提交的事務、不完整的 Relay Log 事件群組。
  • 並行複寫協調器根據 last_committed / sequence_number 判斷事件群組邊界;遷移帶來的中斷點導致群組不完整,協調器拒絕並行回放。
  • 錯誤訊息 possible malformed group of events from an old master 直指此問題。

標準解決流程(三步驟)

  1. 停止複寫: STOP SLAVE;
  2. 暫時關閉並行: SET GLOBAL slave_parallel_workers = 0;
  3. 單線程追趕: START SLAVE; 等待 Seconds_Behind_Master = 0。
  4. 重新開啟並行: STOP SLAVE; SET GLOBAL slave_parallel_workers = 4; START SLAVE;

為什麼這樣做有效?

slave_parallel_workers=0 退回單線程 SQL 執行緒,不做群組邊界檢查,可安全回放不完整事件群組。追平後,Relay Log 尾部已為完整事務邊界,再開啟並行即正常運作。

生產環境冷遷移標準作業程序(SOP)

  1. 主庫鎖定: FLUSH TABLES WITH READ LOCK; 獲取一致性快照位置(SHOW MASTER STATUS)。
  2. 備份: xtrabackup --backup --target-dir=/backup/... 或 tar 整個 datadir(需確保無寫入)。
  3. 解鎖: UNLOCK TABLES;
  4. 遷移檔案 至目標機器。
  5. 目標機器配置: server-id、log_bin、relay_log、slave_parallel_workers=0(先關並行)。
  6. 啟動從庫: CHANGE MASTER TO ... MASTER_LOG_FILE=..., MASTER_LOG_POS=...; START SLAVE;
  7. 驗證追平: Seconds_Behind_Master=0 且 Slave_IO_Running=Yes, Slave_SQL_Running=Yes。
  8. 重開並行: STOP SLAVE; SET GLOBAL slave_parallel_workers=4; START SLAVE;

避坑指南

MySQL 5.7+ 改進

5.7 引入 slave_parallel_type=LOGICAL_CLOCK,基於 last_committed 更精準判斷並行組,冷遷移後單線程追平機制相同,但並行效率更高、錯誤更少。

copyright © 萬盛學電腦網 all rights reserved
坑點後果對策
直接拷貝運行中 datadirRelay Log 截斷、事件群組不完整、報 1755必須 FLUSH TABLES WITH READ LOCK 或用 xtrabackup 熱備
遷移前未關閉並行複寫協調器狀態殘留,啟動即報錯目標機器 my.cnf 先設 slave_parallel_workers=0
GTID 模式下未同步 gtid_executed啟動後 GTID 斷裂備份時同時導出 gtid_executed,或用 MASTER_AUTO_POSITION=1
server-id 衝突複寫環路、資料衝突目標機器務必設定唯一 server-id