需將全庫數十張表從 InnoDB 遷移至 MyISAM(或反向)?mysql_convert_table_format 這個 Perl 腳本工具能一次性完成,省去逐表 ALTER TABLE 的繁瑣。
/usr/bin/ 或 /usr/sbin/。MyISAM。| 參數 | 說明 | 範例 |
|---|---|---|
--engine | 目標引擎(預設 MyISAM) | --engine=InnoDB |
--user/--password | 連線憑證 | --user=root --password='xxx' |
--host/--port/--socket | 連線目標 | --socket=/tmp/mysql.sock |
--force | 遇錯繼續轉換其餘表 | 大庫遷移建議開啟 |
--verbose | 輸出詳細進度 | 排查失敗表必備 |
# 1. 確認工具存在
ls /usr/bin/mysql_convert_table_format
# 2. 執行轉換(以資料庫 mo 為例)
mysql_convert_table_format mo \
--user=root --password='mysql' \
--socket=/tmp/mysql.sock \
--engine=MyISAM \
--force --verbose
# 3. 驗證結果
ls -lh /opt/mysql-data/mo/*.MYD /opt/mysql-data/mo/*.MYI
# 出現 .MYD/.MYI 即轉換成功;原 .ibd 消失
工具預設目標是 MyISAM,若需轉 InnoDB 有兩法:
vi /usr/bin/mysql_convert_table_format,第 26 行 $opt_type = "myisam" 改為 "innodb"。--engine=InnoDB(新版本支援,優先嘗試)。ALTER TABLE ... DROP FOREIGN KEY,否則報錯中斷。mysql、performance_schema、sys 庫勿動。SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mo' AND ENGINE != 'MyISAM';
-- 若無輸出,全庫轉換完成
搭配 pt-online-schema-change 可實現無鎖遷移,大表場景建議改用該工具。mysql_convert_table_format 適合中小表、維護窗口允許的批量轉換場景。