读取mongoDB二进制日志

读取mongoDB二进制日志,mongodb,binlog,Mongodb,Binlog,在mysql中,我通过执行以下操作来调试记录是如何更改的 mysqlbinlog bin-88.log | grep“记录id”--before=2--after=2 我如何使用mongo做类似的事情 谢谢 mongodb中有一个oplog,但只有当您有一个副本集时才会填充它。这是一个好主意 您可以从shell中查询它,如下所示: use local; db.oplog.rs.find(); // specify "ns" and "_id" here, if desired 您可以在Mong

在mysql中,我通过执行以下操作来调试记录是如何更改的

mysqlbinlog bin-88.log | grep“记录id”--before=2--after=2

我如何使用mongo做类似的事情


谢谢

mongodb中有一个oplog,但只有当您有一个副本集时才会填充它。这是一个好主意

您可以从shell中查询它,如下所示:

use local;
db.oplog.rs.find(); // specify "ns" and "_id" here, if desired

您可以在MongoDB中使用类似的方法。binlog的等价物是,它(与MySQL binlog一样)通常用于复制。在MongoDB中,
oplog
是一个名为
oplog.rs
的程序,它位于
本地
数据库中。作为一个有上限的集合,oplog保留固定数量的历史记录。你可以

为了让MongoDB创建oplog,您确实需要配置
mongod
以使用复制。如果只需要oplog,则可以创建一个只有一个节点的虚拟副本集

注意:建议的生产配置是使用至少三个节点的复制,因为这提供了故障切换和数据冗余

解释oplog格式的一系列有用的博客文章以:。您可以像查询普通MongoDB集合一样对此进行查询,因此您可以尝试一些更新,并查看生成的命令

在给定名称空间(
mydb
数据库,
mycollection
)中查找给定对象ID(
o2.\u ID
)的所有更新的示例:

在上面的示例中,我找到了ObjectID为501c87fa9d2b5b2b54437125的文档的更新条目(
op
u
)。应用了两个列更新:名称、iq


与MySQL Binlog的一个区别是MongoDB oplog是要应用的更改列表;MySQL binlog是修改数据的语句列表。
oplog
格式允许MongoDB多次安全地应用条目,而不会产生不必要的副作用。这还意味着您将在oplog中找到影响多个文档的update命令的结果,作为每个文档的单独条目,而不是binlog中出现的单个“update..”语句。

+1,比我的更彻底!当你说“不是查询日志”时,听起来宾语日志是查询日志,但实际上是插入/更新/删除语句日志(宾语日志没有不修改的查询)。@WesFreeman:谢谢你的反馈。。我更新了最后一段,用
语句
而不是
查询
来澄清。
> use local
> db.oplog.rs.find({'ns':'mydb.mycollection', 'o2._id' : ObjectId("501c87fa9d2b5b2b54437125")})
{
    "ts" : Timestamp(1344047454000, 1),
    "h" : NumberLong("226994175309144171"),
    "op" : "u",
    "ns" : "mydb.mycollection",
    "o2" : {
        "_id" : ObjectId("501c87fa9d2b5b2b54437125")
    },
    "o" : {
        "name" : "Bobby Tables",
        "iq" : 180
    }
}