一、场景描述

公司某工程师执行db.giveget_card.drop(),误将线上表删除。

幸好每天都有做备份,这个时候就体现了备份的重要性了,哈哈哈。。。

二、模拟故障过程

备份数据大小:

rs_test01:PRIMARY> use ycsb
switched to db ycsb
rs_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
# ls
oplog.bson  ycsb

5、至此,所有的准备操作已经做完,恢复数据。

[root@ops-db-test02 restore]# mongorestore --port 2203 --oplogReplay --oplogLimit=1496665069:1 /tmp/restore
2017-06-05T20:36:45.361+0800   building a list of dbs and collections to restore from /tmp/restore dir
2017-06-05T20:36:45.364+0800   reading metadata for ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.metadata.json
2017-06-05T20:36:45.364+0800   restoring ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.bson
2017-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 metadata
2017-06-05T20:38:44.680+0800   finished restoring ycsb.giveget_card (3173391 documents)
2017-06-05T20:38:44.680+0800   replaying oplog
2017-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 的恢复操作。

备份很重要!!! 备份很重要!!! 备份很重要!!!重要的事情讲三遍~~~

转载于:https://blog.51cto.com/11580138/1932502

MongoDB误删表恢复相关推荐

  1. PLSQL 误删表恢复及误删数据恢复

    误删表恢复 1.查看你删除的是哪张表: select * from user_recyclebin t where DROPTIME >'2022-08-26 00:00:00' and t.o ...

  2. SQL Server误删表恢复

    SQL Server 完全恢复模式 下恢复误删除的表,进行 精准 恢复 1.  找出被删除的表名(无schema,需要从日志中分析进行提取,后续完善).object_id.表所在数据库.删除人.删除时 ...

  3. 【数据库】误删表恢复解决方案

    一.背景 执行语句时遗漏了where条件,导致删除整张表 二.解决方案 1.使用pg_resetxlog(10之后是pg_resetwal)来重置事务ID来访问被修改的数据. http://wjhsh ...

  4. oracle误删数据和误删表的恢复方法

    之前在操作数据的时候,我在思考如何编写SQL,但是不小心按下了F8执行了drop语句,不小心删除了表,不过之后被我恢复了,但是之后我又不小心删错了表数据,虽然很快恢复了,但是我也找了几篇博客对比,虽然 ...

  5. mysql 清空表怎么恢复_mysql怎么恢复删除的表?mysql找回误删表的数据方法

    下面小编就为大家带来一篇mysql 找回误删表的数据方法(必看).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 有备份的话很简单,只需要生成一个最近备份的数据,然后用 ...

  6. 深圳x医院ICU危重症信息系统MongoDB误删-恢复记录-2020.10.17

    故障简述 2020.10.16日,深圳x医院ICU危重症信息系统MongoDB误删的第22号数据文件在运维时被误删,导致MongoDB宕机,ICU危重症信息系统瘫痪,医护人员只能采用"纸质+ ...

  7. 技术分享 | 误删表以及表中数据,该如何恢复?

    作者:杨小云 爱可生数据库工程师,负责 MySQL 日常维护及 DMP 产品支持.擅长mysql故障处理. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明 ...

  8. mongodb误删数据该如何恢复

    mongodb误删数据该如何恢复 在mongodb库中使用脚本执行remove操作,误删有效数据该如何恢复. mongodb-3.4.2 原理 mongodb的任何操作都会在其中的local库中记录下 ...

  9. Oracle Drop误删表、Delete误删表数据后恢复方法

    关于ORALCE误删表后恢复 1. 查看回收站的表: select object_name,original_name,type,createtime,droptime from recyclebin ...

最新文章

  1. 基于Sql Server 2008的分布式数据库的实践(一)
  2. [MySQL 5.1 体验]MySQL 事件调度器(Event Scheduler)
  3. tsf php,TSF:腾讯推出的 PHP 协程方案
  4. springboot使用hibernate validator校验
  5. 基于SEAL库实现PSI-报错实录2
  6. IDEA配置码云Gitee的使用详解
  7. 计算机乘积函数讲解,计算机函数算法7
  8. rust怎么用items刷东西_rust服主怎么刷东西 | 手游网游页游攻略大全
  9. 将Maven集成到IDEA
  10. NET报表工具 EastReport
  11. C#实现WebService服务 项目完整总结
  12. ansible 小试身手
  13. c#后台如何导出excel到本地_C# 导出 Excel 的各种方法总结
  14. SAP ABAP开发实战——从入门到精通系列教程目录
  15. bodymovin导出没有html5,AE脚本-导出json格式的Web动画工具 Bodymovin v5.7.1 + 使用教程...
  16. Protected multilib versions XXX
  17. 【IoT】创业:确保硬件创业成功的 6 个关键业务
  18. 辩证看待曾仕强老师的易经的智慧
  19. 企业服务总线Enterprise service bus介绍
  20. 一步一步实战HTML音乐播放器

热门文章

  1. C++(STL):21---deque之源码剖析
  2. Caffe将图像数据转换成leveldb/lmdb
  3. python如何运用ols_使用OLS回归(Python,StatsModels,Pandas)预测未来值
  4. python语言编写一个生成九宫格图片的代码_python实现图片九宫格分割
  5. STL源码剖析 序列式容器 slist
  6. C++primer 第 4 章 表达式 4.7条件运算符 4.8位运算符 4.9 sizeof运算符 4.10逗号运算符 4.11类型转换 4 . 1 2 运算符优先级表
  7. 10大清宿便排毒方法及简单排毒瘦小腹运动
  8. 换工作,让我里外不是人,到底错在哪儿
  9. linux 32位平台,文件大小受限于2G的解决方法
  10. 百度联合长虹发布第二款云手机 售价900元以下