【MongoDB学习笔记】6:数据备份(mongodump)与恢复(mongorestore)流程

版权声明:本文为博主原创学习笔记,如需转载请注明来源。 https://blog.csdn.net/SHU15121856/article/details/81660357

备份数据

要备份某个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 }
>

猜你喜欢

转载自blog.csdn.net/SHU15121856/article/details/81660357