有很多种方法可以将表的存储引擎转换成另外一种引擎。每种方法都有其优缺点,下面介绍三种方法。
① ALTER TABLE
将表从一个引擎修改为另一个引擎最简单的方法就是使用ALTER TABLE语句,例:
ALTER TABLE table_name ENGINE = InnoDB;
上述语法可以适用于任何存储引擎。但是有一个问题:当数据过多时,会需要执行很长时间,期间可能会消耗系统所有的I/O能力,同时会在原表上加读锁。MySQL会按行将数据从原表复制到一张新的表中,在数据量大的表上执行此操作需要注意这一点。
另外需要注意的是转换表的引擎之后,将会失去原有引擎相关的所有特性。
② 导入与导出
为了更好的控制转换的过程,可以使用mysqldump工具将数据导出到文件,然后修改文件中CREATE TABLE语句的存储引擎选项,注意同时修改表名,因为在一个数据库中即使它们的存储引擎不同,表名也不能重复。同时要注意mysqldump默认会自动在CREATE TABLE语句前加上DROP TABLE语句,一定要把这行sql删除,否则后果你懂得。
③ 创建于查询
第三种转换的技术综合了第一种方法的高效和第二种方法的安全。不需要导出整个表的数据,而是先创建一个新的表,然后利用insert ... select ... 语法来导数据:
start transaction;
![](/qrcode.jpg)
insert into innodb_table select id,name from myisam_table where id between x and y;
commit;
这样操作完成以后,新的表时原表的一个全量赋值,原表还在,如果需要可以删除原表。如果有必要可以在执行过程中对原表加锁以保证数据的一致性。
Percona Toolkit提供了一个pt-online-schema-change的工具(基于Facebook的在线schema变更),可以比较简单的执行这个过程,以避免手工操作导致的失误。