我只是向一张桌子发出这个命令,它已经用了 2 个小时但还没有完成:vacuum verbose people_data
我什至无法取消该过程,因为我无法使用此查询查看 PID:
SELECT pid,
now() - pg_stat_activity.query_start AS duration,
query,
state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes'
and state = 'idle'
order by duration desc;
该表的大小仅为 16 GB。死元组最多只能使用 130 个(只有 10 个表有超过 100 个死元组):
select n_live_tup, n_dead_tup, relname
from pg_stat_all_tables
where n_dead_tup > 100
limit 20;
现在有人向我反映他们无法访问数据库?幸运的是这是开发数据库,所以它只是停止了开发过程。
如何在看不到 PID 的情况下取消真空?
VACUUM (VERBOSE)
不会阻止并发表访问。你没有用VACUUM (FULL)
,是吗?您看不到 autovacuum 进程的原因是它有
state = 'active'
. 您可以查看视图pg_stat_progress_vacuum
以查看是否以及如何VACUUM
进行。对于像这样的小表,最可能的解释是有一个并发打开的数据库事务在表上持有高锁。这也可以解释为什么人们报告说他们无法访问数据库。