2013-07-26 45 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