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
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我