非用户表的 Postgres 事务 ID 环绕

Postgres transaction id wraparound for non-user tables

我有在大型 Postgres 10 集群上遇到事务 ID 回绕的风险,因为一个长期的 运行 事务不是空闲的(尽管它实际上在某种意义上是空闲的,因为它被卡在由于查询中使用的 Cassandra FDW 出现问题而处于活动状态)。我及时抓住了它,并且大量使用 vacuum freeze 能够让一切恢复控制......也许吧。

数据库级别的一切看起来都很好:

warehouse=# SELECT datname, age(datfrozenxid) FROM pg_database;
  datname  |   age
-----------+----------
 postgres  | 85253797
 template1 | 85253797
 template0 | 85253797
 warehouse | 89423564
 repmgr    | 85253797
(5 rows)

但我仍然在日志中看到这些并且在复制时遇到问题(目前在问题得到解决之前被禁用):

WARNING:  oldest xmin is far in the past
HINT:  Close open transactions soon to avoid wraparound problems.

使用此查询查看各种数据库,我发现了一些有关的信息:xid 年龄正好达到环绕限制,但所有这些都不能像索引那样 vacuum freeze,序列和系统表:

select relname, age from (select relname, age(relfrozenxid) age from pg_class) a order by age desc;
                  relname                  |    age
-------------------------------------------+------------
 user_mappings                             | 2147483647
 pg_stat_sys_indexes                       | 2147483647
 pg_stat_user_indexes                      | 2147483647
 pg_statio_all_indexes                     | 2147483647
 pg_statio_sys_indexes                     | 2147483647
 ...

作为从中恢复的一部分,有一个重新启动,因为这是清除卡住查询的唯一方法,所以我认为我仍然没有任何可能导致高 xids 的东西,比如长期准备好的语句、临时表等,所以我不清楚是什么导致了这个问题。

那么,关于这一切的几个相关问题:

  1. 这是个问题吗(除了生成一堆烦人的错误消息之外)?
  2. 我能做些什么吗?
  3. 这会不会干扰复制,我现在无法让副本被赶上(总是向我显示关于缺少 WAL 的主副本和副本的错误消息源源不断)?

你展示的表都是浏览量,年龄2147483647正好反映出relfrozenxid对他们来说是0

视图没有元组,它们不需要 VACUUM,所以这些是误报。

您能确定导致警告的确切原因吗?

有些东西会阻塞 VACUUM 并在重启后继续存在:复制槽和准备好的事务。

您的复制可能落后了,我认为与事务 ID 问题没有直接关系(但我不能确定,因为您没有显示日志)。