XID 环绕指标尚不清楚

Spi*_*ike 2 postgresql transaction vacuum

最近,我的一个数据库遇到了 XID 环绕问题。所以,我从模式开始single-user并运行vacuum。一切都很好。但是,当我检查datfrozenxid它时,它约为 15 亿,而我的txid_current约为 700 亿。我觉得,它有很大的不同,有些东西是错误的。

下面的查询,我曾经看到datfrozenxidpg_database

select datname, datfrozenxid, age(datfrozenxid) from pg_database order by datname;
Run Code Online (Sandbox Code Playgroud)

我已从http://www.rummandba.com/2014/02/understanding-xid-wrap-around.html阅读了 XID 环绕场景

根据上面链接中给出的示例,这对我来说很有意义。但是,我用我的统计数据计算过xidWrapLimit,,,,xidStopLimitxidWarnLimitxidVacLimit

xidWrapLimit = oldest_datfrozenxid + (MaxTransactionId >> 1);
xidStopLimit = xidWrapLimit - 1000000;
xidWarnLimit = xidStopLimit - 10000000;
(I haven't given all the values here since I am looking only for xidWarnLimit)
Run Code Online (Sandbox Code Playgroud)

所以,这xidWarnLimit是 37.47 亿,而我目前的金额txid_current超过 700 亿。奇怪的是,这个数字txid_current还大于xidWrapLimit37.58 亿。

如何找出何时会引发有关环绕警告限制的警告。

(使用Pg9.5)

Jos*_*idt 7

所以,xidWarnLimit 是 37.47 亿,而我当前的 txid_current>700 亿。奇怪的是 txid_current 大于 xidWrapLimit,即 37.58 亿。

您可能正在查看 的原始返回值txid_current(),它不是像您正在查看的 XID 限制那样的 32 位值。相反,它是

64 位格式,使用“纪元”计数器进行扩展,因此在安装的生命周期内不会回绕。

参考)。您可以诱骗一个 32 位值,txid_current()您可以将其与您的xidWrapLimitxidStopLimit等进行比较,如下所示:

SELECT txid_current() % (2^32)::bigint;
Run Code Online (Sandbox Code Playgroud)

请向 Erwin 提供此提示。请记住,这些 XID 值在 2^32 处环绕。

无论如何,我认为您链接到的博客文章使这个主题过于复杂化。要注意 XID 环绕,您实际上只需要检查:

SELECT max(age(datfrozenxid)) FROM pg_database;
Run Code Online (Sandbox Code Playgroud)

并在最大时发出警报。年龄超过10亿左右。如果它接近 20 亿,您将面临迫在眉睫的危险!您可以使用check_postgres.pl等工具,它将通过一些可配置的阈值为您处理此检查。