MyISAM 不支援交易、行鎖、外鍵,隨著業務增長遷移至 InnoDB 成為必經之路。本文提供經驗證的資訊庫查詢生成法,並詳述遷移前評估、執行策略與驗證清單。
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` ENGINE=InnoDB;')
FROM information_schema.TABLES
WHERE ENGINE = 'MyISAM'
AND TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
INTO OUTFILE '/tmp/alter_innodb.sql';
/tmp/alter_innodb.sql 包含所有非系統庫 MyISAM 表的轉換語句。SOURCE /tmp/alter_innodb.sql; 或 mysql -u root -p < /tmp/alter_innodb.sqlRM /tmp/alter_innodb.sql| 評估項目 | 影響 | 應對策略 |
|---|---|---|
| 表大小 | 大表轉換需長時間鎖表 | 採用 pt-online-schema-change 或 gh-ost 線上遷移 |
| 全文索引 | MyISAM 原生支援,InnoDB 5.6+ 才支援 | 5.6 前需重構為外部搜尋引擎 |
| 空間索引 (GIS) | MyISAM 支援,InnoDB 5.7+ 才支援 | 版本不足時暫不遷移或升級 |
| 壓縮表 | MyISAM PACK_KEYS/myisampack | InnoDB ROW_FORMAT=COMPRESSED + KEY_BLOCK_SIZE |
| AUTO_INCREMENT 間隙 | InnoDB 重啟可能重用未提交 ID | 業務不依賴連續性即可接受 |
| COUNT(*) 效能 | MyISAM 瞬間,InnoDB 掃描 | 維護計數表或快取 |
| 工具 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| pt-online-schema-change | 建影子表+觸發器同步 | 成熟、支援複雜 DDL、Percona 維護 | 觸發器開銷、從庫延遲 | 通用首選 |
| gh-ost | 二進制日誌解析同步,無觸發器 | 無觸發器、主庫無寫入放大、可暫停/限流 | 需 Row-based Binlog、不支援外鍵 | 高寫入、嚴格 SLA |
| MySQL 8.0 即時 DDL | 元資料修改,無拷貝 | 秒級完成、無鎖 | 僅支援特定操作(如加欄位、索引),**不支援 ENGINE 變更** | 不適用本場景 |
mysqldump --single-transaction --routines --triggers db > backup.sqlSOURCE /tmp/alter_innodb.sql;SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES
WHERE TABLE_SCHEMA='your_db' AND ENGINE='MyISAM';
結果應為空集。
innodb_buffer_pool_size 設為實體記憶體 60-80%。ANALYZE TABLE tbl_name;SET SESSION sql_log_bin=0; 主庫執行,再手動同步從庫(需極謹慎)。MyISAM → InnoDB 遷移是架構演進關鍵一步。**資訊庫生成腳本 + pt-online-schema-change/gh-ost 線上遷移 + 完整驗收**,讓遷移可控、可逆、零停機。