故障現象
將 data 目錄整體複製至新安裝的 WAMP/MySQL,啟動報錯:
InnoDB: Error: unable to create temporary file; errno: 2
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Unknown/unsupported storage engine: InnoDB
Aborting
排查過程
- 嘗試修改
default-storage-engine=MyISAM → 無效。
- 調整
innodb_buffer_pool_size 等參數 → 無效。
- 刪除
ib_logfile0、ib_logfile1 → **啟動成功!**
核心文件角色解析
| 文件 | 作用 | 遷移策略 |
| ibdata1 | 系統表空間:數據字典、Undo Log、雙寫緩衝、插入緩衝 | 必須遷移,包含表元數據與未提交事務 |
| ib_logfile0/1 | Redo Log(重做日誌):崩潰恢復、WAL 機制核心 | 可刪除重建,啟動時自動創建新文件 |
| *.ibd | 獨立表空間(開啟 innodb_file_per_table 時) | 必須遷移,屬於具體表數據 |
| 臨時文件 | 排序、中間結果等 | 啟動時自動創建,目錄需可寫 |
遷移最佳實踐(零風險)
# 1. 正常關閉源實例
systemctl stop mysqld
# 2. 同步數據目錄(保留權限)
rsync -av /var/lib/mysql/ /new_disk/mysql/
# 3. 修改目標 my.cnf datadir 指向新路徑
datadir=/new_disk/mysql
# 4. 調整目錄權限
chown -R mysql:mysql /new_disk/mysql
# SELinux 環境
semanage fcontext -a -t mysqld_db_t "/new_disk/mysql(/.*)?"
restorecon -Rv /new_disk/mysql
# 5. 啟動
systemctl start mysqld
暴力遷移補救清單(已發生故障時)
- 保留
ibdata1、所有 *.ibd、庫目錄。
- 刪除
ib_logfile*、*.pid、*.err、auto.cnf(UUID 衝突)。
- 確保
tmpdir 目錄存在且可寫(mkdir -p /tmp/mysql && chown mysql:mysql /tmp/mysql)。
- 啟動驗證:
CHECK TABLE ...、業務抽樣查詢。
避坑指南
1. 絕不刪除 ibdata1 —— 除非你接受全量數據丟失。
2. 不同版本間遷移 必須運行 mysql_upgrade。
3. 跨主機遷移 優先用 mysqldump / xtrabackup / mydumper,物理複製僅限同版本、同架構、同配置。
4. 臨時目錄權限 是隱形殺手,my.cnf 顯式設置 tmpdir=/data/tmp 並預創建。
- 上一篇文章: Hibernate 無法實時獲取 MySQL 更新數據?換掉默認連接池換用 C3P0 解決脏讀問題
- 下一篇文章: MySQL「Packet for query is too large」錯誤解決:max_allowed_packet 參數調優指南
Copyright ©
程式碼之家 All Rights Reserved