MongoDB误删表恢复
发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,一、场景描述公司某工程师执行db.giveget_card.drop(),误将线上表删除。幸好每天都有做备份,这个时候就体现了备份的重要性了,哈哈哈。。。二、模拟故障过程备份数据大小:rs_test0
千家信息网最后更新 2024年11月25日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安全错误
数据库的锁怎样保障安全
重庆web前端软件开发靠谱吗
格力电器应用软件开发面试几轮
网络安全问题灵魂摆渡人
苏州交友软件开发公司
诸暨市宏伟互联网科技
数据库系统概论3.3.2
软件开发政府项目
机算计网络技术是什么意思
常州欧慕网络技术有限公司
塔式服务器 sas硬盘
深圳服务器机柜哪里买
金融科技网络安全及技术风险
请检测一下服务器是否正常
数据库表大小写区分吗
杭州杉饶网络技术有限公司
静安区优势软件开发服务产品介绍
php数据库备份软件
如何学习软件开发软件开发
服务器设计与管理专业
ff14捏脸数据库
电脑软件开发的原理
和睦小镇保卫战 服务器
服务器电源质量
网络安全问题灵魂摆渡人
服务器中对销售管理人员
数据库两表联查但是字段为空
iot 服务器 自建
微信传照片会经过服务器吗
苹果服务器图片在哪下载
云南蓝牙软件开发