MySQL表转换(转换/修改表存储引擎):
有几种方法可以吧表从一种引擎转移到另外一种引擎上,都有自己的优缺点。下面介绍3种常用的方法。
一:ALTER TABLE
把表从一种引擎转移到另外一种引擎最简单快捷的方法用ALTER TABLE语句:
mysql>ALTER TABLE mytablename ENGINE = 引擎类型
详细介绍该用法:这种语法适合所有的存储引擎,不过这里有一个“陷阱”:这种转换过程会消耗大量时间。MySQL为此要执行一个旧表到新表的逐行复制(Row-By-Row Copy)。在这期间,转换操作可能会占用服务器得所有I/O处理能力,并且在转换时,源表要被加读锁。因此,在一个繁忙的表上做此操作,要加以注意。作为替代手断,可以使用下面这个方法,它会先做个表拷贝。
如果从一个引擎到另一种引擎做表转换,所有属于原始引擎的专用特性都会丢失,例如,如果将一个innoDB表转换成MyISAM表,在转回来,那么最初定义在原InnoDB表上的所有外键都会丢失。
二:转储(Dump) 和导入(Import)
如果想对表转换的过程做更多控制,可以选择使用mysqldump工具,将表先转储(dump)成一个文本文件,在编辑转储文件(dump file),修改其中的CREATE TABLE语句。一定要注意修改表名和引擎类型,因为即便引擎类型有所不同,统一数据库种也不允许存在同一表名的两张表。另外,mysqldump在CREATE TABLE语句前,会默认地加上drop table 命令,如果不注意,可能因此丢失原有数据。
三:CREATE 和 SELECT
这种方法转换,在第一种方法的速度与第二种方法的安全性之间做了一个平衡。它不是转储整张表,或者一次性转换所有的数据,而是创建一个新表,使用MySQL的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 Log)变得过于庞大。假定id是主键,可以重复运行下列查询(每次逐次增大x和y的值),直至所有的数据都复制到新表。
mysql>START TRANSACTION;
mysql>INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y;
mysql>COMMIT;
转移操作完成后,源表仍会保留,可以在操作完成后删除(drop)它,而此时,新表已经被填充完毕。注意:如有必要,请在转换时加锁源表,防止转移复制数据不一致的问题
原文地址:http://blog.csdn.net/leyangjun/article/details/46410767