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 的方式导数据,语句如下:

  1. CREATE TABLE innodb_table LIKE myisam_table;
  2. ALTER TABLE innodb_table ENGINE=InnoDB;
  3. INSERT INTO innodb_table SELECT * FROM myisam_table;

数据量不大,这样处理没问题;但数据量很大,需要考虑分批处理,针对每一段数据执行事务提交操作。以免大事务产生的过多的 undo。操作如下:

  1. START TRANSACTION;
  2. INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y;
  3. COMMIT;

在主从同步架构下,大数据量会引起大范围的主从延迟。

该操作是原表的全量复制,但对于过程中新增/更新的数据,则留意丢失的情况;如有必要,可对原表加锁,确保数据一致性。