有很多種方法可以將表的儲存引擎轉換成另一種引擎。每種方法都有其優缺點,在這裏介紹四種方法:
選擇優先順序(pt-online-schema-change > 建立與查詢 > 匯出和匯入 > ALTER TABLE)。
•ALTER TABLE
將表從一個引擎修改為另一個引擎最簡單的方法是使用 ALTER TABLE 語句。下面的語句將 TB 表的引擎修改為 InnoDB:
mysql> ALTER TABLE TB ENGINE = InnoDB;
PS:該方法適用於任何儲存引擎。但有一個問題:需要很長的執行時間。
MySQL 會按行將資料庫從原表複製到一張新的表中,在複製期間可能會消耗系統所有的 I/O 能力,同時原表上會加上讀鎖。
•匯出和匯入(mysqldump)
為了更好的控制轉換的過程,可以使用 mysqldump 工具將資料匯出到檔案,然後修改檔案中 CREATE TABLE 語句的儲存引擎選項,注意同時修改表名,因為同一個資料庫中不能存在相同的表名,即使他們使用的是不同的儲存引擎。
PS:mysqldump 預設會自動在 CREATE TABLE 語句前加上 DROP TABLE 語句,不注意這一點可能會導致資料丟失。
1 、下面的語句將 DB 庫中的 TB 表資料匯出到 tb.sql 檔案中:
[root@desktop]# mysqldump -u root -p DB TB > tb.sql
2 、修改 tb.sql 檔案(如果需要備份 TB 表,請更改表名):
CREATE TABLE `TB` (
`name` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3 、下面的語句將 tb.sql 檔案匯入到 DB 庫中:
[root@desktop]# mysql -u root -p DB < tb.sql
•建立與查詢(CREATE 和 SELECT)
這種方法綜合第一種方法的高效和第二種方法的安全。不需要匯出整個表的資料,而是首先建立一個新的儲存引擎的表,然後利用INSERT…SELECT語法來導資料:
資料量不大使用以下語句:
mysql > CREATE TABLE TB2 like TB1;
mysql > ALTER TABLE TB2 ENGINE=InnoDB;
mysql > INSERT INTO TB2 SELECT * FROM TB1;
資料量大使用以下語句:
mysql > CREATE TABLE TB2 like TB1;
mysql > ALTER TABLE TB2 ENGINE=InnoDB;
mysql > START TRANSACTION;
mysql > INSERT INTO TB2 SELECT * FROM TB1 WHERE id BETWEEN x AND y;
mysql > COMMIT;
PS:這樣的操作完成後,新表是原表的一個全量複製,原表還在,如需要可以刪除原表。
如果有必要,可以在執行的過程中對原表進行加鎖,以確保新表和原表的資料一致。
•使用 Percona Toolkit 提供的 pt-online-schema-change 工具:
使用以下命令可將 DB 庫中的 TB1 錶轉換成 InnoDB:
[root@desktop]# pt-online-schema-change -u root -h 127.0.0.1 -p 123456 –alter=’ENGINE=Innodb’ –execute A=utf8,D=DB,t=TB1
執行成功後會有如下提示:
Successfully altered `DB`.`TB1`.
PS:原理為建立臨時表->修改修改結構->記錄資料->刪掉原表->重新命名臨時表