2013-07-26 114 views
1

我正在连接到远程MongoDB服务器,将其中的所有项目导入本地数据库,然后清除它。导入并清除MongoDB数据库

有没有更安全,更有效的方法来做到这一点?

mongoexport -h 1.2.3.4 -d foo -c bar | mongoimport -d foo -c bar 
mongo 1.2.3.4/foo --eval "db.bar.remove()" 
mongo 1.2.3.4/foo --eval "db.repairDatabase()" # To free up disk space 

远程数据库比我要导入的远小得多,所以复制似乎不是一个选项。

+0

只是为了澄清,您的远程数据库非常小,所以您使用它来捕获数据一段时间,然后将该数据移动到本地服务器,它具有更多的磁盘空间?那是对的吗?另外,你的应用程序的性质是什么? – sfritter

+0

@sfritter:是的。这是一台带有8GB磁盘空间的Amazon EC2服务器,用于汇总数据。 – Blender

+0

你能告诉我更多关于你的用例吗?例如,在移动数据后,数据如何处理以及哪种应用程序与Amazon实例进行交互。有更高效的方法来完成你正在做的事情,但我对你的使用案例了解得越多,我可以建议你越好:) – sfritter

回答

1

嗯,我想我会先从使用mongoexport/mongoimport切换到使用mongodump/mongorestore。与mongoexport不同,Mongodump速度更快,并且还将保留所有丰富的BSON数据类型。

此外,命令db.bar.remove()将通过文件通过您的收集文件,并删除每一个。既然你真的想摆脱一切,你可以更快地做到这一点dropping the entire collection批发db.bar.drop()。这要快得多。但是,删除集合还会删除为其构建的任何索引,因此您需要在之后重新创建这些索引。

在每次迁移后,不应该有必要运行db.repairDatabase(),因为MongoDB将回收已释放的空间来删除​​集合。你可以做的是使用compacthttp://docs.mongodb.org/manual/reference/command/compact/)对释放的空间进行碎片整理。此外,您可以尝试使用此集合的usePowerOf2Sizes标志,这将有助于MongoDB更有效地重用空间(http://docs.mongodb.org/manual/reference/command/collMod/)。

复制不是你要找的。通过复制,我们运行多个服务器,这些服务器都包含相同数据的副本,而不是数据集的子集。这主要用于灾难恢复和故障转移,对您的情况无效。

+0

'mongodump' /'mongorestore'是合并数据库还是替换它们? – Blender

+0

除非使用'--drop'选项,否则mongorestore会合并您的数据。 – sfritter