将大型MyISAM表转换为InnoDB

Mor*_*hen 5 mysql myisam innodb large-data

我有一个MyISAM表(10M行,3.5G,计划达到~80M),我总是无法将其转换为InnoDB.

我试过了 :

  • ALTER TABLE - 2分钟后失去联系.也许我做错了.

  • mysqldump- 尝试创建转储然后更改ENGINE=MyISAMENGINE=InnoDB.

它开始很好但随着新表中行数的增长(~3M),它变得越来越慢,最后在几个小时后它超时(--reconnect打开).

如果我将缓冲池大小增加到2G,它会在更多行(~6M)之后减慢,但机器会耗尽RAM.

SHOW PROCESSLIST转储恢复期间,我看到许多查询在"查询结束"状态下停留了2-3分钟.从google-ing无法理解是什么意思.

  • INSERT INTO ... SELECT * FROM - 创建了相同结构的表并尝试了这一点.在数百万行之后也会减速然后超时.(感谢@ErnestasStankevičius提醒我这个.)

服务器:

Aws EC2 4GB Ubuntu14.04

my.cnf:

wait_timeout=28800
connect_timeout=28800
innodb_lock_wait_timeout=28800
net_read_timeout=7200
net_write_timeout=7200
innodb_buffer_pool_size=1G
innodb_io_capacity=100 /*200 is heavy on the machine*/
innodb_flush_log_at_trx_commit=0
reconnect=1
Run Code Online (Sandbox Code Playgroud)

Mor*_*hen 1

我的解决方案是从新的(InnoDB)表结构中删除一些索引,然后添加数据。
我曾经INSERT new_table SELECT * FROM old_table复制过数据

删除的索引越多,数据进入的速度就越快。

之后,我重新创建了索引。
感谢@i486。