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
评论区