我找到了一个查询来查看真空吸尘器运行的时间,但不是当前正在运行的真空吸尘器。 (http://heatware.net/databases/postgres-tables-auto-vacuum-analyze/)
是否有查询来完成此操作?我知道我可以点击pg_stat_activity,但有些真空吸尘器没有表名,而是有pg_toast.pg_toast_3621837,所以这不会100%有效。
答案 0 :(得分:4)
系统目录可以轻松解决此问题。我建议加入pg_locks
,因为autovacuum在其正在处理的表上获取ShareUpdateExclusiveLock
锁,以避免从pg_stat_activity
手动解析查询。
以下查询列出了正在自动清理的表,如果要抽真空toast表,则解决pg_toast引用,如{@ 3}} @Zeki链接的问题中所述。
SELECT n.nspname || '.' || c.relname
FROM pg_namespace n, pg_stat_activity a, pg_locks l, pg_class c
WHERE
a.query LIKE 'autovacuum: %'
AND l.pid = a.pid
AND l.mode = 'ShareUpdateExclusiveLock'
AND (c.oid = l.relation OR c.reltoastrelid = l.relation)
AND n.oid = c.relnamespace
AND n.nspname <> 'pg_toast';
请注意,虽然pg_stat_activity
和pg_locks
目录在数据库之间共享,但此查询仅列出当前数据库中自动清理的表,因为pg_relation
不是共享目录
答案 1 :(得分:2)
不是查找表是否正在吸尘,而是关闭所涉及的表的自动真空关闭:
alter table table_name_pattern
set (
autovacuum_enabled = false,
toast.autovacuum_enabled = false
);
表格模式是类似tbl*
的glob模式。在查询结束时,重新启动自动真空
alter table table_name_pattern
set (
autovacuum_enabled = true,
toast.autovacuum_enabled = true
);
编辑以回应评论:
查找所涉及的表是否被抽真空的查询是不必要的,也是无用的。如果知道一个或多个涉及的表被抽真空应该做什么?等待并继续重复查询查询,直到没有被抽真空?然后,当没有人开始长时间查询只是为了发现一段时间后自动真空再次开始?无关紧要。为什么不关闭自动真空吸尘器以避免所有麻烦?
在艰难的道路上做这件事没有道德上的优势,特别是如果艰难的方式会比简单的方式给出更糟糕的结果。更简单的代码更易于使用和理解,但它不一定更容易构建。很多时候它是相反的,需要更复杂的智力或准备。
如果在事务中更改了autovacuum设置并且该事务被回滚,则该设置将恢复到事务开始之前的设置
drop table if exists t;
create table t (id int);
begin;
alter table t
set (
autovacuum_enabled = false,
toast.autovacuum_enabled = false
);
\d+ t
Table "public.t"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id | integer | | plain | |
Has OIDs: no
Options: autovacuum_enabled=false
rollback;
\d+ t
Table "public.t"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id | integer | | plain | |
Has OIDs: no
但是交易中的设置不会在交易之外看到,所以我猜autovacuum仍会运行。如果这是真的,那么设置必须在事务之外完成,并且由一个作业控制,无论长时间运行的查询发生什么,它都会将其转回。