在MongoDB 5.x中有一个非常方便的附加项,它允许在事务之外的某些读取操作中强制执行snapshot
读取关注点,并指定通过atClusterTime
获取快照的时间戳。如果没有提供时间戳,mongo
将自动选择它,并将其值返回给用户以供将来参考。请参见:
https://www.mongodb.com/docs/v6.0/reference/read-concern-snapshot/#read-concern-and-atclustertime
由于MongoDB 4.x还支持读关注点snapshot
(但只支持写关注点majority
的事务),所以我想知道是否也可以获得一些信息,说明快照是什么时候拍摄的,类似于5.x正在做的事情。我知道我不能显式地指定atOperationTime
,但是mongo
需要自己选择时间戳,所以期望这些信息在某个地方是可用的似乎是合理的。
发布于 2022-07-10 21:47:13
对于Mongo < 5.0,恐怕没有获得集群时间的方便方法。您可以随时检查日志,但我不认为这是一个可靠的解决方案。无论如何,这里有一个您可以在mongo上运行的脚本:
db.adminCommand( { getLog : "global" } ).log
.map(x => JSON.parse(x))
.filter(x => x.c === "TXN")
.forEach(x => print(JSON.stringify(x.attr.parameters.readConcern)))
让我们首先说,带有getLog
过滤器的global
命令只返回最新的日志,所以如果您要查找旧的事务,我想您需要解析物理日志文件。这个剧本:
readConcern
参数并将它们打印到控制台您应该会看到一个类似于此的输出:
{"level":"snapshot","provenance":"clientSupplied"}
{"level":"snapshot","afterClusterTime":{"$timestamp":{"t":1657483320,"i":1}},"provenance":"clientSupplied"}
{"level":"snapshot","afterClusterTime":{"$timestamp":{"t":1657483977,"i":1}},"provenance":"clientSupplied"}
我们找到了集群时间:afterClusterTime
。
在第一个事务中,我向一个空集合添加了一个文档,这可能是为什么它没有显示集群时间(当然也没有使用)。我不知道每个参数的含义,也不知道所有无法获得集群时间的情况,但是有好消息。若要获取属于给定事务id的日志(如果存在的话),需要应用此筛选器(而不是上面所示的):
.filter(x => x.c === "TXN" && x.attr.parameters.txnNumber === your_txn_id)
https://stackoverflow.com/questions/72757752
复制相似问题