실행 중인 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 또는 수동)에 대해 테이블, 단계, 스캔/vacuum된 heap 비율, index vacuum 횟수, 대기 이벤트와 바쁜 autovacuum worker 수를 보여 준다.
사용 시점
대형 테이블의 VACUUM이 언제 끝날지, 모든 autovacuum worker가 바쁜지(대기열의 테이블), throttling 때문에 vacuum이 대기 중인지 판단하기 위해.
주의
index_vacuum_count > 1은 dead tuple 목록이 메모리에 들어가지 않아 인덱스를 여러 번 스캔했다는 뜻이다. maintenance_work_mem/autovacuum_work_mem을 늘린다(PG17 이전에는 이 용도로 최대 1GB만 사용). wait = Timeout:VacuumDelay는 비용 기반 throttling(autovacuum_vacuum_cost_delay/cost_limit)이다. 쿼리 텍스트에 'to prevent wraparound'가 있는 autovacuum은 종료하지 않는다. 즉시 다시 시작된다. VACUUM FULL과 CLUSTER는 이 뷰가 아닌 pg_stat_progress_cluster에 나타난다.