5

在mysql中,我通过做来调试记录是如何改变的

mysqlbinlog bin-88.log | grep "记录 ID" --before=2 --after=2

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

谢谢!

4

2 回答 2

6

您可以在 MongoDB 中使用类似的方法。binlog 的等价物是oplog,它(如 MySQL binlog)通常用于复制。在 MongoDB 中,这oplog是一个名为的上限集合oplog.rs,它存在于local数据库中。作为一个有上限的集合,oplog 保留了固定数量的历史记录。您可以更改 oplog 的大小

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

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

一系列有用的博客文章解释了 oplog 格式,开头是:Replication Internals。您可以像查询普通 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

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

于 2012-08-04T02:48:41.263 回答
0

mongodb 中有一个 oplog,但只有当您有副本集时才会填充它。这是一个封顶集合

您可以像这样从 shell 查询它:

use local;
db.oplog.rs.find(); // specify "ns" and "_id" here, if desired
于 2012-08-04T02:38:27.743 回答