有很多方法可以将表的存储引擎转换成另外一种引擎,每种方法都各有优缺点:
A:alter table
将表从一个引擎直接改为另外一个引擎最简单的办法
alter table tb_name engine=innodb;
要注意:这种方法需要执行很长的时间,mysql会按行将数据从原表复制到另外一张新表中,在复制期间可能会消耗系统所有的IO能力,同时原表会加上读锁,所以,在繁忙的表上执行此操作需要特别小心,一个替代的方案是采用后边讨论的方法。另外,转换表的存储引擎,将会失去和原引擎相关的所有特性,如:把innodb转换成myisam,再转回innodb,原innodb表上的所有外键将丢失。
B:导入与导出
可以使用mysqldump工具将数据导出到文件,然后修改文件中的create table语句的存储引擎选项,注意同时修改表名,因为同一个数据库中不能存在相同表名,即使是使用不同的存储引擎也不能同名,同时要注意,mysqldump默认会自动在create table语句前加上drop table语句,不注意这一点可能导致数据丢失。
C:创建与查询
结合前面两种方法的优点,不需要导出整个表的数据,而是先创建一张新的表,然后使用insert…select语法来导出数据到新表:
create table tb_name_new like tb_name_old;
alter table tb_name_new engine=innodb;
insert into tb_name_new select * from tb_name_old;
注意:数据量不大的话,这样做很好,如果数据很大,则可以考虑做分批处理(select加一个where条件,或者使用存储过程带上Limit条件),针对每一段数据执行事务提交操作,以避免大事务产生过多的undo。执行完成后,删除原表,把新表改名。
D:percona-tookit提供了一个pt-online-schema-change工具,可以比较简单,方便地执行上面的过程,避免手工操作可能导致的失误和繁琐。且,这个工具是不锁表的。