Mongodb备份恢复到任意时间点

学习笔记 2020/08/27 MongoDB

1.1、单点:

是否有备份,有备份情况下,启动一个实例将,将备份数据导入到新实例

查找新实例是否有被删除掉的数据,使用mongodump导出数据,再导入到源被删除数据实例,恢复数据。

详细见本章下边内容:2.2备份和 2.5恢复

单节点mongodb没有oplog的概念,如果没有备份,数据就会出现丢失,正式环境尽量使用复制集架构。


1.2、复制集:

1.2.1、可以采用延迟节点形式,一PRIMARY节点,两SECONDARY其中一个做延迟节点,

比如我们延迟节点延迟8小时,我们删除数据要在8小时内发现,并恢复(保证oplog不被覆盖情况下)

1.2.2、全量+增量:根据数据量和重要性,选择天全量备份+小时增量oplog备份,或者周全量备份+天增量oplog备份。


1.3、分片集群

分片集群也是由多个复制集组成,备份方式可以按照复制集备份策略


2、复制集架构模拟误删除:

我们采用全量备份+oplog增量备份方式

2.1、我们插入1000条数据:for (var i=0;i<1000;i++){ db.users.save({"uid":i}) }

rs0:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.002GB
xwj     0.000GB
rs0:PRIMARY> use xwj
switched to db xwj
rs0:PRIMARY> for (var i=0;i<1000;i++){ db.users.save({"uid":i})}
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.users.find()
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6969"), "uid" : 0 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd696a"), "uid" : 1 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd696b"), "uid" : 2 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd696c"), "uid" : 3 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd696d"), "uid" : 4 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd696e"), "uid" : 5 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd696f"), "uid" : 6 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6970"), "uid" : 7 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6971"), "uid" : 8 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6972"), "uid" : 9 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6973"), "uid" : 10 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6974"), "uid" : 11 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6975"), "uid" : 12 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6976"), "uid" : 13 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6977"), "uid" : 14 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6978"), "uid" : 15 }
{ "_id" : ObjectId("5f4777fc11c2ce20efdd6979"), "uid" : 16 }
Type "it" for more


2.2、全量备份:

[root@KELL ~]# /usr/local/mongodb/bin/mongodump -h 127.0.0.1:27018 -d xwj -o /root
2020-08-27T05:41:27.258-0400    writing xwj.users to /root/xwj/users.bson
2020-08-27T05:41:27.269-0400    done dumping xwj.users (1000 documents)

2.3、第一种情况:

如果我们在备份后的几个小时进行删除操作,只要把数据导入到新的实例就能找回数据,这样太简单了。

前提是我们有备份才能恢复。


2.4、我们继续第二种情况

我们继续插入数据:

rs0:PRIMARY> db.users.insert({"uid" :1005})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.users.insert({"uid" :1006})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.users.insert({"uid" :1007})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.users.remove({"uid" :1006}) # 删除一条
WriteResult({ "nRemoved" : 1 })
rs0:PRIMARY> db.users.insert({"uid" :1008})
WriteResult({ "nInserted" : 1 })

我们来恢复"uid" :1006 的这条数据,我们需要恢复到删除前一刻,也就是恢复到执行db.user.remove({"uid" :1006})这个时间点之前。


2.5、我们创建一个新的副本集实例,将全量备份导入

[root@KELL ~]# /usr/local/mongodb/bin/mongorestore -h 127.0.0.1:27018 -d xwjback /root/xwj/
2020-08-27T05:48:55.224-0400    The --db and --collection flags are deprecated for this use-case; please use --nsInclude instead, i.e. with --nsInclude=${DATABASE}.${COLLECTION}
2020-08-27T05:48:55.224-0400    building a list of collections to restore from /root/xwj dir
2020-08-27T05:48:55.225-0400    reading metadata for xwjback.users from /root/xwj/users.metadata.json
2020-08-27T05:48:55.253-0400    restoring xwjback.users from /root/xwj/users.bson
2020-08-27T05:48:55.360-0400    restoring indexes for collection xwjback.users from metadata
2020-08-27T05:48:55.506-0400    finished restoring xwjback.users (1000 documents, 0 failures)
2020-08-27T05:48:55.506-0400    1000 document(s) restored successfully. 0 document(s) failed to restore.

2.6、导出oplog日志:

# 首先我们查一下什么时间执行删除操作的
rs0:PRIMARY> use local
switched to db local
rs0:PRIMARY> db.oplog.rs.find({"op":"d","ns":"xwj.users"})
{ "op" : "d", "ns" : "xwj.users", "ui" : UUID("b5063fca-76dc-468b-a74a-2ddf85061dc5"), "o" : { "_id" : ObjectId("5f3a217b9db4ba5d62ce7bfd") }, "ts" : Timestamp(1598519424, 1), "t" : NumberLong(17), "wall" : ISODate("2020-08-27T06:10:24.873Z"), "v" : NumberLong(2) }
#op是操作,d是删除,ns命名空间就是某个库的某个表,oplogs日志解释详见oplog介绍

我们全量备份时间是已知的:2020-08-27T05:41:27.258,

删除时间也知道了,我们需要把全量备份成功的时间,进行一下转换,我们拿到时间戳,

尽量在备份时间在提前十分钟,这样我们日志就不会出现缺失,导入重复会自动覆盖。


导出删除数据实例的oplog日志(大于备份时间小于删除时间的这一段)

[root@KELL ~]# /usr/local/mongodb/bin/mongodump -h 127.0.0.1:27018 -d local -c oplog.rs -q \'{ts:{$gt:Timestamp(1584002557, 1),$lt: Timestamp(1598519424, 1)},"ns":{"$regex":"xwj.users"}}\' -o .

2.7、oplog导入到新实例:

[root@KELL ~]# /usr/local/mongodb/bin/mongorestore -h 127.0.0.1:27018–oplogReplay local/oplog.rs.bson


连接新恢复实例可查看数据恢复情况



本文地址:https://www.stayed.cn/item/253

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。