Spi*_*ike 2 postgresql transaction vacuum
最近,我的一个数据库遇到了 XID 环绕问题。所以,我从模式开始single-user
并运行vacuum
。一切都很好。但是,当我检查datfrozenxid
它时,它约为 15 亿,而我的txid_current
约为 700 亿。我觉得,它有很大的不同,有些东西是错误的。
下面的查询,我曾经看到datfrozenxid
过pg_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
,,,,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)
Run Code Online (Sandbox Code Playgroud)
所以,这xidWarnLimit
是 37.47 亿,而我目前的金额txid_current
超过 700 亿。奇怪的是,这个数字txid_current
还大于xidWrapLimit
37.58 亿。
如何找出何时会引发有关环绕警告限制的警告。
(使用Pg9.5)
所以,xidWarnLimit 是 37.47 亿,而我当前的 txid_current>700 亿。奇怪的是 txid_current 大于 xidWrapLimit,即 37.58 亿。
您可能正在查看 的原始返回值txid_current()
,它不是像您正在查看的 XID 限制那样的 32 位值。相反,它是
64 位格式,使用“纪元”计数器进行扩展,因此在安装的生命周期内不会回绕。
(参考)。您可以诱骗一个 32 位值,txid_current()
您可以将其与您的xidWrapLimit
、xidStopLimit
等进行比较,如下所示:
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等工具,它将通过一些可配置的阈值为您处理此检查。
归档时间: |
|
查看次数: |
1834 次 |
最近记录: |