引擎轉換會丟失原引擎專有特性:InnoDB → MyISAM 會丟失外鍵、事務、行級鎖;再轉回 InnoDB 外鍵不會自動恢復。
| 方法 | 語法/步驟 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 1. ALTER TABLE | ALTER TABLE t ENGINE=InnoDB; | 最簡單,單條指令 | 鎖表久,大表可能掛起小時;磁碟 I/O 激增 | 小表、維護窗口充足 |
| 2. Dump & Import | mysqldump t > t.sql → 編輯 CREATE TABLE ENGINE=... → mysql < t.sql | 可離線操作,源表不鎖,可並行導入 | 需額外磁碟空間;導入慢;需手動改 SQL | 大表、需變更表名/結構 |
| 3. CREATE + INSERT SELECT | CREATE TABLE t_new LIKE t; ALTER TABLE t_new ENGINE=InnoDB; INSERT INTO t_new SELECT * FROM t; | 速度與安全平衡;可在線建新表,再切換 | 需雙倍空間;切換瞬間需短暫鎖表(RENAME TABLE) | 中大表、業務可接受秒級停寫 |
-- 1. 建立同結構新表
CREATE TABLE t_new LIKE t;
-- 2. 修改引擎
ALTER TABLE t_new ENGINE=InnoDB;
-- 3. 複製資料(可分批、可加 WHERE 條件)
INSERT INTO t_new SELECT * FROM t;
-- 4. 驗證資料一致性
SELECT COUNT(*) FROM t;
SELECT COUNT(*) FROM t_new;
CHECKSUM TABLE t, t_new;
-- 5. 原子切換(需短暫鎖表)
RENAME TABLE t TO t_old, t_new TO t;
-- 6. 觀察無誤後刪除舊表
DROP TABLE t_old;
INSERT SELECT 會產生大量 Binlog,建議臨時 SET sql_log_bin=0; 或用 LOAD DATA 導入。ANALYZE TABLE 更新統計資訊,避免執行計劃劣化。小表用 ALTER TABLE 圖省事;中大表用 CREATE + INSERT SELECT + RENAME 兼顧速度與安全;極大表或跨機房遷移用 Dump & Import 配合並行工具(mydumper/myloader、xtrabackup)。無論哪種,備份、驗證、回滾預案缺一不可。