有很多种方法可以将表的储存引擎转换成另一种引擎。每种方法都有其优缺点,在这里介绍四种方法:
选择优先顺序(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:原理为建立临时表->修改修改结构->记录资料->删掉原表->重新命名临时表