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。操作如下:
START TRANSACTION;
INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y;
COMMIT;
在主从同步架构下,大数据量会引起大范围的主从延迟。
该操作是原表的全量复制,但对于过程中新增/更新的数据,则留意丢失的情况;如有必要,可对原表加锁,确保数据一致性。