首页 > 解决方案 > Autovacuum 不删除死行(并且 xmin 水平与任何会话的 xmin 都不匹配)

问题描述

我有一张有 85% 死行的表,这给我带来了麻烦。我VACUUM (VERBOSE) MY_TABLE按照这个SO 响应执行,根据结果,当前没有活动会话阻止我的 xmin 水平(所以我看不到我可以终止哪个会话以导致 autovacuum 删除死行)。

结果VACUUM (VERBOSE) MY_TABLE是这样的:

...
CPU: user: 0.01 s, system: 0.01 s, elapsed: 0.04 s.
INFO:  "my_table": found 69454 removable, 364950 nonremovable row versions in 41903 out of 82105 pages
DETAIL:  165590 dead row versions cannot be removed yet, oldest xmin: 3914663626
There were 10532004 unused item pointers.
Skipped 3 pages due to buffer pins, 39715 frozen pages.
...

然后,运行此查询:

SELECT pid, datname, usename, state, backend_xmin
FROM pg_stat_activity
WHERE backend_xmin IS NOT NULL
ORDER BY age(backend_xmin) DESC;

产出:

  pid  | datname  |     usename     | state  | backend_xmin 
-------+----------+-----------------+--------+--------------
 16664 | my_table | ¤               | active |   3914835133
 30837 | my_table | my_user         | active |   3915292658
...

所以我看不到任何 xmin 低至3914663626.

我还尝试了该 SO 答案中的另外两个查询:一个用于准备好的事务和用于复制槽,并且都没有产生任何行。

vacuum移除那些死行还能带来什么?

(如果你想要VACUUM (VERBOSE) MY_TABLE让我知道的完整输出,大约是 30 行。)

标签: postgresqlvacuum

解决方案


推荐阅读