转换表的存储引擎
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) 编辑 收藏 举报