MongoDB如何查oplog.rs集合里的操作日志
oplog是Capped Collection,默认分配5%的空闲磁盘空间。介绍一下mongodb local库的作用local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息bertram:PRIMARY> use local;switched to db localbertram:PRIMARY> show tables;meoplog.rsreplset.electi
oplog是Capped Collection,默认分配5%的空闲磁盘空间。
介绍一下mongodb local库的作用
local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息
bertram:PRIMARY> use local;
switched to db local
bertram:PRIMARY> show tables;
me
oplog.rs
replset.election
replset.minvalid
startup_log
system.profile
system.replset
各个集合的详解:
local库下面的me集合保存了服务器名称
local库下面的replset.minvalid集合保存了数据库最新操作的时间戳
local库下面的startup_log集合记录这mongod每一次的启动信息
local库下面的system.indexes集合记录当前库的所有索引信息
local库下面的system.replset记录着复制集的成员配置信息rs.conf()读取这个集合
local库下面的oplog.rs集合记录着所有操作,MongoDB就是通过oplog.rs来实现数据同步的。当Primary节点插入一条数据后,oplog.rs集合中就会多一条记录
findOne是返回符合条件的第一条记录,然后关闭游标。find返回符合条件的所有记录。
bertram:PRIMARY> 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系统集合只用于复制,不能创建索引,查询语句会很慢。
> 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
> 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存储)
> 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操作量
> db.oplog.rs.aggregate([
{ $match: { "op":"u" }},
{ $group: { _id:"$ns",count:{$sum:1}}}
])
参考:官网文档
更多推荐
所有评论(0)