DBAtlas · Atlas de operaciones de bases de datos

Monitorear el progreso de las operaciones autovacuum/VACUUM en curso

PostgreSQLMantenimiento

Comando

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;

Qué hace

Muestra, para cada VACUUM en ejecución (autovacuum worker o manual), la tabla, la fase, el porcentaje del heap recorrido/limpiado, el número de pasadas de index vacuum y el wait event; además del número de autovacuum workers ocupados.

Cuándo usarlo

Para estimar cuándo terminará un VACUUM sobre una tabla grande, si todos los autovacuum workers están ocupados (tablas esperando en la cola) y si el vacuum está esperando por throttling.

Precaución

index_vacuum_count > 1 significa que la lista de dead tuples no cupo en memoria y los índices se recorrieron varias veces; aumente maintenance_work_mem/autovacuum_work_mem (antes de PG17 se usa como máximo 1GB para esto). wait = Timeout:VacuumDelay es el throttling basado en costos (autovacuum_vacuum_cost_delay/cost_limit). No termine un autovacuum cuyo texto de consulta diga 'to prevent wraparound'; se reinicia de inmediato. VACUUM FULL y CLUSTER aparecen en pg_stat_progress_cluster, no en esta vista.

Abrir en DBAtlas →

Relacionado