咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

MongoDb备份&恢复数据

记录通过命令行备份和恢复的过程

本地备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
Welcome to the MongoDB shell.
> show dbs
admin 0.000GB
mshop 0.000GB
jeel 0.001GB
local 0.000GB
home 0.001GB
pymongo_test 0.000GB
> exit
bye
$ mongodump -h localhost -d mshop -o ./
$ mongodump -h localhost -d pymongo_test -o ./
$ ls
mshop pymongo_test

这里备份了两个数据库,分别在两个目录下。

这里是将两个目录迁移到另外一个服务器,执行以下操作:

1
2
3
4
$ cd mshop
$ mongorestore -h localhost -d mshop ./
$ cd ../pymongo_test
$ mongorestore -h localhost -d pymongo_test ./

授权模式

如果mongodb开启了授权模式,则需要用户和密码,按照以下格式输入:

1
$ mongodump -h localhost -d mshop --username zhangsan --password '123456' --port 3717 -o ./

远程服务器

如果出现以下错误:

Failed: error writing data for collection test.user to disk: error reading collection: Failed to parse: { find: “user”, skip: 0, snapshot: true, $readPreference: { mode: “secondaryPreferred” }, $db: “test” }. Unrecognized field ‘snapshot’.

是因为本地mongodump版本和数据库的不一样,这种问题一般出现远程数据库服务器。解决办法有两种:

  • 修改mongodump的版本和目标数据库一样
  • --forceTableScan 强制备份
1
$ mongodump -h localhost -d mshop --username zhangsan --password '123456' --port 3717 --forceTableScan -o ./

恢复数据至Docker镜像

1
2
3
4
5
6
# 拷贝数据data到镜像
docker cp data/ <IMAGE_NAME>:/home/dump
# 进入镜像的bash环境
docker exec -it <IMAGE_NAME> /bin/bash
# 恢复数据
mongorestore -d mytestdb -u root -p=123456 /home/dump --authenticationDatabase admin

【Docker备份恢复参考】