有很多方法可以将表的存储引擎转换成另外一种引擎,每种方法都有其优点和缺点。下面具体其中三种方法:

alter table

  将表从一个引擎修改为另一个引擎最简单的方法是alter table语句,下面的语句将mytable的引擎修改为InnoDB:

ALTER TABLE mytable ENGINE = InnoDB;

  上述语法可以使用任何存储引擎,但有一个问题:需要执行很长时间,MySQL会按行将数据从原表赋值到一张新表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁。所以,在繁忙的表上执行此操作要特别小心。

  如果转换表的存储引擎,将会失去和原引擎相关的所有特性。例如:如果将一张InnoDB表转换成MyISAM,然后再转回InnoDB,原InnoDB表上所有的外键将丢失。

导出与导入

  为了更好的控制转换的过程,可以使用mysqldump工具将数据导出到文件,然后修改文件中create table语句的存储引擎选项,注意同时修改表名,因为同一个数据库中不能存在相同的表名,即使他们使用的是不同的存储引擎,同时要注意mysqldump默认会自动在create table语句前加上drop table语句,不注意这一点可能会导致数据丢失。

创建与查询(create 和 select)

  第三种转换的技术综合了第一种方法的高效和第二种方法的安全,不需要导出整个表的数据,而是先创建一个新的存储引擎的表,然后利用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,重复运行以下的语句(最小值x和最大值y进行相应的替换)将数据导入到新表,如下:

start transaction;

insert into innodb_table select * from myisam_table where id between x and y; # 通过条件进行范围导入

commit;

  这样操作完成以后,新表是原表的一个全量复制,原表还在,如果需要可以删除原表,如果有必要,可以在执行的过程中对原表加锁,以确保新表和原表数据一致。

Percona Toolkit提供一个pt-online-schema-change的工具(基于Facebook的一个在线schema变更技术),可以比较简单,方便地执行上述过程,斌面手工操作可能导致的失误和烦琐。


最后编辑: 于 3年前

标签

评论列表(0)

    暂无评论