MySQL轉換表的引擎

來源:互聯網
上載者:User

MySQL轉換表的引擎

有很多種方法可以將表的儲存引擎轉換成另一種引擎。每種方法都有其優缺點,在這裡介紹四種方法:

選擇優先順序(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:原理為建立暫存資料表->修改修改結構->記錄資料->刪掉原表->重新命名暫存資料表 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.