MySQL香港服务器转换表的引擎

作者:港云互联 时间:2019-09-27

        有很多种方法可以将表的存储引擎转换成另外一种引擎。每种方法都有其优点和缺点。接下来,我们将讲述其中的三种方法。

香港服务器

ALTER TABLE


        将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE 语句。下面的语句将mytable的引擎修改为InnoDB :


mysql> ALTER TABLE mytable ENGINE = InnoDB;


        上述语法可以适用任何存储引擎。但有一个问题:需要执行很长时间。MySQL香港服务器会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁。所以,在繁忙的表上执行此操作要特别小心。一个替代方案是采用接下来将讨论的导出与导人的方法,手工进行表的复制。


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


导出与导入


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


创建与查询(CREATE和SELECT)


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


mysql> CREATE TABLE innodb _table LIKE myisam _table;


mysq1> ALTER TABLE innodb table ENGINE InnoDB;


mysql> INSERT INTO innodb table SELECT * FROM myisam table;


        数据量不大的话, 这样做工作得很好。如果数据最很大,则可以考虑做分批处理,针对每一段数据执行事务提交操作,以避免大事务产生过多的undo.假设有主键字段i0,重复运行以下语句(最小值x和最大值y进行相应的替换)将数据导人到新表:


mysql> START TRANSACTION;


mysql> INSERT INTO innodb table SELECT * FROM myisam table


        -> wHERE id BETWEEN x AND y;


mysq1> coMMIT;


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


        Percona Tokit提供了一个pronline-schema-change的工具(基于Fccbook的在线schema变更技术),可以比较简单、方便地执行上述过程,避免手工操作可能导致的失误和烦琐。




新人注册,即送价值满880元现金劵

立即注册>>
客服 电话 反馈 活动 回顶部

服务热线

+852-5764-9835

1对1贴心服务,7X24小时热线