繁体   English   中英

将大型MyISAM转换为InnoDB

[英]Converting a big MyISAM to InnoDB

我正在尝试将1000万行MySQL MyISAM表转换为InnoDB。
我尝试了ALTER TABLE但这使我的服务器卡住了所以我手动杀死了mysql。 建议的方法是什么?

我想过的选项:
1.创建一个新表,即InnoDB,每次插入部分数据。
2.将表转储到文本文件中,然后执行LOAD FILE
3.再次尝试,只是保持服务器无响应,直到他完成(我尝试了2小时,服务器是生产服务器,所以我更喜欢让它继续运行)
4.复制表,删除索引,然后转换,然后添加索引

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

您是否尝试过首先通过PK订购数据? 例如:

ALTER TABLE tablename ORDER BY PK_column;

应加快转换速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM