当我们使用 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条,对应了新增、修改、和删除操作,字段含义如下:
- 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:他们都是操作相关的数据内容
关于oplog的具体内容可以参考下面两个链接
http://stackoverflow.com/questions/11805057/reading-mongodb-binlogs
http://www.kchodorow.com/blog/2010/10/12/replication-internals/
MongoDB的oplog默认大小是空闲磁盘空间的5%。因为有理论认为如果你在单位时间(假设为x)内写了5% 的磁盘空间,那么你将在 19x 的时间内将磁盘耗尽。关于如何调整oplog的大小可以参考下面链接
http://www.kchodorow.com/blog/2011/02/22/resizing-your-oplog/
我之前做了一个对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格式方便阅读的内容,看起来如下图所示:
- 大小: 31.4 KB
分享到:
相关推荐
Mongo-oplog-monitor 是一个基于Java开发的工具,用于实时监控MongoDB数据库的oplog变化。在深入探讨这个工具之前,我们首先需要理解几个关键概念。 MongoDB是一个流行的NoSQL数据库系统,它使用一种称为oplog...
Mongo DB 是一个流行的开源、基于文档的分布式数据库系统,它以JSON格式存储数据,适合处理大量半结构化和非结构化数据。可视化工具是管理和操作Mongo DB的重要辅助手段,能够帮助用户更直观地查看和操作数据库。...
Mongo DB 客户端 破解版,保证可以使用。
Mongo DB 3.2.5官方帮助文档
发送mongo oplog流到kafka 内容描述 主要用于读取Mongo oplog数据并发送到kafka Mongo应该在具有复制和无分片模式的分片下工作 测试用例当前未运行 参考 用法 java -jar mongo-kafka.jar -c mongo-kafka.properties
Mongo DB 基础培训资料,比较详细,是我同事整理总结的
mongod --dbpath "C:\data\db" --logpath "C:\MongoDB\logs\mongod.log" --serviceName MongoDB --serviceDisplayName "MongoDB" --install ``` 这些参数含义如下: - `--dbpath` 指定数据文件的存储位置。 - `...
MongoDB的实用性着实令人着迷。MongoDB并不去迎合所有人的全部需求。它在功能和复杂性之间取得很好的平衡,并且将原先十分复杂的任务大大简化。也就是说,它具备支撑今天主流web应用的关键功能:索引,复制,分片,...
sql-to-mongo-db-query-converter sql-to-mongo-db-query-converter可帮助您基于SQL中提供的查询为MongoDb构建查询。玛文向com.github.vincentrussell:sql-to-mongo-db-query-converter添加依赖...
mongoDB客户端破解版使用方法: 解压后安装Installer-1.6.9下的Installer,然后把MongoVUE破解版目录下的MongoVUE拷贝到刚刚你安装的目录下,替换即可。
在使用mongo-shake之前,你需要确保源和目标MongoDB实例的版本兼容,同时,由于它依赖于MongoDB的oplog,所以源实例需要开启replication。在实际操作中,根据具体的业务需求,可能还需要考虑数据迁移的时间窗口、...
MongoDB的实用性着实令人着迷。MongoDB并不去迎合所有人的全部需求。它在功能和复杂性之间取得很好的平衡,并且将原先十分复杂的任务大大简化。也就是说,它具备支撑今天主流web应用的关键功能:索引,复制,分片,...
MongoDB的实用性着实令人着迷。MongoDB并不去迎合所有人的全部需求。它在功能和复杂性之间取得很好的平衡,并且将原先十分复杂的任务大大简化。也就是说,它具备支撑今天主流web应用的关键功能:索引,复制,分片,...
CI框架的mongo_db数据库扩展链接文件,有了它,CI框架链接mongo_db不在烦恼!
Mongo DB示例代码 这是简单的Rest API中的一些样例Mongo DB代码,该代码具有基本的CRUD终结点,以供参考。 安装 要运行此示例代码,请安装npm软件包并运行server.js文件。 npm install node server Mongo DB入门 ...
Mongo4Ben是一个专门为Benerator设计的Mongo DB插件,它为开发者提供了一个便捷的途径,在Benerator项目中集成和操作Mongo DB数据库。这个插件的出现使得开发人员能够在Mongo数据库实例中进行数据的存储、更新和查询...
node-mongodb-native, Mongo DB原生NodeJS驱动程序 描述官方的 MongoDB驱动程序。 在核心插件之上提供一个高级 API,这意味着最终用户。的MongoDB node.js-驱动程序什么地方文档http://mongodb.github.io
启动嵌入式Mongo DB服务器并轻松运行PHPUnit集成测试。 使用Mongo DB和PHP编写集成测试应该很容易(这是Java语言),该库使您可以在运行测试之前快速启动嵌入式Mongo DB服务器。 安装 该库会启动一个真正的Mongo DB...
在本"mongo db demo"中,我们将深入探讨MongoDB的基本概念、安装与配置、数据模型、查询操作以及一些高级特性。 一、MongoDB基本概念 1. 文档数据库:MongoDB基于文档存储,其数据模型是JSON格式的BSON(Binary ...
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像...