MongoDB误删表恢复
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,一、场景描述公司某工程师执行db.giveget_card.drop(),误将线上表删除。幸好每天都有做备份,这个时候就体现了备份的重要性了,哈哈哈。。。二、模拟故障过程备份数据大小:rs_test0
千家信息网最后更新 2026年11月02日MongoDB误删表恢复
一、场景描述
公司某工程师执行db.giveget_card.drop(),误将线上表删除。
幸好每天都有做备份,这个时候就体现了备份的重要性了,哈哈哈。。。
二、模拟故障过程
备份数据大小:
rs_test01:PRIMARY> use ycsbswitched to db ycsbrs_test01:PRIMARY> db.giveget_card.count();3173391
删除之前,此表有更新。
rs_test01:PRIMARY> db.giveget_card.insert({id:1});WriteResult({ "nInserted" : 1 })rs_test01:PRIMARY> db.giveget_card.insert({id:2});WriteResult({ "nInserted" : 1 })rs_test01:PRIMARY> db.giveget_card.insert({id:3});WriteResult({ "nInserted" : 1 })rs_test01:PRIMARY> db.giveget_card.insert({id:4});WriteResult({ "nInserted" : 1 })其他表也有更新操作。
rs_test01:PRIMARY> db.tab.find();{ "_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" : "a" }{ "_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" : "b" }{ "_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" : "c" }{ "_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" : "d" }删除操作之后,此表和其他表都有更新。
rs_test01:PRIMARY> db.giveget_card.find();{ "_id" : ObjectId("59354c28d905432aeaccd53c"), "id" : 5 }{ "_id" : ObjectId("59354c2bd905432aeaccd53d"), "id" : 6 }rs_test01:PRIMARY> db.tab.find();{ "_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" : "a" }{ "_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" : "b" }{ "_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" : "c" }{ "_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" : "d" }{ "_id" : ObjectId("59354ccfd905432aeaccd542"), "name" : "e" }{ "_id" : ObjectId("59354cd2d905432aeaccd543"), "name" : "f" }三、恢复步骤
1、将备份中 tab 表的 giveget_card.bson 及 giveget_card.metadata.json 文件拷贝到 /tmp/restore/ycsb 目录(自建目录),ycsb 为库名。
# cp /data/backup/rs07/ycsb/giveget_card.* /tmp/restore/ycsb
2、将备份时间之后,误删操作之前的 oplog 导出,用于恢复表
# mongodump --port 2203 -d local -c oplog.rs -q '{"ts" : {$gte : Timestamp(1496664480, 10430), $lte : Timestamp(1496665113, 10430)}}' -o /tmp/oplog--时间戳 是使用转换工具转换之后的结果。
3、使用 bsondump 查看 oplog 日志,找到 drop 操作的时间戳 1496665069
# bsondump /tmp/oplog/local/oplog.rs.bson {"ts":{"$timestamp":{"t":1496664760,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"7079172056815894727"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354ab8c5308d8c7a9da8b5"},"id":1.0}}{"ts":{"$timestamp":{"t":1496664762,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-1797107728294067016"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354abac5308d8c7a9da8b6"},"id":2.0}}{"ts":{"$timestamp":{"t":1496664765,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"8604646791509150392"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354abdc5308d8c7a9da8b7"},"id":3.0}}{"ts":{"$timestamp":{"t":1496664768,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"9018614066505371436"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354ac0c5308d8c7a9da8b8"},"id":4.0}}{"ts":{"$timestamp":{"t":1496664994,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-4471524661347063602"},"v":2,"op":"c","ns":"ycsb.$cmd","o":{"create":"tab"}}{"ts":{"$timestamp":{"t":1496664994,"i":2}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-4215905958456607246"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354ba202d9a99ab2f879c6"},"name":"a"}}{"ts":{"$timestamp":{"t":1496664998,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"6170506962401844481"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354ba602d9a99ab2f879c7"},"name":"b"}}{"ts":{"$timestamp":{"t":1496665000,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-8071456063660489895"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354ba802d9a99ab2f879c8"},"name":"c"}}{"ts":{"$timestamp":{"t":1496665002,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"4387884836668659146"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354baa02d9a99ab2f879c9"},"name":"d"}}{"ts":{"$timestamp":{"t":1496665069,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-6913449254950935781"},"v":2,"op":"c","ns":"ycsb.$cmd","o":{"drop":"giveget_card"}}2017-06-05T20:27:25.552+0800 10 objects found4、将 oplog 的 bson 文件拷贝到相应目录下
# cp /tmp/oplog/local/oplog.rs.bson /tmp/restore/oplog.bson
此时恢复的目录结构:
# pwd/tmp/restore# lsoplog.bson ycsb
5、至此,所有的准备操作已经做完,恢复数据。
[root@ops-db-test02 restore]# mongorestore --port 2203 --oplogReplay --oplogLimit=1496665069:1 /tmp/restore2017-06-05T20:36:45.361+0800 building a list of dbs and collections to restore from /tmp/restore dir2017-06-05T20:36:45.364+0800 reading metadata for ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.metadata.json2017-06-05T20:36:45.364+0800 restoring ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.bson2017-06-05T20:36:48.362+0800 [........................] ycsb.giveget_card 15.4MB/475MB (3.2%)2017-06-05T20:36:51.362+0800 [#.......................] ycsb.giveget_card 31.1MB/475MB (6.6%)2017-06-05T20:36:54.362+0800 [##......................] ycsb.giveget_card 46.6MB/475MB (9.8%)2017-06-05T20:36:57.362+0800 [###.....................] ycsb.giveget_card 62.1MB/475MB (13.1%)2017-06-05T20:37:00.362+0800 [###.....................] ycsb.giveget_card 76.4MB/475MB (16.1%)2017-06-05T20:37:03.362+0800 [####....................] ycsb.giveget_card 90.7MB/475MB (19.1%)2017-06-05T20:37:06.362+0800 [#####...................] ycsb.giveget_card 105MB/475MB (22.0%)2017-06-05T20:37:09.362+0800 [######..................] ycsb.giveget_card 120MB/475MB (25.2%)2017-06-05T20:37:12.362+0800 [######..................] ycsb.giveget_card 133MB/475MB (28.0%)2017-06-05T20:37:15.362+0800 [#######.................] ycsb.giveget_card 146MB/475MB (30.8%)2017-06-05T20:37:18.363+0800 [########................] ycsb.giveget_card 163MB/475MB (34.3%)2017-06-05T20:37:21.362+0800 [########................] ycsb.giveget_card 178MB/475MB (37.4%)2017-06-05T20:37:24.362+0800 [#########...............] ycsb.giveget_card 196MB/475MB (41.3%)2017-06-05T20:37:27.362+0800 [##########..............] ycsb.giveget_card 214MB/475MB (45.0%)2017-06-05T20:37:30.362+0800 [###########.............] ycsb.giveget_card 231MB/475MB (48.6%)2017-06-05T20:37:33.362+0800 [############............] ycsb.giveget_card 245MB/475MB (51.5%)2017-06-05T20:37:36.362+0800 [#############...........] ycsb.giveget_card 261MB/475MB (54.8%)2017-06-05T20:37:39.362+0800 [##############..........] ycsb.giveget_card 279MB/475MB (58.7%)2017-06-05T20:37:42.362+0800 [###############.........] ycsb.giveget_card 297MB/475MB (62.5%)2017-06-05T20:37:45.362+0800 [###############.........] ycsb.giveget_card 312MB/475MB (65.8%)2017-06-05T20:37:48.362+0800 [################........] ycsb.giveget_card 328MB/475MB (69.0%)2017-06-05T20:37:51.362+0800 [#################.......] ycsb.giveget_card 341MB/475MB (71.8%)2017-06-05T20:37:54.362+0800 [#################.......] ycsb.giveget_card 356MB/475MB (74.9%)2017-06-05T20:37:57.362+0800 [##################......] ycsb.giveget_card 373MB/475MB (78.5%)2017-06-05T20:38:00.362+0800 [###################.....] ycsb.giveget_card 388MB/475MB (81.7%)2017-06-05T20:38:03.362+0800 [####################....] ycsb.giveget_card 405MB/475MB (85.2%)2017-06-05T20:38:06.362+0800 [#####################...] ycsb.giveget_card 419MB/475MB (88.2%)2017-06-05T20:38:09.362+0800 [#####################...] ycsb.giveget_card 434MB/475MB (91.4%)2017-06-05T20:38:12.362+0800 [######################..] ycsb.giveget_card 442MB/475MB (93.1%)2017-06-05T20:38:15.362+0800 [#######################.] ycsb.giveget_card 459MB/475MB (96.6%)2017-06-05T20:38:18.362+0800 [#######################.] ycsb.giveget_card 475MB/475MB (99.9%)2017-06-05T20:38:18.427+0800 [########################] ycsb.giveget_card 475MB/475MB (100.0%)2017-06-05T20:38:18.427+0800 restoring indexes for collection ycsb.giveget_card from metadata2017-06-05T20:38:44.680+0800 finished restoring ycsb.giveget_card (3173391 documents)2017-06-05T20:38:44.680+0800 replaying oplog2017-06-05T20:38:44.739+0800 done
6、查看恢复的结果
rs_test01:PRIMARY> db.giveget_card.find({id : {$gte : 1 }});{ "_id" : ObjectId("59354cb9d905432aeaccd540"), "id" : 5 }{ "_id" : ObjectId("59354cc0d905432aeaccd541"), "id" : 6 }{ "_id" : ObjectId("59354ab8c5308d8c7a9da8b5"), "id" : 1 }{ "_id" : ObjectId("59354abac5308d8c7a9da8b6"), "id" : 2 }{ "_id" : ObjectId("59354abdc5308d8c7a9da8b7"), "id" : 3 }{ "_id" : ObjectId("59354ac0c5308d8c7a9da8b8"), "id" : 4 }数据内容相同,但存储顺序与之前数据的存储顺序不同了。
rs_test01:PRIMARY> db.giveget_card.count();3173397
结果 count= 备份表数据 3173391+ 之后的更新数据 6 。
7、因为 dump 出来的 oplog 也包含了其他表的操作。查看恢复过程中有没有对其他表产生影响。
rs_test01:PRIMARY> db.tab.find();{ "_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" : "a" }{ "_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" : "b" }{ "_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" : "c" }{ "_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" : "d" }{ "_id" : ObjectId("59354ccfd905432aeaccd542"), "name" : "e" }{ "_id" : ObjectId("59354cd2d905432aeaccd543"), "name" : "f" }--查看 tab 表的数据跟原表数据相同,没有什么影响,说明其他表的日志在空跑。
以上就是备份结合 oplog 的恢复操作。
备份很重要!!! 备份很重要!!! 备份很重要!!!重要的事情讲三遍~~~
备份
数据
重要
目录
更新
时间
结果
相同
拷贝
文件
日志
过程
顺序
存储
影响
不同
上表
事情
公司
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
河南云网互联网络科技有限公司
互联网科技巨头监管
互联网与未来科技
火传媒上海互联网科技
互联网科技公司介绍
互联网养老 桔豆科技
互联网科技大会案例
深圳卡尔迅互联网科技有限公司怎么样
团飞科技与伯堂互联网服务平台
昭通互联网科技选哪家
江阴互联网智能科技产品进口
996高科技互联网公司
互联网科技如何创业
长沙互联网科技
伍佰万互联网科技怎么赚钱
互联网领先科技宣传片
领航科技大厦互联网公司
普陀区互联网教育科技管理办法
兰石爱特工业互联网科技分公司
10位科技互联网大佬
互联网属科技
圆梦互联网科技
狮子座互联网科技有限公司
华脉科技工业互联网产品
老年人脱离互联网科技的作文
茂名市互联网科技产业园
南山科技园互联网公司有哪些
重庆互联网医院沙龙医盟信息科技
亳州好赞互联网科技有限公司
深圳市罗太互联网科技有限公司