查询以确定哪些表正在被抽真空?

我发现了一个查询来查看吸尘器何时运行,但没有运行吸尘器。 (http://heatware.net/databases/postgres-tables-auto-vacuum-analyze/)

有没有一个查询来完成这个? 我知道我可以击中pg_stat_activity,但是有些吸尘器没有表名,而是有pg_toast.pg_toast_3621837,所以这不会100%的时间。


系统目录可以很容易地解决这个问题 。 我建议加入pg_locks因为autovacuum在它正在处理的表上获取ShareUpdateExclusiveLock锁定,以避免手动解析来自pg_stat_activity的查询。

下面的查询列出了自动清理的表,如果吐真表正在被抽真空,解决了pg_toast引用问题,正如在autovacuum中的Postgres pg_toast中所解释的 - 哪个表? 由@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_activitypg_locks目录是跨数据库共享的,但此查询仅列出当前数据库中自动pg_locks的表,因为pg_relation不是共享目录。


而不是查找表是否被抽真空关闭相关表的自动真空:

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
);

编辑回应评论:

查询所涉及的表是否被抽真空是不必要的和无用的。 如果知道所涉及的一个或多个表正在被抽真空,它应该完成什么? 等待并不断重复查询查询,直到没有人被抽空? 而当没有人开始长时间查询时,发现一段时间后,汽车真空又被启动了? 无关紧要。 为什么不只是关闭汽车真空,并避免所有的麻烦?

在艰难的过程中没有道德上的优势,尤其是如果困难的方式会给出比简单的结果更糟糕的结果。 简单的代码更易于使用和理解,但不一定更容易构建。 很多时候情况正好相反,需要更多的智力努力或准备,然后是复杂的。


如果自动清理设置在事务内部被更改并且该事务被回滚,则该设置将返回到事务开始之前的任何设置

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仍然会运行。 如果这是真的,则该设置必须在事务之外完成,并由作业进行控制,无论长时间运行的查询发生什么情况,作业都会将其关闭。

链接地址: http://www.djcxy.com/p/80325.html

上一篇: Query to determine which tables are currently being vacuumed?

下一篇: Unable to modify annotation of package