千家信息网

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 found


4、将 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位科技互联网大佬 互联网属科技 圆梦互联网科技 狮子座互联网科技有限公司 华脉科技工业互联网产品 老年人脱离互联网科技的作文 茂名市互联网科技产业园 南山科技园互联网公司有哪些 重庆互联网医院沙龙医盟信息科技 亳州好赞互联网科技有限公司 深圳市罗太互联网科技有限公司
0