MongoDB误删表恢复
一、场景描述
公司某工程师执行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 的恢复操作。
备份很重要!!! 备份很重要!!! 备份很重要!!!重要的事情讲三遍~~~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
十个网络优化改造案例之一 交换机由单机改造为双机热备
主要内容及技术 Cisco交换机配置HSRP实现双机热备 关键字:Cisco、HSRP、多模光纤、光模块选择 前言: 在设计网络的时候,最先要避免的就是“单点故障”。什么是“单点故障”?简单的说,就是担任核心转发任务的设备只有一台,当这台设备负载过重或者是遇到其他故障的时候停机,从而使得网络出现瘫痪等问题。为了避免“单点故障”的出现,必须为担任核心转发任务的设备配置热备份,也就是两台设备,一主一备,当主用设备发生故障的时候,能够将数据转发任务自动的切换到备份设备上。 热备份技术在网络中非常常用,不仅是交换机和路由器,就连服务器也会使用到热备份技术。交换路由的热备份技术常用的有HSRP(Cisco私有协议)、VRRP等。本案例就以HSRP技术为例,讲解在实际工作中如何使用HSRP来实现热备份的。 一、项目需求 某国有企业的数据中心的办公区域网络目前只有一台Cisco 6509在担任汇聚层交换机任务,考虑到只有一台交换机工作,网络可靠性比较低,无法实现热备的功能。现甲方要求增加一台Cisco 6509,和原有的Cisco 6509配置成HSRP,实现热备份的功能。 现行的网络结构如下图所...
- 下一篇
CentOS 6.9之LVM创建,扩容
在系统安装时候大多情况下有可能因为考虑不周,导致服务器空间不足问题,这时候如果没有lvm逻辑卷管理工具的话,往往就是查×××器大文件删除之,或者应用迁移。但如果有了lvm逻辑卷管理,只需要新增硬盘,并将新硬盘的空间划分到不足的分区及可,如果空间浪费也可以减少对应分区的空间,这样可大大增加对空间的利用率 在安装系统时使用lvm逻辑卷管理,创建方法如下: 在系统安装到硬盘分区时选择“创建自定义布局” 首先创建一个/boot分区,/boot分区不能在逻辑卷中,所以先需要创建一个分区给/boot,选中空闲的空间,点击创建,然后点击标准分区,点创建 创建/boot分区,挂载点选择/boot,大小设定为500,单位为MB,然后固定大小,点击创建,至此/boot分区创建完成 创建lvm物理卷点击剩余的空间,创建,创建时选择“lvm物理卷” 创建lvm物理卷,文件系统类型默认,空间大小使用全部可用空间,点击创建,至此物理卷创建完毕 从lvm物理卷创建lvm逻辑卷组,选中刚创建的lvm物理卷,然后点创建,创建时选择lvm卷组 从lvm逻辑卷组创建lvm逻辑卷,打开创建卷组对话框,输入卷组名称(随意,看懂...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G