转换表的引擎
ALTER TABLE
将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE语句。例如:
mysql>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变更技术),可以比较简单,方便地执行上述过程,斌面手工操作可能导致的失误和烦琐。
参考资料:
高性能MySQL(第3版)
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/70184828
作者:WSYW126