代码先锋网 代码片段及技术文章聚合

浅谈 Mongo DB 的 oplog

技术标签: mongodb

当我们使用 Mysql 数据库的时候,可以开启 binlog,除了做主从同步以外,我们还可以通过观察检索binlog日志知道某个表在指定时间内的操作历史。

那么在 Mongo DB 中是否也存在这样的东东呢?答案是肯定的,这个东西就是 oplog。

当Mongo DB 被设置成主库时(这一点很重要),在 local db 下有个 collection 叫oplog.$main ,这个就是Mongo 的 oplog。

例如,我们在 test 库上创建一个 collection 叫 employee,插入一个叫“小王”的员工,然后将这个小王变性为“女”,删除掉这个叫小王的员工。这就是一个典型的CRUD操作了。

> use test
switched to db test
> db.employee.insert({name:"小王", sex:"男"})
> db.employee.update({name:"小王"}, {$set : {sex:"女"}})
> db.employee.find();
{ "_id" : ObjectId("521272c7dd01ef8a1598a522"), "name" : "小王", "sex" : "女" }
> db.employee.remove({name:"小王"})
> db.employee.find();
>

我们查查对 employee 进行操作的所有的 oplog 记录

> use local
switched to db local
> db.oplog.$main.find({ns : "test.employee"});
{ "ts" : { "t" : 1376940743000, "i" : 1 }, "op" : "i", "ns" : "test.employee", "o" : { "_id" : ObjectId("521272c7dd01ef8a1598a522"), "name" : "小王", "sex" : "男" } }
{ "ts" : { "t" : 1376940770000, "i" : 1 }, "op" : "u", "ns" : "test.employee", "o2" : { "_id" : ObjectId("521272c7dd01ef8a1598a522") }, "o" : { "$set" : { "sex" : "女" } } }
{ "ts" : { "t" : 1376940828000, "i" : 1 }, "op" : "d", "ns" : "test.employee", "b" : true, "o" : { "_id" : ObjectId("521272c7dd01ef8a1598a522") } }
>

可以看到一共有3条,对应了新增、修改、和删除操作,字段含义如下:

[list]
[*] ts:操作发生时的时间戳,这个时间戳包含两部分内容t和i,t是标准的时间戳(自1970年1月1日 00:00:00 GMT 以来的毫秒数)而i是一个序号,目的是为了保证 t 与 i 组合出的 Mongo 时间戳 ts 可以唯一的确定一条操作记录
[*] op:操作类型,插入对应i;更新对应u;删除对应d;但有一种情况是n,它表示无操作(no-op),紧紧代表一个消息信息。
[*] ns:这个操作的库和collection的组合
[*] o与o2:他们都是操作相关的数据内容
[/list]

关于oplog的具体内容可以参考下面两个链接
[url]http://stackoverflow.com/questions/11805057/reading-mongodb-binlogs[/url]
[url]http://www.kchodorow.com/blog/2010/10/12/replication-internals/[/url]

MongoDB的oplog默认大小是空闲磁盘空间的5%。因为有理论认为如果你在单位时间(假设为x)内写了5% 的磁盘空间,那么你将在 19x 的时间内将磁盘耗尽。关于如何调整oplog的大小可以参考下面链接
[url]http://www.kchodorow.com/blog/2011/02/22/resizing-your-oplog/[/url]

我之前做了一个对oplog进行查询的小工具。
使用时需要先配置要查询的条件(oplog.properties 文件),例如

# 欲查询的 Mongo DB 的主机、端口和库
mongo.host=172.0.0.1
mongo.port=40017
mongo.db=test

# 查询条件
# query.collection - 要查询的 Mongo DB collection.
# query.field - 要查询的字段名称.
# query.type - 要查询的字段类型,支持内容为: "Integer", "String", "Boolean", "Long"
# query.value - 要查询的字段值.
# query.if_value_null - 这个值如果为 "true" 表示要查询的字段值为null.
query.collection=employee
query.field=_id
query.type=String
query.value=521272c7dd01ef8a1598a522
query.if_value_null=false

# 输出相关参数
# output.directory - 希望输出文件的路径.
# output.filename - 希望输出的文件名,但事实上你得到两个文件:
# filename.json (json format)
# filename.html (html format)
output.directory=/tmp/
output.filename=output


在之前的例子中你已经发现了,更新时的查询条件是不会记录在oplog中的,但所有相关操作都会记录 _id 值。所以我这里直接查找_id值为521272c7dd01ef8a1598a522 的内容,那么假如记录被删除如何找到 _id 值呢?我想这就需要我们在设计业务逻辑时做一下妥协,如果要物理删除一条记录,最好在另一个库或日志文件中将这个记录原来的 _id 值记录一下。

执行后会生成两个文件,一个是json格式保存的oplog原始内容(方便二次处理),另一个是html格式方便阅读的内容,看起来如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0089/7901/f9ced753-f913-3d96-aa86-53ae4742ca7f.png[/img]
版权声明:本文为bookong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bookong/article/details/84484560

智能推荐

Mongo DB初学

关于Mongo DB MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非...

基于docker的mongo-db开启授权密码访问

Docker版MongoDB的安装 url:https://www.jianshu.com/p/2181b2e27021 Docker Hub上关于mongo镜像的详细说明 基于docker安装mongo比较简单,但是如果给mongo开启密码访问,就有点复杂。  参考:https://blog.csdn.net/diyiday/article/details/77870004  ...

mongo db 在Linux下的简单操作

运行mongodb,中端输入 开始等待连接。 放到后台运行后,打开数据库连接:进入到bin目录 输入命令:mongo.exe 可以对现有的数据库进行操作。默认是连接到 test,贼坑。要切换到指定的数据库,需要 然后才可以对数据库里的数据进行操作。如 啊啊啊好坑啊,这个问题卡了一早上。网上真的是什么妖魔鬼怪都能写博客(包括我???)还有,这个mongo的神奇语法 不要忘了在 $set 后面加 :还...

调整mongodb的oplog的大小

最近,公司业务数据存储量增多导致mongo数据库数据增长! 因为是集群状态(PRIMARY + SECONDARY + SECONDARY) 查看了各个db的大小,发现除了业务db之外,mongo自带的localdb也在占用着很多的磁盘空间 如上!除了s(业务db)之外,lo(我改了下local名字)也占用了50G空间! 细致查看了各个表,发现local库中有一个oplog.rs占着51G空间 如...

spring-db-mongo配置

搭建一个基于spring的mongodb处理框架,涉及到主要的类及文件有: UserPopup实体类 UserPopupReadConverter、UserPopupWriteConverter 转换类 spring-mongo-config.xml 容器 mongo.properties 数据库配置文件 说明: 1、UserPopup实体类      关注注解的含义...

猜你喜欢

mongo db常见操作

文章目录 1.命令窗口操作 1.1连接本地数据库 1.2查看数据库 1.3切换数据库 1.4查看数据库中的表 1.5一次查询行数 1.6普通查询 1.7统计查询结果次数 1.8组合查询 2.python查询 1.命令窗口操作 1.1连接本地数据库 1.2查看数据库 1.3切换数据库 1.4查看数据库中的表 1.5一次查询行数 1.6普通查询 1.7统计查询结果次数 1.8组合查询 2.python...

【记录】mongo db bindIp配置

本地开发环境连接服务器mongo db总是超时,mongo没有密码,端口也开通了。 经过排查,是没有做bindIp的配置。 mongo版本:3.6 服务器系统:windows server(是的,windows) mongo安装目录下找到mongod.cfg配置文件,添加如下配置: 重启mongo服务后,连接成功。 特此记录一下。...

Mongo 导出/导入某个db

Mongo 导出/导入某个db 导出 导入...

通过Docker部署Mongo DB

1. 拉取镜像 2. 运行镜像 3. 创建用户 进入镜像MongoDB的实例mongo的数据库admin 也可以分布来完成 添加用户并验证...

Concurrent Test of Mongo DB zz

之前做的一些mongodb的测试都是在exsi的两台虚拟间做的,由于虚拟机的问题,性能很不稳定。这两天正好有两台服务器空下来了,就用来跑了一下mongodb的并发测试。 服务器软硬件配置: 服务器:Dell PowerEdge R710 CPU: Intel Xeon E5530 2.4G X 2 硬盘:SAS 300G X 4 建立 Raid10 内存:16G windows 2003 sp2 ...