postgres-autovacuum

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;

常见根因

  1. 长事务、idle in transaction 或未使用的复制槽阻止回收。
  2. autovacuum 阈值/成本参数过保守。
  3. 高频 update/delete,死元组产生速度超过清理速度。
  4. 表缺少索引,vacuum 扫描成本高。
  5. 事务 ID 接近回卷,触发强制 vacuum。

修复

相关命令