mongodb误删数据该如何恢复

在mongodb库中使用脚本执行remove操作,误删有效数据该如何恢复。
mongodb—3.4.2

  1. 原理
    mongodb的任何操作都会在其中的local库中记录下来,只要能找回误删的数据,对数据库执行增量导入,就可以恢复误删数据。

  2. 步骤一:取得数据库备份数据,及备份数据时时间戳。
    为避免在数据恢复过程中有其他数据改变,影响数据,将开启一个新的数据库实例,导入之前的备份数据,同时,恢复的误删数据也将导入到新的数据库实例
    1.导入备份数据
    ./mongorestore -h ip:port -d dbname --drop filepath
    2.将备份时间取出,并转化为时间戳。

  3. 步骤二:取得误删数据库的操作记录,并将操作的数据备份成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地址。

  4. 步骤三:恢复误操作数据到新的数据库实例中。
    将之前的备份文件放到新数据路实例下,并执行下列命令:
    mongorestore --port 27018 --oplogReplay /tmp/zl/local/oplog.rs.bson
    如此新的数据库实例中数据将恢复到误操作之前的数据。

  5. 后续数据操作
    完成上述步骤后,对于数据的操作将视情况看是否需要,如果是要将删除的数据做其他处理,然后再恢复到原数据库中,可以根据删除记录中的id找到对应数据,取出处理后,将得到的新数据写成json文件使用mongoimport -h ip:port --db dbname --collection collectionname --jsonArray --file stderr.json命令将数据重新入库。如果不需要其他操作,也可以直接将备份出的bson文件直接恢复到原数据库中。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐