DBAtlas · 数据库运维图谱

监控正在运行的 autovacuum/VACUUM 操作进度

PostgreSQL维护

命令

SELECT p.pid,
       a.backend_type,
       p.datname,
       p.relid::regclass AS table_name,
       p.phase,
       pg_size_pretty(p.heap_blks_total * current_setting('block_size')::bigint) AS table_size,
       round(100.0 * p.heap_blks_scanned / NULLIF(p.heap_blks_total, 0), 1) AS scanned_pct,
       round(100.0 * p.heap_blks_vacuumed / NULLIF(p.heap_blks_total, 0), 1) AS vacuumed_pct,
       p.index_vacuum_count,
       now() - a.xact_start AS running_for,
       a.wait_event_type || ':' || a.wait_event AS wait,
       left(a.query, 80) AS query
FROM pg_stat_progress_vacuum p
JOIN pg_stat_activity a USING (pid)
ORDER BY running_for DESC;

-- Busy autovacuum workers / upper limit
SELECT count(*) FILTER (WHERE backend_type = 'autovacuum worker') AS av_workers_busy,
       current_setting('autovacuum_max_workers') AS av_max_workers
FROM pg_stat_activity;

作用

对每个正在运行的 VACUUM(autovacuum worker 或手动),显示表、阶段、已扫描/已清理的堆百分比、索引清理轮数以及等待事件;以及忙碌的 autovacuum worker 数量。

适用场景

用于估算大表上的 VACUUM 何时完成、是否所有 autovacuum worker 都在忙(有表在队列中等待),以及 vacuum 是否因限流而等待。

注意

index_vacuum_count > 1 表示死元组列表无法放入内存,索引被扫描了多次;请调高 maintenance_work_mem/autovacuum_work_mem(PG17 之前此用途最多使用 1GB)。wait = Timeout:VacuumDelay 是基于成本的限流(autovacuum_vacuum_cost_delay/cost_limit)。不要终止查询文本中带有 'to prevent wraparound' 的 autovacuum;它会立即重新启动。VACUUM FULL 和 CLUSTER 显示在 pg_stat_progress_cluster 中,而不是此视图中。

在 DBAtlas 中打开 →

相关内容