簡體   English   中英

零件中的備份/還原集合

[英]Backup/Restore Collection in Parts

我目前正在使用AWS EC2服務器,並且抓取了一些存儲在MongoDB集合中的數據。 這是我數據庫中的唯一集合。

現在,我需要將此集合轉移到我的本地計算機上進行處理。 我的問題是我在遠程計算機上的剩余磁盤空間不足以轉儲整個集合。 有大約60%的收藏空間。 我嘗試使用主機名直接使用db.copy()db.export()在我的本地計算機上進行復制,但是由於我不在本地網絡上並且即使在一條ssh隧道。

我想做的是將我的大收藏夾分成2個較小的收藏夾,然后將它們分別傾倒。 可能嗎?

謝謝!

最好的選擇是使用mongodump僅收集一部分。 這也是“批量遷移”數據的最佳選擇,因此,如果您可以更改主機之間的網絡設置以允許這樣做,那么其中的使用部分可能會不適用於直接在主機之間工作。

如果只需要在集合的一部分上使用mongodump ,則通常情況是應用--query選項來選擇輸出。 輸出沒有“限制”修飾符,因此您需要應用“范圍查詢”運算符,分別為$lte$gt

作為一個簡單的示例集,請考慮以下數據:

{ "_id" : ObjectId("560e4a56a1a451fc8a37057f"), "list" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }
{ "_id" : ObjectId("560e4a62a1a451fc8a370581"), "list" : [ 1 ] }
{ "_id" : ObjectId("560e4a6ca1a451fc8a370582"), "list" : [ ] }

因此,其想法是在所需的“剪切點”處獲得_id值,並構造范圍查詢以僅選擇那些范圍內的文檔。 在此示例中,我們將輸出分成兩組。

因此,您想要的第一件事是第二個文檔的_id (在.skip() ),您可以通過在mongo shell中應用.skip().limit()來檢索它:

db.sample.find().sort({ "_id": 1 }).skip(1).limit(1)

那只是返回文檔:

{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }

這是通過將n-1文檔跳過到要在此批次中導出的編號,然后僅輸出最后一個文檔來完成的。

然后,已發行的mongodump將包含$lte的范圍選擇器,以達到該點:

mongodump -d test -c sample \
--query '{ "_id": { "$lte": { "$oid": "560e4a5ca1a451fc8a370580" } } }' \
--out part1

注意查詢中的$oid mongodumpmongoimport工具都使用MongoDB Extended JSON中描述的“嚴格”形式。 可用於外殼程序的輔助構造函數(例如ObjectId()不是“嚴格地JSON”,而mongodump (或帶有--query選項的任何東西)之類的工具僅使用JSON作為輸入,因此此類數據以這種形式表示。

對於下一點,您希望獲得可以放入轉儲中的下n文檔。 因此,您可以通過跳過已經輸出的n文檔以及到下一個截止點n-1的文檔數來查詢下一個文檔截止點,或者基本上( 2 + 2 -1 ) = 3

db.sample.find().sort({ "_id": 1 }).skip(3).limit(1)

甚至更好的是,將$gt的范圍應用到上次截止的日期:

db.sample.find({ "_id": { "$gt": ObjectId("560e4a5ca1a451fc8a370580") }}).skip(1).limit(1)

無論哪種方式,都可以獲取下一份截止文檔:

{ "_id" : ObjectId("560e4a6ca1a451fc8a370582"), "list" : [ ] }

然后對轉儲應用另一個范圍查詢,但是這次使用$gt$lte運算符“兩者”:

mongodump -d test -c sample \
--query '{ "_id": { 
    "$gt": { "$oid": "560e4a5ca1a451fc8a370580" },
    "$lte": { "$oid": "560e4a6ca1a451fc8a370582" } }}' \
--out part2

與每個部分一樣,您可以獲取數據並將其根據需要移至目標主機。 請注意,在這種形式下,-- --out指定文件所在的目錄

請注意,有些選項也可以在這里提供幫助,例如:

--host - (最好從mongorestore ),它可以讓你到另一個系統上運行的全過程。 因此,例如,您可以在新的目標MongoDB實例中運行以下命令,以將數據從原始主機直接管道傳輸到該系統上的mongorestore中:

mongodump --host orighost -d test -c sample \
--query '{ "_id": { 
    "$gt": { "$oid": "560e4a5ca1a451fc8a370580" },
    "$lte": { "$oid": "560e4a6ca1a451fc8a370582" } }}' \
--out - \
| mongorestore -d newtest -c newsample --dir -

注意-表示每個命令的標准輸出/輸入。

--gzip如果兩個主機上都具有MongoDB 3.2,則也可以利用此選項來壓縮/解壓縮數據輸出或流,如上面的管道中所示。 結合使用該管道選項,這將是將數據遷移到新目標主機的最有效方法。

至於一般的mongorestore ,但是您應用它,數據將很高興地重建集合,即使是部分也是如此。 一般行為被標記為“僅插入” ,因此不同的還原將“添加”到集合中,但絕不會“覆蓋”具有相同_id值的數據。

仔細查看選項。 特別是,如果您的主機系統都在EC2上,甚至都在通用雲資源中,那么就沒有理由不將輸出從一個管道直接傳遞到另一個管道。 所需要做的就是最多在允許的主機之間進行一點防火牆配置。

但是,無論如何,如果您只想備份“部分”數據,那么通常這就是進行備份的方法。

當然,根據您自己的設置和身份驗證需求,這兩個命令可能都需要此處顯示的其他選項。 這里的選項僅是“必需”選項,以便從“數據庫”中指定“集合”並使用“查詢”進行過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM