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