mongodb异机做时间点恢复(异机建议部署免密登录)

环境:
OS:Centos 7
DB:mongodb 5
原环境:1主2从,异机恢复的环境:单机(oplog.rs是否开启都可以,开启可以参考:https://www.cnblogs.com/hxlasky/p/17979922)

 

1.查看当前的表数据情况

myrepl:PRIMARY> use db_pushmsg;
switched to db db_pushmsg
myrepl:PRIMARY> show tables;
app_message_all
tb_test
myrepl:PRIMARY> db.app_message_all.find().count()
100000

 

2.备份
在主库上进行备份,备份整个库

[root@dsc1 bin]# /opt/mongodb-database-tools/bin/mongodump -h 192.168.56.101:29001 -u test -p test123 --authenticationDatabase admin --db=db_pushmsg -o /tmp/bak
2024-04-26T15:38:47.244+0800    writing db_pushmsg.tb_test to /tmp/bak/db_pushmsg/tb_test.bson
2024-04-26T15:38:47.247+0800    writing db_pushmsg.app_message_all to /tmp/bak/db_pushmsg/app_message_all.bson
2024-04-26T15:38:47.249+0800    done dumping db_pushmsg.tb_test (1 document)
2024-04-26T15:38:47.843+0800    done dumping db_pushmsg.app_message_all (100000 documents)

 

3.模拟删除表
myrepl:PRIMARY> db.app_message_all.drop()
true

 

4.导出oplog.rs
用于异机数据恢复

[root@dsc1 bin]# mkdir /tmp/oplog
[root@dsc1 bin]# /opt/mongodb-database-tools/bin/mongodump -h 192.168.56.101:29001 -u test -p test123 --authenticationDatabase admin --db=local -c oplog.rs -o /tmp/oplog
2024-04-26T15:43:39.241+0800    writing local.oplog.rs to /tmp/oplog/local/oplog.rs.bson
2024-04-26T15:43:39.889+0800    done dumping local.oplog.rs (101776 documents)

 

该导出会导出整个oplog.rs日志,不单是需要恢复的表app_message_all的日志而已,恢复的时候也会把其他的表一起恢复的.

5.找到需要恢复的时间点

将oplog.rs日志导出文件
/opt/mongodb-database-tools/bin/bsondump /tmp/oplog/local/oplog.rs.bson>/tmp/oplog.txt

从文件 /tmp/oplog.txt 查找删除表前的记录

{"op":"c","ns":"db_pushmsg.$cmd","ui":{"$binary":{"base64":"AC6b29lJS6m2yN7KavT6jA==","subType":"04"}},"o":{"drop":"app_message_all"},"o2":{"numRecords":{"$numberInt":"100000"}},"ts":{"$timestamp":{"t":1714117217,"i":1}},"t":{"$numberLong":"2"},"v":{"$numberLong":"2"},"wall":{"$date":{"$numberLong":"1714117217783"}}}

 

我们这里需要恢复删除的时间点:1714117217(不含该时间点)

 

6.把备份文件和oplog文件拷贝到需要恢复的服务器
[root@dsc1 tmp]# tar -cvf bak.tar ./bak
[root@dsc1 tmp]# tar -cvf oplog.tar ./oplog

[root@dsc1 tmp]#scp bak.tar root@192.168.56.103:/tmp/
[root@dsc1 tmp]#scp oplog.tar root@192.168.56.103:/tmp/

 

7.异机解压备份文件
[root@localhost tmp]# cd /tmp
[root@localhost tmp]# tar -xvf bak.tar
[root@localhost tmp]# tar -xvf oplog.tar

 

8.恢复
异机当前是没有需要恢复的库的

/opt/mongodb/bin/mongo 192.168.56.103:27001
> use admin
switched to db admin
> db.auth("test","test123");
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

 

恢复数据库

[root@localhost ~]# /opt/mongodb-database-tools/bin/mongorestore -h 192.168.56.103:27001 -u test -p test123 --authenticationDatabase admin -d db_pushmsg /tmp/bak/db_pushmsg
2024-04-26T16:23:18.690+0800    The --db and --collection flags are deprecated for this use-case; please use --nsInclude instead, i.e. with --nsInclude=${DATABASE}.${COLLECTION}
2024-04-26T16:23:18.690+0800    building a list of collections to restore from /tmp/bak/db_pushmsg dir
2024-04-26T16:23:18.690+0800    reading metadata for db_pushmsg.app_message_all from /tmp/bak/db_pushmsg/app_message_all.metadata.json
2024-04-26T16:23:18.690+0800    reading metadata for db_pushmsg.tb_test from /tmp/bak/db_pushmsg/tb_test.metadata.json
2024-04-26T16:23:18.713+0800    restoring db_pushmsg.app_message_all from /tmp/bak/db_pushmsg/app_message_all.bson
2024-04-26T16:23:18.797+0800    restoring db_pushmsg.tb_test from /tmp/bak/db_pushmsg/tb_test.bson
2024-04-26T16:23:18.810+0800    finished restoring db_pushmsg.tb_test (1 document, 0 failures)
2024-04-26T16:23:20.416+0800    finished restoring db_pushmsg.app_message_all (100000 documents, 0 failures)
2024-04-26T16:23:20.416+0800    no indexes to restore for collection db_pushmsg.app_message_all
2024-04-26T16:23:20.416+0800    no indexes to restore for collection db_pushmsg.tb_test
2024-04-26T16:23:20.416+0800    100001 document(s) restored successfully. 0 document(s) failed to restore.

 

8.恢复oplog到时间戳(建议异机免密登录)
/opt/mongodb-database-tools/bin/mongorestore -h 192.168.56.103:27001 -u test -p test123 --authenticationDatabase admin --oplogReplay --oplogLimit "1714117217:1" /tmp/oplog/local/oplog.rs.bson

这里恢复需要指定具体的文件名:/tmp/oplog/local/oplog.rs.bson,而不是目录

说明:

--oplogLimit "1714117217:1" 

恢复结束的时间点,不包含该时间点

 

报错误:
2024-04-26T16:55:03.941+0800 Failed: restore error: error applying oplog: applyOps: (Unauthorized) command applyOps requires authentication
但第二次执行的时候就正常了,应该是我这里的oplog有其他的操作.

 

posted @ 2024-04-26 17:40  slnngk  阅读(6)  评论(0编辑  收藏  举报