| 方案 | 速度 | 安全性 | 業務影響 | 適用場景 |
|---|---|---|---|---|
| 1. ALTER TABLE | 慢(大表極慢) | 高(原子操作) | 鎖表,讀寫阻塞 | 小表、維護窗口 |
| 2. 導出導入 | 中 | 中(需停寫) | 需停寫,風險大 | 中表、可停機 |
| 3. 創建新表+插入 | 快(可分批) | 高(事務保護) | 可無鎖遷移 | 大表、生產環境推薦 |
ALTER TABLE my_table ENGINE=InnoDB;
ALGORITHM=INPLACE、LOCK=NONE 線上 DDL,但引擎轉換通常仍需重建表# 導出結構與數據 mysqldump -u root -p db_name my_table > table.sql # 編輯 SQL 修改 ENGINE=InnoDB # 導入 mysql -u root -p db_name < table.sql
風險:單點故障、無事務保護、導入失敗難回滾、需長時間鎖表保證一致性。
CREATE TABLE my_tmp_table LIKE my_table; ALTER TABLE my_tmp_table ENGINE=InnoDB;
-- 假設主鍵 id 連續,每批 10000 行 START TRANSACTION; INSERT INTO my_tmp_table SELECT * FROM my_table WHERE id BETWEEN 1 AND 10000; COMMIT; START TRANSACTION; INSERT INTO my_tmp_table SELECT * FROM my_table WHERE id BETWEEN 10001 AND 20000; COMMIT; -- ... 循環至結束
優勢:
SELECT COUNT(*) FROM my_tmp_table 對比pt-online-schema-change 或 gh-ost 實現真正無鎖切換RENAME TABLE my_table TO my_table_old, my_tmp_table TO my_table;
RENAME TABLE 是原子操作,瞬間完成切換,舊表保留備份。
大表引擎遷移首選方案三 + 專業工具,小表可直接 ALTER。切記:變更前必備份,驗證後再釋放舊表空間。