2021元宵节记一次MongoDB集合误删除恢复实验
如果有人看的话,无视排版,以后完全搞懂再回来完善
实验开始
模拟误删除个集合
搭建复制集跳过。。。
进入主库,for循环建个10000个文档的集合
lztrepl:PRIMARY> use lzt1
lztrepl:PRIMARY> for ( var i=0; i<10000; i++){ db.c1.create({name:"Jerry"+i})}
等集合创建完成后
lztrepl:PRIMARY> db.c1.count()
10000
然后假装手滑删了他
lztrepl:PRIMARY> db.c1.drop()
误删除完毕,开始恢复。
恢复数据
首先,按网上的步骤,先dump出oplog.rs
mongodump -d local -c oplog.rs -o /home/backup
然后查找删除集合的时间点
bsondump oplog.rs.bson | grep "\"op\":\"d\""
可是没有发现删除的语句,网上说上一句是查找删除的语句,怎么回事?
只能进入oplog.rs.bson,按数据库和集合名来找找看
bsondump oplog.rs.bson > 233
more 233
然后定位到插入的第10000条语句,往下翻一点,看到一条
{"op":"c","ns":"lzt1.$cmd","ui":{"$binary":{"base64":"3o2L56C9Qta12i5hoi/XCg==","subType":"04"}},"o":{"drop":"c1"},"o2":{"numRecords
":{"$numberInt":"10000"}},"ts":{"$timestamp":{"t":1614305152,"i":1}},"t":{"$numberLong":"11"},"wall":{"$date":{"$numberLong":"161430
5152425"}},"v":{"$numberLong":"2"}}
其中发现"o":{“drop”:“c1”},这个应该是我删除集合的语句,但是op为什么是c,代表create的意思?这里不明白写完再去查查这块。1
好不容易找到了误删除的时间点,后面就可以恢复了
mkdir -p /home/bk
cp oplog.rs.bson /home/bk/oplog.bson
mongorestore --oplogReplay --oplogLimit "1614305152:1" /home/bk
#中间运行过程掠过,这里只看结果
2021-02-26T12:43:16.930+0800 0 document(s) restored successfully. 0 document(s) failed to restore.
然后回数据库里查询,集合c1的10000条都已恢复,但是为什么上面的结果反馈的是0 document(s) restored successfully,这里也不明白2
至此,实验结束,午睡。
下午再去查那两个点。