Çalışan autovacuum/VACUUM işlemlerinin ilerlemesini izle
PostgreSQLBakımKomut
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;
-- Meşgul autovacuum worker sayısı / üst sınır
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;Ne yapar?
Çalışan her VACUUM'un (autovacuum worker veya manuel) tablosunu, fazını, taranan/temizlenen heap yüzdesini, index vacuum tur sayısını ve bekleme olayını; ayrıca meşgul autovacuum worker sayısını gösterir.
Ne zaman kullanılır?
Büyük tablodaki VACUUM'un ne zaman biteceğini kestirmek, tüm autovacuum worker'larının dolu olup olmadığını (kuyrukta bekleyen tablolar) ve vacuum'un throttling nedeniyle beklediğini görmek için.
Dikkat
index_vacuum_count > 1 ise dead tuple listesi belleğe sığmamış ve index'ler birden çok kez taranmıştır; maintenance_work_mem/autovacuum_work_mem'i artır (PG17 öncesi bu amaçla en fazla 1GB kullanılır). wait = Timeout:VacuumDelay, cost-based throttling'dir (autovacuum_vacuum_cost_delay/cost_limit). Sorgu metninde 'to prevent wraparound' görünen autovacuum'u sonlandırma; hemen yeniden başlar. VACUUM FULL ve CLUSTER bu view'da değil pg_stat_progress_cluster'da görünür.