有不少種方法能夠將表的存儲引擎轉換成另外一種引擎。每種方法都有其優缺點,在這裏介紹四種方法:mysql
選擇優先級(pt-online-schema-change > 建立與查詢 > 導出和導入 > ALTER TABLE)。sql
- ALTER TABLE
將表從一個引擎修改成另外一個引擎最簡單的方法是使用ALTER TABLE語句。下面的語句將TB表的引擎修改成InnoDB:數據庫
1 mysql> ALTER TABLE TB ENGINE = InnoDB;
PS:該方法適用於任何存儲引擎。但有一個問題:須要很長的執行時間。安全
MySQL會按行將數據庫從原表複製到一張新的表中,在複製期間可能會消耗系統全部的I/O能力,同時原表上會加上讀鎖。工具
- 導出和導入(mysqldump)
爲了更好的控制轉換的過程,可使用mysqldump工具將數據導出到文件,而後修改文件中CREATE TABLE語句的存儲引擎選項,注意同時修改表名,由於同一個數據庫中不能存在相同的表名,即便他們使用的是不一樣的存儲引擎。spa
PS:mysqldump默認會自動在CREATE TABLE語句前加上DROP TABLE語句,不注意這一點可能會致使數據丟失。code
一、下面的語句將DB庫中的TB表數據導出到tb.sql文件中:blog
1 [root@desktop]# mysqldump -u root -p DB TB > tb.sql
二、修改tb.sql文件(若是須要備份TB表,請更改表名):it
CREATE TABLE `TB` ( `name` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
三、下面的語句將tb.sql文件導入到DB庫中:io
1 [root@desktop]# mysql -u root -p DB < tb.sql
- 建立與查詢(CREATE 和 SELECT)
這種方法綜合第一種方法的高效和第二種方法的安全。不須要導出整個表的數據,而是首先建立一個新的存儲引擎的表,而後利用INSERT...SELECT語法來導數據:
數據量不大使用如下語句:
1 mysql > CREATE TABLE TB2 like TB1;
2 mysql > ALTER TABLE TB2 ENGINE=InnoDB;
3 mysql > INSERT INTO TB2 SELECT * FROM TB1;
數據量大使用如下語句:
1 mysql > CREATE TABLE TB2 like TB1; 2 mysql > ALTER TABLE TB2 ENGINE=InnoDB;
3 mysql > START TRANSACTION; 4 mysql > INSERT INTO TB2 SELECT * FROM TB1 WHERE id BETWEEN x AND y; 5 mysql > COMMIT;
PS:這樣的操做完成後,新表是原表的一個全量複製,原表還在,如須要能夠刪除原表。
若是有必要,能夠在執行的過程當中對原表進行加鎖,以確保新表和原表的數據一致。
- 使用Percona Toolkit提供的pt-online-schema-change工具:
使用如下命令可將DB庫中的TB1錶轉換成InnoDB:
1 [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
執行成功後會有以下提示:
1 Successfully altered `DB`.`TB1`.
PS:原理爲建立臨時表->修改修改結構->記錄數據->刪掉原表->重命名臨時表