【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 }
>