PostgreSQL autovacuum 跟不上导致膨胀的定位
表/索引持续膨胀,查询变慢,pg_stat_user_tables 的 n_dead_tup 很高,autovacuum 长时间运行或频繁被取消。极端情况下接近事务 ID 回卷。
SELECT relname, n_live_tup, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables ORDER BY n_dead_tup DESC LIMIT 10;
SELECT pid, state, query, wait_event
FROM pg_stat_activity WHERE query ILIKE '%vacuum%';
SELECT * FROM pg_stat_progress_vacuum;
SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY 2 DESC;
idle in transaction 或未使用的复制槽阻止回收。autovacuum_vacuum_scale_factor、autovacuum_vacuum_cost_limit 等参数。VACUUM (VERBOSE, ANALYZE);避免高峰期 VACUUM FULL。pg_repack 在线重建。n_dead_tup、last_autovacuum 和 age(datfrozenxid)。vacuumdb — 清理与分析psql — 进度与统计pg_stat_statements — 高写入 SQL