转换表的引擎

有很多种方法可以将表的存储引擎转换成另外一种引擎。

ALTER TABLE

将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE语句。
例:将mytable的引擎修改为InnoDB:
mysql>ALTEL TABLE mytable ENGINE=InnoDB;
上述语法可以适用任何存储引擎。但有一个问题:需要执行很长时间。Mysql会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁。所以,在繁忙的表上执行此操作要特别小心。一个替代方案是采用接下来将讨论的导出与导入的方法,手工进行表的复制。

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

导入与导出

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

创建与查询(CREATE SELECT)

第三种转换的技术综合了第一种方法的高效和第二种方法的安全。不需要导出整个表的数据,而是先创建一个新的存储引擎的表,然后利用INSERT…SELECT语法来导数据;

mysql>create table innodb_table like myisam_table;
mysql>alter table innodb_table ENGINE=InnoDB;
mysql>insert into innodb_table select * from myisam_table;

数据量不大的话,这样做工作得很好。如果数据量大。则可以考虑做分批处理,针对每一段数据执行事务提交操作,以避免大事务产生过多的undo。假如有主键字段id,重复运行以下语句(最大值y与最小值x进行相应的替换)将数据导入到新表:
mysql>start transaction;
mysql>insert into innodb_table select * from myisam_table;
->where id between x and y;
mysql>commit;

这样操作后,新表是原表的一个全量复制,原表还在,如果需要可以删除原表。如果有必要,可以在执行的过程中对原表加锁,以确保新表和原表的数据一致。
PerconaToolkit提供了一个pt-online-schema-change的工具(基于Facebook的在线schema变更技术),可以比较简单,方便的执行上述过程,避免手工操作可能导致的失误和繁琐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值