【1】ALTER TABLE
mysql > ALTER TABLE mytable ENGINE=Falcon;
這種語法適合所有引擎,但是轉換過程會耗費大量時間。mysql為此要執行一個舊表到新表的逐行復制。在這期間,轉換操作可能會占用服務器的所有I/O處理能力,並且在轉換時,源表要被讀加鎖。因此,在一個繁忙的表上做此操作,要加以注意。
如果從一種引擎到另一種引擎做表轉換,所有屬於原始引擎的專用特性都會丟失。例如,將一個InnoDB表轉換成MyISAM表,再轉換回來,最初定義在原InnoDB表上的所有外鍵都會丟失。
【2】轉儲(Dump)和導入(Import)
如果想對表轉換的過程做更多控制,可以選擇使用mysqldump工具,將表先轉儲成一個文本文件,然后再編輯轉儲文件,修改其中的CREATE TABLE語句。一定要注意修改表名和引擎類型,因為即使引擎類型有所不同,同一數據庫也不允許存在相同表名的兩張表。另外,mysqldump在CREATE TABLE語句之前,會默默地加上DROP TABLE命令,如果不注意,很可能丟失原有數據。
【3】CREATE 和 SELECT
此方法在前兩種方法之間做了一個平衡,它不轉儲整張表,或者一次性轉換所有數據,而是創建一個新表,使用mysql的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;
如果數據量不大,這種辦法效果不錯,但是更高效的辦法是增量地填充表,在填充每個增量數據塊的時候都提交事務,這樣就不會導致撤銷日志變得過於龐大。假定id是主鍵,可以重復運行下列查詢(每次逐次增大x和y的值),直至所有的數據都復制到新表。
mysql > START TRANSACTION;
mysql > INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql > COMMIT;
轉移操作完成后,源表扔會保留,可以在操作完成后刪除,而此時,新表已被填充完畢。注意:如果有必要,請在轉換時加鎖源表,避免復制時數據不一致。