将一个大的MyISAM转换为InnoDB

3
我正在尝试将一张拥有1000万行的MySQL MyISAM表格转换为InnoDB。我尝试了使用ALTER TABLE命令,但是这使得我的服务器卡住了,于是我手动杀掉了mysql进程。请问有什么推荐的方法来完成这个操作吗?
我想到的一些解决方案如下:
1. 创建一个新的InnoDB表格,然后分批次地插入数据。
2. 将表格导出成文本文件,再使用LOAD FILE命令导入。
3. 再次尝试直接转换,让服务器一直处于无响应状态,直到任务完成(我已经尝试了2个小时,但该服务器是生产服务器,所以我更倾向于让它继续运行)。
4. 复制表格,删除其索引,然后进行转换,最后再添加索引。

#1 看起来不错,但你需要锁定表以防止写入。 - Dor
2个回答

2
更换表的引擎需要重写整个表,这就是为什么表不可用时间如此之长的原因。删除索引、转换、再添加索引可以加快初始转换速度,但添加索引会在您的表上创建读锁,因此最终效果将相同。制作新表并传输数据是正确的方法。通常这分为两部分——首先复制记录,然后重放复制记录时所做的任何更改。如果您能够承受禁用表中的插入/更新操作,同时保留读取操作,则这不是问题。否则,有几种可能的解决方案。其中一种是使用 Facebook 的在线模式更改工具。另一个选择是设置应用程序同时写入两个表,在迁移记录时,然后只切换到新记录。这取决于应用程序代码,关键部分是处理唯一键/重复项,因为在旧表中您可能会更新记录,而在新表中则需要插入它。(这里事务隔离级别也可能发挥关键作用,尽可能降低它)。“经典”方式是使用复制,据我所知,也分为两部分——您启动复制,记录主位置,然后在第二台服务器上导入数据库转储,然后将其作为从服务器启动以赶上更改。

0

你尝试过先按主键排序数据吗?例如:

ALTER TABLE tablename ORDER BY PK_column;

应该加快转换速度。


你能解释一下为什么这会有帮助吗?在我的表上,ORDER BY 查询似乎是相当困难的。 - Noam
1
我认为在INNODB中,主键是一个聚集索引(数据和索引存储在B树中),因此通过预先排序它,可以更轻松地创建结构。 - Kevin Burton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接