MongoDB误删表恢复

数据库 其他数据库 MongoDB
公司某工程师执行db.giveget_card.drop(),误将线上表删除。幸好每天都有做备份,这个时候就体现了备份的重要性了,本文讲述恢复步骤。

[[196918]]

一、场景描述

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

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

二、模拟故障过程

备份数据大小:

  1. rs_test01:PRIMARY> use ycsb 
  2. switched to db ycsb 
  3. rs_test01:PRIMARY> db.giveget_card.count(); 
  4. 3173391  

删除之前,此表有更新。

  1. rs_test01:PRIMARY> db.giveget_card.insert({id:1}); 
  2. WriteResult({ "nInserted" : 1 }) 
  3. rs_test01:PRIMARY> db.giveget_card.insert({id:2}); 
  4. WriteResult({ "nInserted" : 1 }) 
  5. rs_test01:PRIMARY> db.giveget_card.insert({id:3}); 
  6. WriteResult({ "nInserted" : 1 }) 
  7. rs_test01:PRIMARY> db.giveget_card.insert({id:4}); 
  8. WriteResult({ "nInserted" : 1 })  

其他表也有更新操作。

  1. rs_test01:PRIMARY> db.tab.find(); 
  2. "_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" : "a" } 
  3. "_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" : "b" } 
  4. "_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" : "c" } 
  5. "_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" : "d" }  

删除操作之后,此表和其他表都有更新。

  1. rs_test01:PRIMARY> db.giveget_card.find(); 
  2. "_id" : ObjectId("59354c28d905432aeaccd53c"), "id" : 5 } 
  3. "_id" : ObjectId("59354c2bd905432aeaccd53d"), "id" : 6 } 
  4. rs_test01:PRIMARY> db.tab.find(); 
  5. "_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" : "a" } 
  6. "_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" : "b" } 
  7. "_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" : "c" } 
  8. "_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" : "d" } 
  9. "_id" : ObjectId("59354ccfd905432aeaccd542"), "name" : "e" } 
  10. "_id" : ObjectId("59354cd2d905432aeaccd543"), "name" : "f" }  

三、恢复步骤

1、将备份中 tab 表的 giveget_card.bson 及 giveget_card.metadata.json 文件拷贝到 /tmp/restore/ycsb 目录(自建目录),ycsb 为库名。

  1. # cp /data/backup/rs07/ycsb/giveget_card.* /tmp/restore/ycsb 

2、将备份时间之后,误删操作之前的 oplog 导出,用于恢复表

  1. # 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

  1. # bsondump /tmp/oplog/local/oplog.rs.bson  
  2. {"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}} 
  3. {"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}} 
  4. {"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}} 
  5. {"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}} 
  6. {"ts":{"$timestamp":{"t":1496664994,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-4471524661347063602"},"v":2,"op":"c","ns":"ycsb.$cmd","o":{"create":"tab"}} 
  7. {"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"}} 
  8. {"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"}} 
  9. {"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"}} 
  10. {"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"}} 
  11. {"ts":{"$timestamp":{"t":1496665069,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-6913449254950935781"},"v":2,"op":"c","ns":"ycsb.$cmd","o":{"drop":"giveget_card"}} 
  12. 2017-06-05T20:27:25.552+0800    10 objects found  

4、将 oplog 的 bson 文件拷贝到相应目录下

  1. cp /tmp/oplog/local/oplog.rs.bson /tmp/restore/oplog.bson 

此时恢复的目录结构:

  1. # pwd 
  2. /tmp/restore 
  3. # ls 
  4. oplog.bson  ycsb  

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

  1. [root@ops-db-test02 restore]# mongorestore --port 2203 --oplogReplay --oplogLimit=1496665069:1 /tmp/restore 
  2. 2017-06-05T20:36:45.361+0800    building a list of dbs and collections to restore from /tmp/restore dir 
  3. 2017-06-05T20:36:45.364+0800    reading metadata for ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.metadata.json 
  4. 2017-06-05T20:36:45.364+0800    restoring ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.bson 
  5. 2017-06-05T20:36:48.362+0800    [........................]  ycsb.giveget_card  15.4MB/475MB  (3.2%) 
  6. 2017-06-05T20:36:51.362+0800    [#.......................]  ycsb.giveget_card  31.1MB/475MB  (6.6%) 
  7. 2017-06-05T20:36:54.362+0800    [##......................]  ycsb.giveget_card  46.6MB/475MB  (9.8%) 
  8. 2017-06-05T20:36:57.362+0800    [###.....................]  ycsb.giveget_card  62.1MB/475MB  (13.1%) 
  9. 2017-06-05T20:37:00.362+0800    [###.....................]  ycsb.giveget_card  76.4MB/475MB  (16.1%) 
  10. 2017-06-05T20:37:03.362+0800    [####....................]  ycsb.giveget_card  90.7MB/475MB  (19.1%) 
  11. 2017-06-05T20:37:06.362+0800    [#####...................]  ycsb.giveget_card  105MB/475MB  (22.0%) 
  12. 2017-06-05T20:37:09.362+0800    [######..................]  ycsb.giveget_card  120MB/475MB  (25.2%) 
  13. 2017-06-05T20:37:12.362+0800    [######..................]  ycsb.giveget_card  133MB/475MB  (28.0%) 
  14. 2017-06-05T20:37:15.362+0800    [#######.................]  ycsb.giveget_card  146MB/475MB  (30.8%) 
  15. 2017-06-05T20:37:18.363+0800    [########................]  ycsb.giveget_card  163MB/475MB  (34.3%) 
  16. 2017-06-05T20:37:21.362+0800    [########................]  ycsb.giveget_card  178MB/475MB  (37.4%) 
  17. 2017-06-05T20:37:24.362+0800    [#########...............]  ycsb.giveget_card  196MB/475MB  (41.3%) 
  18. 2017-06-05T20:37:27.362+0800    [##########..............]  ycsb.giveget_card  214MB/475MB  (45.0%) 
  19. 2017-06-05T20:37:30.362+0800    [###########.............]  ycsb.giveget_card  231MB/475MB  (48.6%) 
  20. 2017-06-05T20:37:33.362+0800    [############............]  ycsb.giveget_card  245MB/475MB  (51.5%) 
  21. 2017-06-05T20:37:36.362+0800    [#############...........]  ycsb.giveget_card  261MB/475MB  (54.8%) 
  22. 2017-06-05T20:37:39.362+0800    [##############..........]  ycsb.giveget_card  279MB/475MB  (58.7%) 
  23. 2017-06-05T20:37:42.362+0800    [###############.........]  ycsb.giveget_card  297MB/475MB  (62.5%) 
  24. 2017-06-05T20:37:45.362+0800    [###############.........]  ycsb.giveget_card  312MB/475MB  (65.8%) 
  25. 2017-06-05T20:37:48.362+0800    [################........]  ycsb.giveget_card  328MB/475MB  (69.0%) 
  26. 2017-06-05T20:37:51.362+0800    [#################.......]  ycsb.giveget_card  341MB/475MB  (71.8%) 
  27. 2017-06-05T20:37:54.362+0800    [#################.......]  ycsb.giveget_card  356MB/475MB  (74.9%) 
  28. 2017-06-05T20:37:57.362+0800    [##################......]  ycsb.giveget_card  373MB/475MB  (78.5%) 
  29. 2017-06-05T20:38:00.362+0800    [###################.....]  ycsb.giveget_card  388MB/475MB  (81.7%) 
  30. 2017-06-05T20:38:03.362+0800    [####################....]  ycsb.giveget_card  405MB/475MB  (85.2%) 
  31. 2017-06-05T20:38:06.362+0800    [#####################...]  ycsb.giveget_card  419MB/475MB  (88.2%) 
  32. 2017-06-05T20:38:09.362+0800    [#####################...]  ycsb.giveget_card  434MB/475MB  (91.4%) 
  33. 2017-06-05T20:38:12.362+0800    [######################..]  ycsb.giveget_card  442MB/475MB  (93.1%) 
  34. 2017-06-05T20:38:15.362+0800    [#######################.]  ycsb.giveget_card  459MB/475MB  (96.6%) 
  35. 2017-06-05T20:38:18.362+0800    [#######################.]  ycsb.giveget_card  475MB/475MB  (99.9%) 
  36. 2017-06-05T20:38:18.427+0800    [########################]  ycsb.giveget_card  475MB/475MB  (100.0%) 
  37. 2017-06-05T20:38:18.427+0800    restoring indexes for collection ycsb.giveget_card from metadata 
  38. 2017-06-05T20:38:44.680+0800    finished restoring ycsb.giveget_card (3173391 documents) 
  39. 2017-06-05T20:38:44.680+0800    replaying oplog 
  40. 2017-06-05T20:38:44.739+0800    done  

6、查看恢复的结果

  1. rs_test01:PRIMARY> db.giveget_card.find({id : {$gte : 1 }}); 
  2. "_id" : ObjectId("59354cb9d905432aeaccd540"), "id" : 5 } 
  3. "_id" : ObjectId("59354cc0d905432aeaccd541"), "id" : 6 } 
  4. "_id" : ObjectId("59354ab8c5308d8c7a9da8b5"), "id" : 1 } 
  5. "_id" : ObjectId("59354abac5308d8c7a9da8b6"), "id" : 2 } 
  6. "_id" : ObjectId("59354abdc5308d8c7a9da8b7"), "id" : 3 } 
  7. "_id" : ObjectId("59354ac0c5308d8c7a9da8b8"), "id" : 4 }  

数据内容相同,但存储顺序与之前数据的存储顺序不同了。

  1. rs_test01:PRIMARY> db.giveget_card.count(); 
  2. 3173397  

结果 count= 备份表数据 3173391+ 之后的更新数据 6 。

7、因为 dump 出来的 oplog 也包含了其他表的操作。查看恢复过程中有没有对其他表产生影响。

  1. rs_test01:PRIMARY> db.tab.find(); 
  2. "_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" : "a" } 
  3. "_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" : "b" } 
  4. "_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" : "c" } 
  5. "_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" : "d" } 
  6. "_id" : ObjectId("59354ccfd905432aeaccd542"), "name" : "e" } 
  7. "_id" : ObjectId("59354cd2d905432aeaccd543"), "name" : "f" }  

--查看 tab 表的数据跟原表数据相同,没有什么影响,说明其他表的日志在空跑。

以上就是备份结合 oplog 的恢复操作。

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

责任编辑:庞桂玉 来源: 51CTO博客
相关推荐

2019-08-20 14:02:07

MongoDB数据库恢复数据

2010-08-17 11:03:01

DB2恢复误删除表

2014-07-02 15:37:49

PLSQL

2016-11-17 12:46:45

2010-08-12 14:03:24

DB2恢复误删除表

2010-08-23 09:20:57

2021-06-28 12:05:04

Linux文件命令

2021-03-05 13:08:56

MySQL数据库命令

2020-12-11 11:00:17

Linux文件命令

2017-10-26 10:25:07

数据恢复服务

2009-06-22 14:18:39

IT

2022-12-01 14:02:02

MySQL数据文件

2018-10-08 11:29:10

2021-04-20 08:33:29

SQL快照数据

2018-04-28 15:28:44

数据库MySQL误删除

2020-12-04 10:22:47

Linux文件命令

2017-11-02 13:19:54

手机 备份

2017-04-01 18:30:47

MySQL误删除数据库

2023-07-26 13:17:04

数据表误删流程

2009-12-21 16:17:01

点赞
收藏

51CTO技术栈公众号