萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL MyISAM 轉 InnoDB 一鍵腳本:資訊結構表生成 ALTER 語句批量轉換

為何要轉換?

  • InnoDB 支援事務(ACID)、行級鎖、外鍵約束、崩潰恢復
  • MyISAM 僅適合唯讀/日志類場景,高併發寫入嚴重阻塞
  • MySQL 5.7+ 預設引擎已為 InnoDB,MyISAM 逐漸邊緣化

一鍵轉換腳本原理

利用 information_schema.TABLES 查詢所有 MyISAM 表,生成 ALTER TABLE ... ENGINE=InnoDB 語句,寫入臨時檔再 SOURCE 執行。

完整 SQL 腳本

-- 1. 清理舊臨時檔
\! rm -f /tmp/alter_innodb.sql

-- 2. 生成 ALTER 語句
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';

-- 3. 執行轉換
SOURCE /tmp/alter_innodb.sql;

-- 4. 清理臨時檔
\! rm -f /tmp/alter_innodb.sql

執行方式

方式一:MySQL 客戶端直接執行

mysql -u root -p < convert_myisam_to_innodb.sql

方式二:在 MySQL Shell 內逐步執行

mysql> \! rm -f /tmp/alter_innodb.sql
mysql> 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';
mysql> SOURCE /tmp/alter_innodb.sql;
mysql> \! rm -f /tmp/alter_innodb.sql

進階:分批轉換大表(避免長時間鎖表)

-- 僅轉換資料量 < 100MB 的表
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')
  AND (DATA_LENGTH + INDEX_LENGTH) < 100*1024*1024
INTO OUTFILE '/tmp/alter_small.sql';

SOURCE /tmp/alter_small.sql;

-- 大表使用 pt-online-schema-change (Percona Toolkit)
-- pt-online-schema-change --alter "ENGINE=InnoDB" D=db,t=big_table --execute

轉換前後對比驗證

-- 檢查剩餘 MyISAM 表
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, DATA_LENGTH, INDEX_LENGTH
FROM information_schema.TABLES
WHERE ENGINE='MyISAM'
  AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys');

-- 檢查表狀態
SHOW TABLE STATUS WHERE Engine='InnoDB' \G

注意事項與風險

⚠️ 風險提示

  • 鎖表時間:ALTER TABLE ... ENGINE=InnoDB 會全表鎖定,大表可能耗時數小時
  • 空間膨脹:InnoDB 通常比 MyISAM 佔用 2-3 倍磁碟空間
  • 主鍵必要:InnoDB 必須有主鍵,無主鍵表會隱式建立 6 位元組 row_id
  • 全文索引:MySQL 5.6+ InnoDB 支援全文索引,舊版本轉換會丟失
  • 備份先行:轉換前務必做全量備份

生產環境推薦工具:pt-online-schema-change

# 無鎖線上轉換
pt-online-schema-change \
  --alter "ENGINE=InnoDB" \
  D=your_db,t=your_table \
  --user=root --password=xxx \
  --max-load Threads_running=50 \
  --critical-load Threads_running=100 \
  --execute

原理:建立新表 → 建觸發器同步增量 → 複製歷史資料 → 交換表名 → 清理。

copyright © 萬盛學電腦網 all rights reserved