1. 程式人生 > >【MongoDB學習筆記】6:資料備份(mongodump)與恢復(mongorestore)流程

【MongoDB學習筆記】6:資料備份(mongodump)與恢復(mongorestore)流程

備份資料

要備份某個DB中的全部Collection,相當於備份RDBMS中某個Schema下的全部Table。比如想要備份這個DB:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
lzh     0.000GB
> use lzh
switched to db lzh
> show collections
lzhCllctn1
lzhCllctn2
>

可以看到裡面有兩個Collection,其內容是:

> db.lzhCllctn1.find()
{ "_id" : ObjectId("5b29dedaf5b9d062d3a61e61"
), "a" : 1 } { "_id" : ObjectId("5b29dedcf5b9d062d3a61e62"), "a" : 3 } { "_id" : ObjectId("5b29dedef5b9d062d3a61e63"), "a" : 4 } { "_id" : ObjectId("5b29dee1f5b9d062d3a61e64"), "a" : 3 } { "_id" : ObjectId("5b29dee8f5b9d062d3a61e65"), "a" : 2 } > db.lzhCllctn2.find() { "_id" : ObjectId("5b7228c13aa65dd2c182efe5"
), "b" : 6 } >

MongoDB安裝目錄/Server/版本號/bin/目錄開啟OS的CLI,使用:

mongodump -h 主機:埠 -d DB名 -o 備份目錄

這裡寫圖片描述
從CLI的提示上可以看到是將各個Collection寫入磁碟上指定的備份目錄裡,在備份目錄下可以看到以該DB名為目錄建立了一個DB子目錄,裡面是備份檔案
這裡寫圖片描述

恢復資料

如果刪除了這個DB:

> use lzh
switched to db lzh
> db.drop
db.dropAllRoles(  db.dropDatabase(  db.dropUser(
db.dropAllUsers
( db.dropRole( > db.dropDatabase() { "dropped" : "lzh", "ok" : 1 } > show dbs admin 0.000GB config 0.000GB local 0.000GB >

要從備份的資料恢復,還是去那個目錄,使用:

mongorestore -h 主機:埠 -d 要採用的DB名 備份目錄下的db子目錄

這裡寫圖片描述
這時CLI上的輸出比較複雜,分成幾段解讀一下。

橙色部分說的是,只有從BSON檔案恢復時才應當使用--db--collection引數,其它情況下不應該用它們,而是用--nsInclude引數代替。國內沒有人提這個,我在這裡找到了一個外國人提出的關於這個引數的疑問。

紫色部分做的是,根據磁碟上的這個備份目錄的DB子目錄裡的備份檔案,建立了要恢復的Collection,其實就只是根據這些備份檔名來建立Collection的名字。

藍色部分是在說,每個Collection在磁碟上都額外有一個元資料JSON檔案,而這一步就是從元資料檔案中獲取了這個Collection的一些相關資訊,這個.metadata.json檔案存的並不是Collection中的具體資料,開啟看一下:

{"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"lzh.lzhCllctn1"}],"uuid":"843eb47c05b447ab94dd446bb3dfed3e"}

這個元資料檔案裡存了這個Collection的選項、索引資訊、通用唯一識別碼。這部分做完,所有的Collection就已經配置好了,接下來就只需要往裡放資料了。

綠色部分做的是,依次根據.bson檔案中存的Collection中的資訊(各個文件),來向已經建立好的Collection寫入資訊。前面學過,MongoDB中資料就是以BSON的格式儲存的,所以這種恢復方式是原生的,能恢復任何從MongoDB匯出的資料。但是如果是從.json或者.csv檔案來恢復,就不能保證了,JSON所能表示的資料是BSON的一個子集,CSV就更不用提了。

當綠色部分一個個執行完,就是把所有的Collection資料都匯入了,綠松石綠部分表示這次恢復已經全部完成了。

在資料庫中看一下,已經恢復了整個DB並採用了指定的DB名:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
newlzh  0.000GB
> use newlzh
switched to db newlzh
> show collections
lzhCllctn1
lzhCllctn2
> db.lzhCllctn1.find()
{ "_id" : ObjectId("5b29dedaf5b9d062d3a61e61"), "a" : 1 }
{ "_id" : ObjectId("5b29dedcf5b9d062d3a61e62"), "a" : 3 }
{ "_id" : ObjectId("5b29dedef5b9d062d3a61e63"), "a" : 4 }
{ "_id" : ObjectId("5b29dee1f5b9d062d3a61e64"), "a" : 3 }
{ "_id" : ObjectId("5b29dee8f5b9d062d3a61e65"), "a" : 2 }
> db.lzhCllctn2.find()
{ "_id" : ObjectId("5b7228c13aa65dd2c182efe5"), "b" : 6 }
>