微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL – 查询以确定哪些表当前正在被清理?

我找到了一个查询来查看真空吸尘器运行的时间,但不是当前正在运行的真空吸尘器. ( 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手动解析查询.

以下查询列出了正在自动清理的表,如果要清理toast表,则解决pg_toast引用,如@Zeki链接Postgres pg_toast in autovacuum – which table?问题中所述.

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不是共享目录.

原文地址:https://www.jb51.cc/postgresql/191920.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐