我被委托将数据从MongoDB数据库移植到MySQL数据库(因为有很强的理由需要这样做)。MongoDB集合包含大约1.1亿个文档,大小为60 GB,并且具有重要属性的索引。我们已经尝试使用具有7.5 GB RAM / 8 GB页面文件的大型Amazon EC2 Win2008服务器实例和C#控制台应用程序将MongoDB数据转换为本地MySQL数据库。我们每次从MongoDB内存中取出1K个文档,进行必要的处理,然后进行批处理写入MySQL db,每次写入500个。但是,每处理250万个文档就会导致服务器崩溃,Mongo响应非常缓慢,卡住我们的应用程序。我们已经尝试通过定期杀死mongod进程重新启动来解决这个问题,但我们认为我们肯定做错了什么。我们是否应该将Mongo服务器迁移到基于Linux的大型实例上,并将MySQL迁移到Amazon RDS上,并改用PHP重写转换应用程序?还有哪些其他事情可以尝试或提示?更新后,我们增加了Mongo Read计数器,从1,000个记录增加到10,000个记录,删除了MySQL目标数据库中的所有索引,并将Windows页面大小从4 GB增加到8 GB。处理的记录数已经达到了11M,但速度已降至每秒370条记录,下一步是将Mongo和MySQL服务器隔离到单独的服务器,并将它们全部放置在相同的Amazon可用性区域中以最小化延迟。我们更改了代码以使用Mongo游标并使其自动递增,而不是手动执行.skip().limit()。这大大加快了转换过程,但应用程序开始消耗太多内存,并且需要在每处理200万个记录后重新启动。
var docs = db[collectionName].Find(query);
docs.SetBatchSize(numOfResultsToFetchAtATime);
foreach (var d in docs) {
// do processing
}
所以这个代码会一次获取'numOfResultsToFetchAtATime'条记录-然后在循环中自动进行并获取下一组记录。Mongo使用游标来处理这个进程,因此速度更快。
但是,我们仍然无法成功移植它。当成功移植时,将发布我的回复和代码。
-- 更新03:成功 --
最终,我们采用了@scarpacci的建议,使用mongoexport。请记住,必须将mongodb放在linux盒子上而不是windows盒子上。
我们首先尝试从Windows本地MongoDB进行mongoexport,无论我们尝试什么,它都会在一个大集合(13Gigs +)的不同位置失败。
最后,我将数据库还原到Linux盒子上,mongoexport就像魔术般地工作了。
没有Json -> MySQL转换器-所以我们必须做到这一点。经过一些微调,我们能够使用我们以前的应用程序读取文件并直接写入MySQL。它很快且相对无错误。
我们遇到了一些大文件的问题,但将13GB文件分成500兆长的文件有所帮助,我们能够成功地将所有数据迁移到MySQL。
感谢大家花费时间帮助我们。希望这个解释能帮助将来的某个人。