MySQL中修改數據表存儲引擎的三種方法

第一種方法:ALTER TABLE

將表從一個引擎修改成另外一個引擎最簡單的辦法是使用ALTER TABLE語句,轉換表的存儲引擎會致使失去原引擎相關的全部特性。html

例:將mytable的引擎修改成InnoDBmysql

mysql> ALTER TABLE mytable ENGINE = InnoDB;

上述方法適用任何的存儲引擎,但執行時間較長。MySQL會按行將數據從原表複製到一張新表中,在複製過程當中會消耗系統全部的I/O能力,同時會對原表加上讀鎖。若是在繁忙的表上執行此操做須要特別當心。sql

第二種方法:導出和導入數據

使用mysqldump工具將數據導出到文件,而後修改文件中CREATE TABLE語句的存儲引擎選項和表名,同時注意mysqldump默認會自動加上CREATE TABLE語句前加上DROPTABLE語句,若忽略此點可能會致使數據丟失。安全

第三種方法:建立與查詢(CREATE 和 SELECT)

此方法綜合了上述兩種方法的高效和安全,不須要導出整個表,而是先建立一個新的存儲引擎的表,而後利用 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

相關文章
相關標籤/搜索