MongoDB-备份和恢复

一、工具介绍

(1)mongoexport/mongoimport   #导入/导出的是JSON格式或者CSV格式

(2)mongodump/mongorestore    #导入/导出的是BSON格式

二、备份工具区别

(1)JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。

(2)在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。跨版本的mongodump/mongorestore个人并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分时候是的)。

(3)JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。

三、应用场景

mongoexport/mongoimport:  json csv

  • 异构平台迁移 mysql <---> mongodb
  • 同平台,跨大版本:mongodb 2 ----> mongodb 3

mongodump/mongorestore:日常备份恢复使用

四、mongoexport/mongoimport工具

4.1、导出工具mongoexport

Mongodb中的mongoexport工具可以把一个collection导出成JSON格式(默认)或CSV格式的文件。

可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。适合如下场景:

  • (1)版本差异较大
  • (2)异构平台数据迁移

4.1.1、具体参数说明

$ mongoexport --help  

#参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase admin:验证库

4.1.2、应用例子

创建测试数据:

[mongod@mongo ~]$ mongo -u root -p root123 10.0.0.21/admin
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> use oldboy
switched to db oldboy
> for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}
WriteResult({ "nInserted" : 1 })
> db.log.find()
{ "_id" : ObjectId("5d9809219455703947fc9855"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.040Z") }
{ "_id" : ObjectId("5d9809219455703947fc9856"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.052Z") }
{ "_id" : ObjectId("5d9809219455703947fc9857"), "uid" : 2, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.053Z") }
{ "_id" : ObjectId("5d9809219455703947fc9858"), "uid" : 3, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.053Z") }
{ "_id" : ObjectId("5d9809219455703947fc9859"), "uid" : 4, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.054Z") }
{ "_id" : ObjectId("5d9809219455703947fc985a"), "uid" : 5, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.054Z") }
{ "_id" : ObjectId("5d9809219455703947fc985b"), "uid" : 6, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.055Z") }
{ "_id" : ObjectId("5d9809219455703947fc985c"), "uid" : 7, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.055Z") }
{ "_id" : ObjectId("5d9809219455703947fc985d"), "uid" : 8, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.056Z") }
{ "_id" : ObjectId("5d9809219455703947fc985e"), "uid" : 9, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.056Z") }
{ "_id" : ObjectId("5d9809219455703947fc985f"), "uid" : 10, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.057Z") }
{ "_id" : ObjectId("5d9809219455703947fc9860"), "uid" : 11, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.058Z") }
{ "_id" : ObjectId("5d9809219455703947fc9861"), "uid" : 12, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
{ "_id" : ObjectId("5d9809219455703947fc9862"), "uid" : 13, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
{ "_id" : ObjectId("5d9809219455703947fc9863"), "uid" : 14, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
{ "_id" : ObjectId("5d9809219455703947fc9864"), "uid" : 15, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
{ "_id" : ObjectId("5d9809219455703947fc9865"), "uid" : 16, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
{ "_id" : ObjectId("5d9809219455703947fc9866"), "uid" : 17, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
{ "_id" : ObjectId("5d9809219455703947fc9867"), "uid" : 18, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.061Z") }
{ "_id" : ObjectId("5d9809219455703947fc9868"), "uid" : 19, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.061Z") }
Type "it" for more
> 

1)单表备份至json格式

mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
#注意:备份文件的名字可以自定义,默认导出了JSON格式的数据

操作过程:

[mongod@mongo ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
2019-10-05T11:12:02.048+0800	connected to: localhost:27017
2019-10-05T11:12:02.406+0800	exported 10000 records
[mongod@mongo ~]$ ll /mongodb/log.json 
-rw-rw-r-- 1 mongod mongod 1278890 Oct  5 11:12 /mongodb/log.json
[mongod@mongo ~]$ head -2 /mongodb/log.json
{"_id":{"$oid":"5d9809219455703947fc9855"},"uid":0.0,"name":"mongodb","age":6.0,"date":{"$date":"2019-10-05T03:08:17.040Z"}}
{"_id":{"$oid":"5d9809219455703947fc9856"},"uid":1.0,"name":"mongodb","age":6.0,"date":{"$date":"2019-10-05T03:08:17.052Z"}}

2)单表备份至csv格式

#如果我们需要导出CSV格式的数据,则需要使用--type=csv参数:
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type=csv -f uid,name,age,date  -o /mongodb/log.csv

操作过程:

[mongod@mongo ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type csv -f uid,name,age,date -o /mongodb/log.csv
2019-10-05T11:17:21.864+0800	connected to: localhost:27017
2019-10-05T11:17:21.994+0800	exported 10000 records
[mongod@mongo ~]$ ll /mongodb/log.csv
-rw-rw-r-- 1 mongod mongod 398908 Oct  5 11:17 /mongodb/log.csv  ##excel表格形式(可以在window打开)
[mongod@mongo ~]$ head -5 /mongodb/log.csv 
uid,name,age,date
0,mongodb,6,2019-10-05T03:08:17.040Z
1,mongodb,6,2019-10-05T03:08:17.052Z
2,mongodb,6,2019-10-05T03:08:17.053Z
3,mongodb,6,2019-10-05T03:08:17.053Z

4. 2、导入工具mongoimport

Mongodb中的mongoimport工具可以把一个特定格式文件中的内容导入到指定的collection中。该工具可以导入JSON格式数据,也可以导入CSV格式数据。

4.2.1、具体参数说明

$ mongoimport --help

#参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导入那些列
-j, --numInsertionWorkers=<number>  number of insert operations to run concurrently                                                  (defaults to 1)
//并行

4.2.2、应用例子

1)恢复json格式表数据到log1

mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json

#查看:
mongo -uroot -proot123 10.0.0.21/admin
use oldboy
show tables
db.log1.find()

操作过程:

[mongod@mongo ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json 
2019-10-05T11:24:04.405+0800	connected to: localhost:27017
2019-10-05T11:24:04.616+0800	imported 10000 documents
[mongod@mongo ~]$ mongo -uroot -proot123 10.0.0.21/admin
MongoDB shell version v3.6.11-14-g48d999c
connecting to: mongodb://10.0.0.21:27017/admin?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("22f6f963-7f08-4a08-a674-eca7afb3ecdb") }
MongoDB server version: 3.6.11-14-g48d999c
> use oldboy
switched to db oldboy
> show tables
log
log1
> db.log1.find()
{ "_id" : ObjectId("5d9809219455703947fc9855"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.040Z") }
{ "_id" : ObjectId("5d9809219455703947fc9856"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.052Z") }
....
Type "it" for more
> 

2) 恢复csv格式的文件到log2

导入CSV格式文件中的内容,则需要通过--type参数指定导入格式

①当csv格式的文件头行,有列名字

mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log2 --type=csv --headerline --file  /mongodb/log.csv

#--headerline:指明第一行是列名,不需要导入。

②当csv格式的文件头行,没有列名字 ==>手工添加列名

mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log3 --type=csv -f id,name,age,date --file  /mongodb/log1.csv

3)案例:mysql表导入mongodb

示例:mysql 的world数据库下city表进行导出,导入到mongodb

#1、mysql开启安全路径
vim /etc/my.cnf
secure-file-priv=/tmp

#2、重启数据库生效
/etc/init.d/mysqld restart

#3、导出mysql的city表数据
source /root/world.sql
select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';  #指定分隔符

#4、处理备份文件
desc world.city得到表的列名称
vim /tmp/city.csv   #添加第一行列名信息
ID,Name,CountryCode,District,Population

#5、在mongodb中导入备份
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city1.csv

#6、登录mongodb查看
mongo -uroot -proot123 --port 27017
use world
db.city.find({CountryCode:"CHN"});

4) mysql表批量导入mongodb脚本

[root@db03 scripts]# cat  mysql_mongo.sh
#/bin/sh
DATABASE=world
[ ! -d /tmp/bak ] &&  mkdir /tmp/bak || rm -fr /tmp/bak/*
BACKDIR=/tmp/bak
chmod 777 $BACKDIR

for TABLE in  `mysql -e "show tables from ${DATABASE};"|sed '1d'`
do
	TABLE_HEAD="select COLUMN_NAME from information_schema.columns where TABLE_SCHEMA='${DATABASE}' and TABLE_NAME='${TABLE}' into outfile '$BACKDIR/${DATABASE}_${TABLE}.txt' fields terminated by ','  lines terminated by ',';"
	mysql -e "$TABLE_HEAD"
	sed -i -r 's#(.*).#1#g' $BACKDIR/${DATABASE}_${TABLE}.txt
done

#create data file
DATA_SQL="select * from (select concat("select * from ",table_schema,".",table_name ," into outfile '$BACKDIR/",table_schema,"_",table_name,".csv' fields terminated by ',';") from information_schema.tables where table_schema ='${DATABASE}') aa into outfile '$BACKDIR/bak_${DATABASE}.sql';"
mysql -e "$DATA_SQL"
mysql -e "source $BACKDIR/bak_${DATABASE}.sql;"
rm -f $BACKDIR/bak_${DATABASE}.sql

for TABLE in  `mysql -e "show tables from ${DATABASE};"|sed '1d'`
do
	HEAD=`cat $BACKDIR/${DATABASE}_${TABLE}.txt`
	sed -i "1i ${HEAD}" $BACKDIR/${DATABASE}_${TABLE}.csv
	mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d ${DATABASE}  -c ${TABLE} --type=csv --headerline  --file  $BACKDIR/${DATABASE}_${TABLE}.csv
	rm -f $BACKDIR/${DATABASE}_${TABLE}.txt
done

五、mongodump/mongorestore工具

5.1、介绍

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

5.2、mongodump用法

$ mongodump --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
-j, --numParallelCollections=  number of collections to dump in parallel (4 by default)
--oplog  备份的同时备份oplog

5.3、 mongodump和mongorestore基本使用

5.3.1、全库备份

mkdir /mongodb/backup
mongodump  -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup

[mongod@db03 mongodb]$ tree backup/
backup/
|-- admin
|   |-- system.users.bson
|   |-- system.users.metadata.json
|   |-- system.version.bson
|   `-- system.version.metadata.json
`-- world
    |-- city.bson				#bson格式数据
    |-- city.metadata.json		#json元数据
    |-- country.bson
    |-- country.metadata.json
    |-- countrylanguage.bson
    `-- countrylanguage.metadata.json

5.3.2、备份world库

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/

5.3.3、备份world库下的city集合

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup/

5.3.4、压缩备份

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/ --gzip			#压缩备份整个world数据库

[mongod@db03 backup]$ tree
.
`-- world
    |-- city.bson.gz
    |-- city.metadata.json.gz
    |-- country.bson.gz
    |-- country.metadata.json.gz
    |-- countrylanguage.bson.gz
`-- countrylanguage.metadata.json.gz

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup/ --gzip			#压缩备份数据库下的表

5.3.5、 恢复world库

mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1  /mongodb/backup/world

5.3.6、恢复world库下的city集合

mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city  --gzip  /mongodb/backup.bak/oldboy/log1.bson.gz

5.3.7、--drop表示恢复的时候把之前的集合drop掉(危险)

mongorestore  -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy

六、Oplog

注意:这是replica set或者master/slave模式专用

--oplog:use oplog for taking a point-in-time snapshot

6.1、oplog介绍

1)在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过--oplogSizeMB参数修改),位于local库的db.oplog.rs

2)其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。

3)当空间用完时新记录自动覆盖最老的记录。 #最好按全备的一个周期来设置

4)其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。

6.2、oplog查看

pkill mongod
pkill mongos

#启动复制集
mongod -f /mongodb/28017/conf/mongod.conf 
mongod -f /mongodb/28018/conf/mongod.conf 
mongod -f /mongodb/28019/conf/mongod.conf 
mongod -f /mongodb/28020/conf/mongod.conf

登录主库:
mongo --port 28017
my_repl:PRIMARY> use local
switched to db local
my_repl:PRIMARY> show tables
me
oplog.rs  #oplog
replset.election
replset.minvalid
startup_log
system.replset
system.rollback.id
my_repl:PRIMARY>  db.oplog.rs.find().pretty()
{
	"ts" : Timestamp(1553952478, 1), #相当于mysql中的GTID,在某秒下发生的第几个操作(时间戳序列号)
	"h" : NumberLong("-6103337942439244917"),	
	"v" : 2,
	"op" : "n",		#op代表当前操作的类型
	"ns" : "",
	"wall" : ISODate("2019-03-30T13:27:58.054Z"),
	"o" : {			#具体操作
		"msg" : "initiating set"
	}
}
……

#op的几种类型:
"i": insert
"u": update
"d": delete
"c": db cmd
"db":声明当前数据库
"n":no op,即空操作,会定期执行以确保实效性 

#查看具体op类型相关操作
db.oplog.rs.find({op: "i"}).pretty()	#查看insert操作
db.oplog.rs.find({op: "u"}).pretty()	#查看uodate操作

查看oplog窗口预计覆盖时间:

my_repl:PRIMARY> rs.printReplicationInfo()
configured oplog size:   2048MB					#集合大小
log length start to end: 1573secs (0.44hrs)		#预计窗口覆盖时间(一般设置两轮全备的大小)
oplog first event time:  Sat Mar 30 2019 21:27:58 GMT+0800 (CST)
oplog last event time:   Sat Mar 30 2019 21:54:11 GMT+0800 (CST)
now:                     Sat Mar 30 2019 21:54:14 GMT+0800 (CST)

6.3、oplog应用

实现热备,在备份时使用--oplog选项

1)准备测试数据

mongo --port 28017
use oldboy
for(var i = 1 ;i < 100; i++) {
    db.foo.insert({a:i});
}

#查看oplog变化
use local
db.oplog.rs.find({"op":"i"}).pretty()

2) oplog 配合mongodump实现热备

mongodump --port 28017 --oplog -o /mongodb/backup
#作用介绍:--oplog 会记录备份过程中的数据变化。会以oplog.bson保存下来

[mongod@db03 backup]$ mongodump --port 28017 --oplog -o /mongodb/backup
[mongod@db03 backup]$ ll
total 4
drwxrwxr-x 2 mongod mongod  69 Mar 30 22:06 admin
drwxrwxr-x 2 mongod mongod  47 Mar 30 22:06 oldboy
-rw-rw-r-- 1 mongod mongod 110 Mar 30 22:06 oplog.bson	#备份过程中产生的修改类操作(类似XBK备份)
drwxrwxr-x 2 mongod mongod 163 Mar 30 20:41 world

3)恢复

mongorestore  --port 28017 --oplogReplay /mongodb/backup		#表存在会报错
mongorestore  --port 28017 --oplogReplay --drop /mongodb/backup	#删除表后备份

4)查看

mongo --port 28017
use oldboy
db.foo.find()

6.4、oplog案例

6.4.1、背景

每天0点全备,oplog恢复窗口为48小时

某天,上午10点world.city 业务表被误删除

6.4.2、恢复思路

1、停应用

2、找测试库

3、恢复昨天晚上全备

4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库

5、将误删除表导出,恢复到生产库

6.4.3、恢复步骤

1)模拟故障环境

#1、模拟原始数据
[mongod@mongo backup]$ mongo --port 28017
my_repl:PRIMARY> use world
switched to db world
my_repl:PRIMARY> for(var i = 1 ;i < 20; i++) {db.city.insert({a: i});}
WriteResult({ "nInserted" : 1 })
my_repl:PRIMARY> show tables
city
my_repl:PRIMARY> db.city.find()
{ "_id" : ObjectId("5d983997fad4d5a54c3147a1"), "a" : 1 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a2"), "a" : 2 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a3"), "a" : 3 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a4"), "a" : 4 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a5"), "a" : 5 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a6"), "a" : 6 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a7"), "a" : 7 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a8"), "a" : 8 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147a9"), "a" : 9 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147aa"), "a" : 10 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147ab"), "a" : 11 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147ac"), "a" : 12 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147ad"), "a" : 13 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147ae"), "a" : 14 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147af"), "a" : 15 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147b0"), "a" : 16 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147b1"), "a" : 17 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147b2"), "a" : 18 }
{ "_id" : ObjectId("5d983997fad4d5a54c3147b3"), "a" : 19 }

#2、执行全备
[mongod@mongo backup]$ rm -rf /mongodb/backup/*
[mongod@mongo backup]$ mongodump --port 28017 --oplog -o /mongodb/backup
#--oplog功能:在备份同时,将备份过程中产生的日志进行备份.文件必须存放在/mongodb/backup下,自动命令为oplog.bson

#3、再次模拟数据
[mongod@mongo backup]$ mongo --port 28017
my_repl:PRIMARY> use world
switched to db world
my_repl:PRIMARY> db.city1.insert({id:1})
WriteResult({ "nInserted" : 1 })
my_repl:PRIMARY> db.city2.insert({id:2})
WriteResult({ "nInserted" : 1 })
my_repl:PRIMARY> show tables
city
city1
city2
my_repl:PRIMARY> db.city1.find()
{ "_id" : ObjectId("5d983a5fdce58094f164378b"), "id" : 1 }
my_repl:PRIMARY> db.city2.find()
{ "_id" : ObjectId("5d983a61dce58094f164378c"), "id" : 2 }

2)模拟10点误删除表city

[mongod@mongo backup]$ mongo --port 28017
my_repl:PRIMARY> use world
switched to db world
my_repl:PRIMARY> db.city.drop()
true
my_repl:PRIMARY> show tables;
city1
city2

3)备份现有的oplog.rs表

[mongod@mongo backup]$ mongodump --port 28017 -d local -c oplog.rs  -o /mongodb/backup
2019-10-05T14:40:54.659+0800	writing local.oplog.rs to 
2019-10-05T14:40:54.665+0800	done dumping local.oplog.rs (2150 documents)
[mongod@mongo backup]$ ll
total 4
drwxrwxr-x 2 mongod mongod  69 Oct  5 14:36 admin
drwxrwxr-x 2 mongod mongod  57 Oct  5 14:40 local
-rw-rw-r-- 1 mongod mongod 110 Oct  5 14:36 oplog.bson
drwxrwxr-x 2 mongod mongod  49 Oct  5 14:36 world
[mongod@mongo backup]$ cd local/
[mongod@mongo local]$ ll
total 292
-rw-rw-r-- 1 mongod mongod 292559 Oct  5 14:40 oplog.rs.bson
-rw-rw-r-- 1 mongod mongod    125 Oct  5 14:40 oplog.rs.metadata.json

4)登录原数据库,截取oplog到drop之前的位置

[mongod@mongo local]$ mongo --port 28017
my_repl:PRIMARY> use local
db.oplog.rs.find({op:"c"}).pretty();

{
	"ts" : Timestamp(1570257582, 1),  #删除时间点
	"t" : NumberLong(2),
	"h" : NumberLong("5961626649005236896"),
	"v" : 2,
	"op" : "c",
	"ns" : "world.$cmd",
	"ui" : UUID("394fa2d3-1609-4946-8254-3e5e657b5447"),
	"wall" : ISODate("2019-10-05T06:39:42.558Z"),
	"o" : {
		"drop" : "city"
	}
}

5)恢复备份,应用oplog

[mongod@mongo local]$ ls
oplog.rs.bson  oplog.rs.metadata.json
[mongod@mongo local]$ cp oplog.rs.bson ../oplog.bson 
[mongod@mongo local]$ cd ../
[mongod@mongo backup]$ rm -fr local
[mongod@mongo backup]$ mongorestore --port 28017  --oplogReplay --oplogLimit "1570257582:1"  --drop   /mongodb/backup/

6)查看备份的数据

[mongod@mongo local]$ mongo --port 28017
my_repl:PRIMARY> use world
switched to db world
my_repl:PRIMARY> show tables
city
city1
city2
my_repl:PRIMARY> db.city.findOne()
{ "_id" : ObjectId("5d983997fad4d5a54c3147a1"), "a" : 1 }
原文地址:https://www.cnblogs.com/hujinzhong/p/11624095.html