跳转至

8. 备份恢复-mongodump

1. 备份工具mongodump介绍

#1.mongodump能够在mongodb运行时进行备份
#2.它的工作原理是对运行的mongodb做查询,然后将所有查到的文档写入磁盘。
#3.但存在的问题是,使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时,对数据库进行了写入操作,则备份出来的文件可能不完全和mongodb实时数据相等。
#4.另外,在备份时可能会对其他客户端性能产生不利的影响。

2. mongodump参数说明

$mongodump --help
-h:IP
-u:用户名
-p:密码
--port:端口
--authenticationDatabase admin #指明验证库
-d:库名
-c:集合名
-o:导出的路径
-q:指明导出数据的过滤条件
-j,--numParallelCollections=number of collections to dump in parallel (4 by default) #此行数据不知道干啥的。
--oplog #备份的同时备份oplog

3. 全库备份

mkdir /mongodb/backup -p

mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
[mongod@151 ~]$ mkdir /mongodb/backup -p
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
2021-05-13T14:49:31.202+0800    writing admin.system.users to
2021-05-13T14:49:31.204+0800    done dumping admin.system.users (3 documents)
2021-05-13T14:49:31.204+0800    writing admin.system.version to
2021-05-13T14:49:31.206+0800    done dumping admin.system.version (1 document)
2021-05-13T14:49:31.206+0800    writing oldboy.log1 to
2021-05-13T14:49:31.207+0800    writing oldboy.log4 to
2021-05-13T14:49:31.207+0800    writing oldboy.log2 to
2021-05-13T14:49:31.208+0800    writing app.log to
2021-05-13T14:49:31.725+0800    done dumping app.log (10000 documents)
2021-05-13T14:49:31.725+0800    writing oldboy.log3 to
2021-05-13T14:49:31.766+0800    done dumping oldboy.log4 (10001 documents)
2021-05-13T14:49:31.767+0800    writing world.city to
2021-05-13T14:49:31.811+0800    done dumping world.city (4079 documents)
2021-05-13T14:49:31.811+0800    writing app.b to
2021-05-13T14:49:31.914+0800    done dumping app.b (1 document)
2021-05-13T14:49:31.914+0800    writing test.t1 to
2021-05-13T14:49:31.920+0800    done dumping oldboy.log2 (10000 documents)
2021-05-13T14:49:31.920+0800    writing app.a to
2021-05-13T14:49:31.934+0800    done dumping test.t1 (1 document)
2021-05-13T14:49:31.934+0800    done dumping app.a (1 document)
2021-05-13T14:49:32.065+0800    done dumping oldboy.log3 (10000 documents)
2021-05-13T14:49:32.141+0800    done dumping oldboy.log1 (20000 documents)
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
admin  app  oldboy  test  world
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/oldboy/
log1.bson           log2.bson           log3.bson           log4.bson
log1.metadata.json  log2.metadata.json  log3.metadata.json  log4.metadata.json
[mongod@151 ~]$

4. 单库备份

mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -o /mongodb/backup
[mongod@151 ~]$ rm -rf /mongodb/backup/*
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -o /mongodb/backup
2021-05-13T14:51:18.886+0800    writing test.t1 to
2021-05-13T14:51:18.888+0800    done dumping test.t1 (1 document)
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
test
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/test/
t1.bson  t1.metadata.json

5. 单表备份

mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup
[mongod@151 ~]$ rm -rf /mongodb/backup/*
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup
2021-05-13T14:52:10.053+0800    writing world.city to
2021-05-13T14:52:10.070+0800    done dumping world.city (4079 documents)
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
world
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/world/
city.bson  city.metadata.json

6. 压缩备份单库

mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -o /mongodb/backup --gzip
[mongod@151 ~]$ rm -rf /mongodb/backup/*
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -o /mongodb/backup --gzip
2021-05-13T14:53:00.274+0800    writing app.log to
2021-05-13T14:53:00.275+0800    writing app.b to
2021-05-13T14:53:00.276+0800    writing app.a to
2021-05-13T14:53:00.336+0800    done dumping app.log (10000 documents)
2021-05-13T14:53:00.337+0800    done dumping app.b (1 document)
2021-05-13T14:53:00.340+0800    done dumping app.a (1 document)
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
app
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/app/
a.bson.gz  a.metadata.json.gz  b.bson.gz  b.metadata.json.gz  log.bson.gz  log.metadata.json.gz
[mongod@151 ~]$

7. 压缩备份单表

mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup --gzip
[mongod@151 ~]$ rm -rf /mongodb/backup/*
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup --gzip
2021-05-13T14:54:05.450+0800    the collection oldboy.log appears to have been dropped after the dump started
2021-05-13T14:54:05.450+0800    writing oldboy.log to
2021-05-13T14:54:05.453+0800    done dumping oldboy.log (0 documents)
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup
oldboy
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/oldboy/
log.bson.gz

8. 恢复工具mongorestore(参数与mongodump基本一致)

#与备份工具参数基本一样
--drop  #删除原来的库

9. 恢复单库

#恢复world到world1
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world
[mongod@151 ~]$ rm -rf /mongodb/backup/*
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
2021-05-13T14:55:33.252+0800    writing admin.system.users to
2021-05-13T14:55:33.254+0800    done dumping admin.system.users (3 documents)
2021-05-13T14:55:33.254+0800    writing admin.system.version to
2021-05-13T14:55:33.255+0800    done dumping admin.system.version (1 document)
2021-05-13T14:55:33.255+0800    writing oldboy.log1 to
2021-05-13T14:55:33.256+0800    writing oldboy.log4 to
2021-05-13T14:55:33.256+0800    writing oldboy.log2 to
2021-05-13T14:55:33.257+0800    writing app.log to
2021-05-13T14:55:33.339+0800    done dumping oldboy.log4 (10001 documents)
2021-05-13T14:55:33.339+0800    writing oldboy.log3 to
2021-05-13T14:55:33.371+0800    done dumping oldboy.log1 (20000 documents)
2021-05-13T14:55:33.371+0800    writing world.city to
2021-05-13T14:55:33.415+0800    done dumping oldboy.log3 (10000 documents)
2021-05-13T14:55:33.415+0800    writing app.b to
2021-05-13T14:55:33.438+0800    done dumping world.city (4079 documents)
2021-05-13T14:55:33.438+0800    writing test.t1 to
2021-05-13T14:55:33.470+0800    done dumping oldboy.log2 (10000 documents)
2021-05-13T14:55:33.470+0800    writing app.a to
2021-05-13T14:55:33.502+0800    done dumping app.log (10000 documents)
2021-05-13T14:55:33.502+0800    done dumping app.b (1 document)
2021-05-13T14:55:33.502+0800    done dumping test.t1 (1 document)
2021-05-13T14:55:33.504+0800    done dumping app.a (1 document)
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
admin  app  oldboy  test  world
#恢复单库
[mongod@151 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world
2021-05-13T14:56:10.143+0800    building a list of collections to restore from /mongodb/backup/world dir
2021-05-13T14:56:10.144+0800    reading metadata for world1.city from /mongodb/backup/world/city.metadata.json
2021-05-13T14:56:10.156+0800    restoring world1.city from /mongodb/backup/world/city.bson
2021-05-13T14:56:10.319+0800    restoring indexes for collection world1.city from metadata
2021-05-13T14:56:10.320+0800    finished restoring world1.city (4079 documents)
2021-05-13T14:56:10.320+0800    done
[mongod@151 ~]$
#登录查看
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> show dbs
admin   0.000GB
app     0.000GB
local   0.000GB
oldboy  0.002GB
test    0.000GB
world   0.000GB
world1  0.000GB
>
> use world1
switched to db world1
>
> show tables
city
>
> exit
bye

10. 恢复压缩的单表

#恢复oldguo.t1
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy1 -c  t1 --gzip  /mongodb/backup/oldboy/log.bson.gz
#1.创建压缩备份
[mongod@151 ~]$ rm -rf /mongodb/backup/*
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup --gzip
2021-05-13T14:59:04.300+0800    the collection oldboy.log appears to have been dropped after the dump started
2021-05-13T14:59:04.300+0800    writing oldboy.log to
2021-05-13T14:59:04.302+0800    done dumping oldboy.log (0 documents)
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
oldboy
[mongod@151 ~]$ ls /mongodb/backup/oldboy/
log.bson.gz

#2.恢复单表
[mongod@151 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy1 -c  t1 --gzip  /mongodb/backup/oldboy/log.bson.gz
2021-05-13T15:00:37.667+0800    checking for collection data in /mongodb/backup/oldboy/log.bson.gz
2021-05-13T15:00:37.677+0800    restoring oldboy1.t1 from /mongodb/backup/oldboy/log.bson.gz
2021-05-13T15:00:37.749+0800    no indexes to restore
2021-05-13T15:00:37.749+0800    finished restoring oldboy1.t1 (0 documents)
2021-05-13T15:00:37.749+0800    done
[mongod@151 ~]$

#3.登录查看
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> show dbs
admin    0.000GB
app      0.000GB
local    0.000GB
oldboy   0.002GB
oldboy1  0.000GB
test     0.000GB
world    0.000GB
world1   0.000GB
>
> use oldboy1
switched to db oldboy1
>
> show tables
t1
>
> db.t1.count()
0
> exit
bye

11. 恢复到原来的库,删除之前的库

#恢复时,强制删除以前的库
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world --drop /mongodb/backup/world

#验证得知,--drop是删除 /mongodb/backup/world 目录中有的表,表信息更改,恢复后数据丢失,如果新建的表,则删除不了,恢复后信标还在!!!
#1.创建全库备份
[mongod@151 ~]$ rm -rf /mongodb/backup/*
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
[mongod@151 ~]$
[mongod@151 ~]$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
2021-05-13T15:16:11.854+0800    writing admin.system.users to
2021-05-13T15:16:11.856+0800    done dumping admin.system.users (3 documents)
2021-05-13T15:16:11.856+0800    writing admin.system.version to
2021-05-13T15:16:11.857+0800    done dumping admin.system.version (1 document)
2021-05-13T15:16:11.857+0800    writing oldboy.log1 to
2021-05-13T15:16:11.859+0800    writing oldboy.log4 to
2021-05-13T15:16:11.860+0800    writing oldboy.log2 to
2021-05-13T15:16:11.860+0800    writing app.log to
2021-05-13T15:16:12.084+0800    done dumping app.log (10000 documents)
2021-05-13T15:16:12.085+0800    writing oldboy.log3 to
2021-05-13T15:16:12.187+0800    done dumping oldboy.log2 (10000 documents)
2021-05-13T15:16:12.187+0800    writing world.city to
2021-05-13T15:16:12.210+0800    done dumping oldboy.log4 (10001 documents)
2021-05-13T15:16:12.211+0800    writing world1.city to
2021-05-13T15:16:12.321+0800    done dumping world1.city (4079 documents)
2021-05-13T15:16:12.321+0800    writing app.a to
2021-05-13T15:16:12.367+0800    done dumping world.city (4079 documents)
2021-05-13T15:16:12.368+0800    writing app.b to
2021-05-13T15:16:12.390+0800    done dumping oldboy.log1 (20000 documents)
2021-05-13T15:16:12.390+0800    writing test.t1 to
2021-05-13T15:16:12.390+0800    done dumping app.a (1 document)
2021-05-13T15:16:12.391+0800    writing oldboy1.t1 to
2021-05-13T15:16:12.404+0800    done dumping oldboy.log3 (10000 documents)
2021-05-13T15:16:12.404+0800    done dumping app.b (1 document)
2021-05-13T15:16:12.406+0800    done dumping test.t1 (1 document)
2021-05-13T15:16:12.406+0800    done dumping oldboy1.t1 (0 documents)
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/backup/
admin  app  oldboy  oldboy1  test  world  world1
[mongod@151 ~]$ ls /mongodb/backup/world
city.bson  city.metadata.json

#2.在world库下新加几张表
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> use world
switched to db world
>
> show tables
city
>
> db.t1.insert({id:1})
WriteResult({ "nInserted" : 1 })
>
> db.t2.insert({id:1})
WriteResult({ "nInserted" : 1 })
>
> show tables
city
t1
t2
>
> exit
bye

#3.恢复world库,并删除原来的库
[mongod@151 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world --drop /mongodb/backup/world
2021-05-13T15:18:41.878+0800    building a list of collections to restore from /mongodb/backup/world dir
2021-05-13T15:18:41.883+0800    reading metadata for world.city from /mongodb/backup/world/city.metadata.json
2021-05-13T15:18:41.895+0800    restoring world.city from /mongodb/backup/world/city.bson
2021-05-13T15:18:42.059+0800    restoring indexes for collection world.city from metadata
2021-05-13T15:18:42.060+0800    finished restoring world.city (4079 documents)
2021-05-13T15:18:42.060+0800    done

#4.再次登录,查看world库
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> use world
switched to db world
>
> show tables
city
t1
t2

#失败。分析,应该是因为还原的表,所以没有删除库里面其他的信息,--drop应该是删除原来的表。再次修改表信息
> db.city.insert({id:00001})
WriteResult({ "nInserted" : 1 })
>
> db.city.insert({id:00002})
WriteResult({ "nInserted" : 1 })
>
> db.city.count()
4081
>
> exit
bye

#5.再次还原后,查看表中数据
[mongod@151 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world --drop /mongodb/backup/world
2021-05-13T15:21:49.471+0800    building a list of collections to restore from /mongodb/backup/world dir
2021-05-13T15:21:49.474+0800    reading metadata for world.city from /mongodb/backup/world/city.metadata.json
2021-05-13T15:21:49.483+0800    restoring world.city from /mongodb/backup/world/city.bson
2021-05-13T15:21:49.648+0800    restoring indexes for collection world.city from metadata
2021-05-13T15:21:49.649+0800    finished restoring world.city (4079 documents)
2021-05-13T15:21:49.649+0800    done
[mongod@151 ~]$
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> use world
switched to db world
>
> show tables
city
t1
t2
>
> db.city.count()
4079
>
> exit
bye

#成功!!!

12. 恢复到原来的表,删除原来的表(见上一条!略)

mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c vast --drop /mongodb/backup/app/vast.bson

最后更新: 2022-02-20 11:21:58