Mongodb 如何加速Mongodump,转储而不是整理

Mongodb 如何加速Mongodump,转储而不是整理,mongodb,mongodump,Mongodb,Mongodump,在尝试使用来自大约50亿数据库的查询运行数据库转储时,进度条时间似乎表明此转储不会在任何合理的时间(100多天)内完成。大约22个小时后,查询似乎在0%结束后也冻结了,后面的行是metadata.json行 卸载线为: mongodump -h myHost -d myDatabase -c mycollection --query "{'cr' : {\$gte: new Date(1388534400000)}, \$or: [ { 'tln': { \$lte: 0., \$gte: -1

在尝试使用来自大约50亿数据库的查询运行数据库转储时,进度条时间似乎表明此转储不会在任何合理的时间(100多天)内完成。大约22个小时后,查询似乎在0%结束后也冻结了,后面的行是metadata.json行

卸载线为:

mongodump -h myHost -d myDatabase -c mycollection --query "{'cr' : {\$gte: new Date(1388534400000)}, \$or: [ { 'tln': { \$lte: 0., \$gte: -100.}, 'tlt': { \$lte: 100, \$gte: 0} }, { 'pln': { \$lte: 0., \$gte: -100.}, 'plt': { \$lte: 100, \$gte: 0} } ] }"
我的最后几行输出是(因为我还不能发布图片而键入的)


有什么想法可以帮助提高性能,或者有什么想法可以解释为什么需要这么长时间?

我刚刚遇到了这个问题,问题是,
mongodump
基本上不是很聪明。它正在遍历
\u id
索引,这可能意味着大量的随机磁盘访问。对我来说,由于光标超时,转储几个集合时,
mongodump
简直崩溃了

此处还描述了该问题:。然而,这并不是“按设计工作”中的一个很好的分辨率部分。这个索引可能有点搞笑,但我认为在我的例子中,它只是一个足够大的集合,对我可怜的小MacMini来说,磁盘访问量是一项非常艰巨的工作

一个解决方案?关闭写操作,然后使用
--forceTableScan
,这会对数据进行顺序传递,如果使用自定义
\u id
字段(I was),这可能比使用
\u id
索引更快

这些文档有点粗略,但看起来好像正常的
mongodump
行为可能是使用快照遍历
\u id
索引,然后通过查询进行过滤。换句话说,它可能以
\u id
顺序遍历所有50亿条记录,而不是以存储的数据顺序(即随机)来完成查询。因此,您最好构建一个从实际索引读取并直接写入的工具


对我来说,
--forceTableScan
就足够了,这意味着(a)它实际上成功地完成了,并且(b)它是一个数量级或者更快

在mongo shell中编写此查询,使用explain()查看查询计划是什么-可能是查询本身速度慢除了explain()的输出外,您还可以确认您使用的是哪个版本的MongoDB吗?您希望从50亿个源文档中获得多少输出结果?目前还不清楚~1000万个对象是否真的是您的完整结果集,因为最后一行引用了
元数据。json
通常是在给定集合的转储完成时发出的。您好,所以即使是.explain()也需要很长时间(几个小时以上)才能运行。这正常吗?我甚至尝试将.explain()简化为一个位置过滤器(如果x坐标和y坐标都在一个范围内),但仍然需要一段时间。将继续运行和更新。
[timestamp] Collection File Writing Progress: 10214400/5066505869 0% (objects)
[timestamp] Collection File Writing Progress: 10225100/5066505869 0% (objects)
[timestamp] 10228391 objects
[timestamp] Metadata for database.collection to dump/database/collection.metadata.json