![](/img/trans.png)
[英]in mongodb is it possible to backup and restore a specific collection in database?
[英]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
。 mongodump
和mongoimport
工具都使用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.