如何轉換MySQL表的引擎

有不少種方法能夠將表的存儲引擎轉換成另外一種引擎。每種方法都有其優缺點,在這裏介紹四種方法: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:原理爲建立臨時表->修改修改結構->記錄數據->刪掉原表->重命名臨時表  

相關文章
相關標籤/搜索