查询MongoDB oplog.rs

本文详细介绍了MongoDB中oplog.rs的作用及结构,包括其默认配置、字段含义,并提供了多种实用的查询示例,帮助读者理解并利用oplog进行数据同步和审计。

oplog是Capped Collection,默认分配5%的空闲磁盘空间。

来看下oplog.rs的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
rs_test:SECONDARY> use local
switched to db local
 
rs_test:SECONDARY> db.oplog.rs.findOne();
{
         "ts"  : Timestamp(1465879171, 238),
         "h"  : NumberLong( "-2275413922284641862" ),
         "v"  : 2,
         "op"  "u" ,
         "ns"  "MyDB.SyncTable" ,
         "o2"  : {
                 "_id"  "bbf80260-3d58-49f1-9c8c-e093d5d57527"
         },
         "o"  : {
                 "_id"  "bbf80260-3d58-49f1-9c8c-e093d5d57527" ,
                 "EntityId"  "362569" ,
                 "TypeName"  "Product" ,
                 "Times"  : 14208,
                 "CreateTime"  : ISODate( "2014-11-15T14:35:51.916Z" ),
                 "LastModified"  : ISODate( "2016-06-14T04:38:21.708Z" ),
                 "LastOperationTime"  : ISODate( "2016-06-14T04:39:30.957Z" )
         }
}


字段含义

ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。
这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary。

op:1字节的操作类型,例如i表示insert,d表示delete。

ns:操作所在的namespace。
o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
o2: 在执行更新操作时的条件,仅限于update时才有该属性。

其中op,可以是如下几种情形之一:
"i": insert
"u": update
"d": delete
"c": db cmd
"db":声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.')
"n": no op,即空操作,其会定期执行以确保时效性。修改配置,会产生 "n" 操作。


查询示例


oplog.rs系统集合只用于复制,不能创建索引,查询语句会很慢。

1
2
3
4
5
6
7
8
> db.oplog.rs.find({},{ "ts" :1}).sort({$natural: -1})
"ts"  : Timestamp(1406185666, 1) }  
"ts"  : Timestamp(1406180043, 1) }  
"ts"  : Timestamp(1406180033, 1) }  
"ts"  : Timestamp(1406172831, 1) }  
"ts"  : Timestamp(1406171938, 1) }  
 
> db.oplog.rs.find({  "ts"  : {  "$gte"  : Timestamp(1406185630, 1) } },{ "ts" :1})


查询一小时内的oplog

1
2
3
var  SECS_PER_HOUR = 3600
var  now = Math.floor(( new  Date().getTime()) / 1000)  // seconds since epoch right now
> db.oplog.rs.find({  "ts"  : {  "$lt"  : Timestamp(now, 1),  "$gt"  : Timestamp(now - SECS_PER_HOUR, 1) } }


查询某一时间段内的oplog(当然注意时间是UTC存储)

1
2
3
var  since = Math.floor(ISODate( "2014-08-12T09:00:00.000Z" ).getTime() / 1000)
var  until = Math.floor(ISODate( "2014-08-12T15:00:00.000Z" ).getTime() / 1000)
> db.oplog.rs.find({  "ts"  : {  "$lt"  : Timestamp(until, 1),  "$gt"  : Timestamp(since, 1) } })


聚合统计各个集合的UPDATE操作量

1
2
3
4
> db.oplog.rs.aggregate([
         { $match: {  "op" : "u"  }},
         { $group: { _id: "$ns" ,count:{$sum:1}}}
     ])


oplog参考


Replica Set Oplog
https://docs.mongodb.com/manual/core/replica-set-oplog/












本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1789178 ,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值