mongodb误删数据该如何恢复
在mongodb库中使用脚本执行remove操作,误删有效数据该如何恢复。
mongodb—3.4.2
-
原理
mongodb的任何操作都会在其中的local库中记录下来,只要能找回误删的数据,对数据库执行增量导入,就可以恢复误删数据。 -
步骤一:取得数据库备份数据,及备份数据时时间戳。
为避免在数据恢复过程中有其他数据改变,影响数据,将开启一个新的数据库实例,导入之前的备份数据,同时,恢复的误删数据也将导入到新的数据库实例
1.导入备份数据
./mongorestore -h ip:port -d dbname --drop filepath
2.将备份时间取出,并转化为时间戳。 -
步骤二:取得误删数据库的操作记录,并将操作的数据备份成bson文件
1.回到原数据库,执行下列命令取出操作记录
use local; db.getCollection('oplog.rs').find({op:"d",ns:"dbname.collectionname",ts:{$gt:Timestamp(1620263697,1)}})
op:‘d’ 代表删除操作,
ns:‘xx.xx’ 代表数据库和集合名称
1620263697:是备份数据的时间戳
其中op,可以是如下几种情形之一:
“i”: insert
“u”: update
“d”: delete
“c”: db cmd
“db”:声明当前数据库 (其中ns 被设置成为=>数据库名称+ ‘.’)
“n”: no op,即空操作,其会定期执行以确保时效性。修改配置,会产生 “n” 操作。
将会得到如下格式的数据集合
{ "ts" : Timestamp(1620266081, 1), "h" : NumberLong(-3440087969162658404), "v" : 2, "op" : "d", "ns" : "dbname.collectionname", "o" : { "_id" : "2JNZQvCx0" } }
通过这个结果,可以查看到执行误操作的时间戳ts,以及此次误操作涉及的数据id。
2.用目前获取的两个时间戳,将此时间段的操作数据备份成bson文件
mongodump -h ip:port -d local -c oplog.rs -q '{ts:{$lt:Timestamp(误操作时间戳, 1),$gt: Timestamp(备份时间戳, 1)}}' -o filepath
此命令将数据备份成bson文件并导出到filepath地址。 -
步骤三:恢复误操作数据到新的数据库实例中。
将之前的备份文件放到新数据路实例下,并执行下列命令:
mongorestore --port 27018 --oplogReplay /tmp/zl/local/oplog.rs.bson
如此新的数据库实例中数据将恢复到误操作之前的数据。 -
后续数据操作
完成上述步骤后,对于数据的操作将视情况看是否需要,如果是要将删除的数据做其他处理,然后再恢复到原数据库中,可以根据删除记录中的id找到对应数据,取出处理后,将得到的新数据写成json文件使用mongoimport -h ip:port --db dbname --collection collectionname --jsonArray --file stderr.json
命令将数据重新入库。如果不需要其他操作,也可以直接将备份出的bson文件直接恢复到原数据库中。