將表從一個引擎修改成另外一個引擎最簡單的辦法是使用ALTER TABLE
語句,轉換表的存儲引擎會致使失去原引擎相關的全部特性。html
例:將mytable的引擎修改成InnoDBmysql
mysql> ALTER TABLE mytable ENGINE = InnoDB;
上述方法適用任何的存儲引擎,但執行時間較長。MySQL會按行將數據從原表複製到一張新表中,在複製過程當中會消耗系統全部的I/O能力,同時會對原表加上讀鎖。若是在繁忙的表上執行此操做須要特別當心。sql
使用mysqldump
工具將數據導出到文件,而後修改文件中CREATE TABLE語句的存儲引擎選項和表名,同時注意mysqldump
默認會自動加上CREATE TABLE語句前加上DROPTABLE語句,若忽略此點可能會致使數據丟失。安全
此方法綜合了上述兩種方法的高效和安全,不須要導出整個表,而是先建立一個新的存儲引擎的表,而後利用 INSERT ... SELECT語法導入數據。工具
mysql > CREATE TABLE innodb_table LIKE myisam_table; mysql > ALTER TABLE innodb_table ENGINE=InnoDB; mysql > INSERT INTO innodb_table SELECT * FROM myisam_table;
若是數據量大,可考慮分批處理,針對每一段數據執行事務提交操做,以避免大事務產生過多的undo。code
假設有主鍵字段id,可重複運行如下語句將數據導入新表:htm
mysql > START TRANSACTION; mysql > INSERT INTO innodb_table SELECT * FROM myisam_table -> WHERE id BETWEEN x AND y; mysql > COMMIT;
以上操做完成後,新表是原表的一個全量複製,原表不受任何影響。若是有必要,能夠在執行中對原表加鎖,確保新表與原表的數據一致。事務
persona Toolkit提供了一個pt-online-schema-change的工具,能夠簡單方便地執行上述的過程,避免手工操做可能致使的失誤。get