侧边栏壁纸
博主头像
平凡的运维之路博主等级

行动起来,活在当下

  • 累计撰写 49 篇文章
  • 累计创建 25 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Mongodb 误删除 使用Oplog数据恢复

平凡的运维之路
2024-07-16 / 1 评论 / 0 点赞 / 18 阅读 / 8688 字

Oplog是什么

  • Oplog是什么

capped collection 是一个固定大小的集合,当结合大小达到最大值时,会滚动更新之前的数据,被覆盖。用于记录mongodb的全部操作,对一个复制集来说,所有的写操作都是在主节点(primary)上进行的,而oplog记录这些操作,`secondary member同步读取oplog并应用其上的改变来做到与主节点同步.达到副本集数据一致。

oplog的数据结构

  • 结构
    登录到副本集主节点上,进入local库中查看oplog.rs集合
shard1:PRIMARY> db.oplog.rs.find({"ns" : "0101490467.call_detail_back"}).limit(1).pretty()
{
 "ts" : Timestamp(1548406125, 42),  
 "t" : NumberLong(16),
 "h" : NumberLong("-2838550342168261769"),
 "v" : 2,
 "op" : "i",
 "ns" : "0101490467.call_detail_back",
 "o" : {
  "_id" : "DDCS-CLOUD10:0101490467:25800978:SIP:25800978::1548404509:1548404509:204:1",
  "agent_id" : "25800978",
  "agent_name" : "25800978",
  "end_type" : 2,
  "area_id" : "",
  "start_type" : 2,
  "duration" : 0,
  "agent_dn" : "SIP:25800978",
  "has_alerting_event" : 0,
  "sub_serviceid" : "1",
  "orig_skill_id" : "",
  "remote_url_wx" : "",
  "is_release" : -1,
  "call_type" : 1,
  "campaign_id" : "",
  "is_handled" : 0,
  "remote_url" : "",
  "record_addr" : "NoRecordAddr",
  "end_time_halfhour" : "1548404100",
  "end_time" : "1548404509",
  "region_id" : "010",
  "state_num" : 1,
  "session_id" : "7303794914734419154",
  "main_serviceid" : "1",
  "serial_num" : 1,
  "global_serial_num" : 2,
  "start_time" : "1548404509",
  "ent_id" : "0101490467",
  "local_url" : "SIP:25800978",
  "skill_name" : "人工服务",
  "accept_skill_id" : "",
  "skill_type" : "",
  "skill_id" : "1000003096",
  "local_url_wx" : "",
  "status" : 204
 }
}

  • oplog结构 解析说明
ts: 操作发生的时间
h: 记录的唯一ID
v: 版本信息
op: 写操作的类型
 n: no-op
 c: db cmd
 i: insert
 u: update
 d: delete

ns: 操作的namespace,即: 数据库.集合
o: 操作所对应的文档
o2: 更新时所对应的where条件,更新时才有

设置opslog大小

  • oplog大小
[mongodb@mongodb4 config]$ cat shard33.conf
logpath=/home/mongodb/log/shard33.log
pidfilepath=/home/mongodb/shard33.pid
logappend=true
bind_ip=192.168.128.1
port=27017
fork=true
replSet=shard3
dbpath=/home/mongodb/data/shard33
oplogSize=10000   #设置oplog大小,此大小是根据业务数据量来设置,尽可能大点。
noprealloc=true
shardsvr=true
directoryperdb=true
storageEngine = wiredTiger
wiredTigerCacheSizeGB = 2 
syncdelay = 30
wiredTigerCollectionBlockCompressor = snappy

误删除集合之后进行数据恢复

  • 如果部署的是Mongo分片集群,看有几个副本集,在副本集主节点上,首先全量把oplog.rs备份,然后在查询找到做删除操作的数据在导出
#全量备份
./mongodump -h 192.168.128.1 --port 27017 -d local -c oplog.rs -o /backup/restore-all  

#指定时间或者相关条件,以下案例是查询的ns也就是集合名称包含bx_tables的oplog操作相关数据备份导出
./mongodump -h 192.168.128.1 --port 27017 -d local -c oplog.rs -q '{ts:{$gt:Timestamp(1481095782, 2)},"ns":{"$regex":"call_detail_back"}}' -o /backup/restore-1
  • 由于怕在原有的mongo上进行oplog数据回放的话,怕影响其他数据,就单独部署副本集集群,进行oplog数据回放之后,在把集合导出,然后在导入到现网Mongo库当中,使用 --oplogReplay,不需要–oplogLimit参数
执行下面的命令可能会报错:`error applying oplog: applyOps:Failed to apply insert due to missing collection意思说没这个集合无法插入,可以在此行报错中找到集合名称,登录到该新的副本集主节点上创建该集合,如果你事先知道该集合也可以提前创建

./mongorestore -h 192.68.128.2 -p 27017 --oplogReplay /backup/

  • 上面命令执行成功之后,登录到新的副本集上查看是否有数据,找到缺少的数据库在mongodump下来,在导入到现网mongodb中,数据也就恢复完成
./mongodump -h 192.68.128.2:27017 -d 0101490467 -c call_detail_back 
./mongorestore -h 192.68.128.2:27017 -d 0101490467 -c xxx_ent_record dump/cdesk/call_detail_back.bson

0

评论区