阅读mongoDB Binlogs

时间:2012-08-04 00:59:12

标签: mongodb binlog

在mysql中,我通过执行

来调试记录的更改方式

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

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

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以在MongoDB中使用类似的方法。 binlog的等价物是oplog(通常用于MySQL binlog)用于复制。在MongoDB中,oplog是名为oplog.rs的{​​{3}},它位于local数据库中。作为一个上限集合,oplog保留了固定的历史记录。你可以capped collection

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

注意:推荐的生产配置是使用至少包含三个节点的复制,因为这可以提供故障转移和数据冗余。

一系列有用的博客文章解释了oplog格式:change the size of the oplog。您可以像查看普通的MongoDB集合一样查询它,这样您就可以尝试一些更新,看看生成的命令是什么。

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

> 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
    }
}

在上面的示例中,我找到了ObjectID为op的文档的更新条目(u501c87fa9d2b5b2b54437125)。应用了两个列更新:name,iq。

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

答案 1 :(得分:0)

mongodb中有一个oplog,但只有在拥有副本集时才会填充它。这是一个capped collection

您可以从shell中查询它:

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