转换表的存储引擎

1、alter table

任何引擎的转换都可以使用该方法。但有一个问题:需要执行很长时间。mysql会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表会加上读锁。

另外,如果转换标的存储引擎,将会失去和原引擎相关的所有特性。例如,如果将一种Innodb表转换为myisam,然后再转换会Innodb,原Innodb表上的所有的外键将丢失。

2、导出与导入

可以使用mysqldump将数据导出到文件,然后修改文件中CREATE TABLE语句的存储引擎选项,同时注意修改表名,因为同一个数据库中不能存在相同的表名,即使它们使用的是不同的存储引擎。同时注意mysqldump默认会在CREATE TABLE语句前加上DROP TABLE语句。

3、创建与查询

这种方法是:不用导出整个表的数据,而是先创建一个新的存储引擎的表,然后利用insert……select语法来导数据:

create table innodb_table like myisam_table;
alter table innodb_table engine=innodb;
insert into innodb_table select * from myisam_table;

在数据量不大时可以直接运行,如果数据量很大,则可以考虑分批执行。针对每一段数据执行事务提交操作,以避免大事务产生过多的undo。如果有主键id,重复运行以下语句,将数据导入到新表:

start transaction;
insert into innodb_table select * from myisam_table
where id between x and y;
commit;

在执行时,如果有必要可以在执行的过程中对原表加锁,以确保新表和原表的数据一致。

另外,percona toolkit提供了pt-online-schema-change的工具,可以比较方便的执行方法3,避免手动引起的失误或繁琐。

posted on 2015-01-05 07:10  Still water run deep  阅读(75)  评论(0编辑  收藏  举报

导航