最近,我的一个数据库遇到了 XID 环绕问题。所以,我从single-user
mode 开始并运行vacuum
. 一切都很好。但是,当我检查datfrozenxid
它的 ~15 亿美元时,我txid_current
的是 ~700 亿美元。我觉得,它有很大的不同,而且有问题。
下面的查询,我曾经看过datfrozenxid
来自pg_database
select datname, datfrozenxid, age(datfrozenxid) from pg_database order by datname;
我从http://www.rummandba.com/2014/02/understanding-xid-wrap-around.html阅读了 XID 环绕场景
根据上面链接中给出的示例,这对我来说很有意义。但是,我已经用我的统计数据计算了xidWrapLimit
, xidStopLimit
, xidWarnLimit
, 。xidVacLimit
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)
所以,xidWarnLimit
是 37.47 亿,我目前txid_current
> 700 亿。而奇怪的txid_current
是大于xidWrapLimit
37.58亿。
如何找出何时会引发有关环绕警告限制的警告。
(使用 Pg9.5)
您可能正在查看 的原始返回值
txid_current()
,它不像您正在查看的 XID 限制那样是 32 位值。相反,它是(参考)。您可以哄骗一个 32 位值
txid_current()
,您可以将其与您的xidWrapLimit
,xidStopLimit
等进行比较,如下所示:H/T 给 Erwin 以获取此提示。请记住,这些 XID 值在 2^32 处环绕。
对于它的价值,我认为你链接到的博客文章过于复杂化了这个话题。要注意 XID 环绕,您只需要检查:
如果达到最大值,请发出警报。年龄超过10亿左右。如果它接近 20 亿,您将面临迫在眉睫的危险!您可以使用check_postgres.pl 之类的工具,它会使用一些可配置的阈值为您处理此检查。