大量資料(百 GB+)遷移,mysqldump 太慢。採用「停庫 → 複製 Data 目錄 → 啟動」物理遷移法。
FLUSH TABLES WITH READ LOCK;(全域鎖定)data 目錄到目標機UNLOCK TABLES;my.cnf 指向新 datadirInnoDB: Error: log file ./ib_logfile0 is of different size 0 63963136 bytes
InnoDB: than specified in the .cnf file 0 6291456 bytes!
原因:源庫 innodb_log_file_size=61M,目標機預設 6M,複製來的 ib_logfile* 尺寸不匹配,InnoDB 拒絕啟動。
| 配置項 | 必須與源庫一致 | 說明 |
|---|---|---|
datadir | ✅ | 指向新複製的 data 目錄絕對路徑 |
innodb_log_file_size | ✅ | **精確等於源庫 ib_logfile 大小**(單位 bytes),否則啟動失敗 |
character-set-server / collation-server | ✅ | 字符集/校對規則不一致會導致資料亂碼、排序錯誤 |
innodb_page_size | ✅ | 若源庫非預設 16K,目標機必須一致(罕見) |
default_storage_engine | ✅ | 確保預設引擎一致 |
# 1. 計算源庫 ib_logfile 大小(bytes)
ls -l /source/data/ib_logfile0
# 63963136 bytes = 61 MB
# 2. 目標機 my.cnf 修正
[mysqld]
datadir = /new/data/path
innodb_log_file_size = 61M
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 3. 啟動驗證
systemctl start mysqld
CHECK TABLE ... EXTENDED 核心表檢查SELECT COUNT(*) 抽樣對比行數SHOW SLAVE STATUS 若為從庫,確認同步正常物理複製 Data 目錄遷移**極快**,但**三大鐵律**不可破:datadir 指向正確、innodb_log_file_size 與 ib_logfile 精確匹配、字符集校對規則完全一致。漏改任一項即啟動失敗或資料損壞。建議寫成 Ansible Playbook 固化流程,消除人為疏漏。