Melhores Práticas de Vacuum
Um vacuum saudável é invisível até falhar. Siga esta lista de verificação para se manter à frente do bloat, wraparound e regressões de index-only scan no PostgreSQL 18.4.
Como Usar Esta Lista
- Revise as 20 principais tabelas por taxa de atualização mensalmente.
- Alerte sobre
age(datfrozenxid)e altas proporções den_dead_tup. - Nunca envie migrações que desabilitem o autovacuum sem um plano de expiração.
A - Política de Autovacuum
- Mantenha o autovacuum habilitado globalmente e por tabela. Sem desabilitação silenciosa em produção.
- Reduza
autovacuum_vacuum_scale_factorem tabelas grandes e quentes. O padrão de 20% é muito lento em escala. - Aumente os workers/headroom de IOPS antes de aumentar
autovacuum_max_workers. Evite conflitos entre vacuum e OLTP. - Registre execuções de autovacuum acima do limite de duração. Encontre as lentas.
- Execute
VACUUM ANALYZEmanualmente após exclusão em massa ou COPY. Antes de reabrir BI.
B - Higiene de Transação
- Defina
idle_in_transaction_session_timeoutem roles de aplicação. Transações longas bloqueiam o freeze. - Monitore slots de replicação e lag de decodificação lógica. Slots mantêm o xmin no primário.
- Mate sessões órfãs de pool de aplicação presas em transação. PgBouncer não pode corrigir idle no lado do servidor.
- Evite transações abertas o dia todo em ferramentas de administração. Incluindo abas SQL do dashboard.
- Acompanhe
pg_stat_activity.xact_startem incidentes. Correlacione com o lag do vacuum.
C - Resposta ao Bloat
- Meça a proporção de dead tuples e o tamanho do TOAST antes de
VACUUM FULL. Prefira vacuum in-place primeiro. - Use
pg_repackou troca de partição para reduzir o tamanho no nível do SO. Quando linhas ativas << tamanho do arquivo. - Execute
REINDEX CONCURRENTLYquando o bloat do índice for comprovado. Após o ajuste do vacuum. - Considere
fillfactorem tabelas com atualizações extremas. Planeje atualizações HOT. - Projete colunas em APIs; evite
SELECT *em tabelas com TOAST extenso. Reduza I/O na origem.
D - Monitoramento
- Dashboard
age(datfrozenxid)e os principaisage(relfrozenxid). Alerta precoce de wraparound. - Alerta quando uma tabela quente não tem autovacuum em 24h apesar da atividade. Sinal de starvation de worker.
- Inclua métricas de vacuum em revisões pós-incidente. Não apenas ajuste de consultas.
- Documente overrides de autovacuum por tabela em uma planilha de catálogo. Clareza para plantão.
- Teste o comportamento do vacuum após atualizações de versão principal. Mudanças no planner e vacuum são lançadas juntas.
FAQs
Desabilitar autovacuum em teste de carga?
Apenas em clone isolado; nunca na frota de produção.Agendamento de `VACUUM FULL`?
Último recurso; prefira pg_repack.Ajuste de `freeze_max_age`?
Reduza em arquivos estáticos se necessário; o padrão para OLTP geralmente é bom.Ordem de `vacuum` vs `analyze`?
Executar `VACUUM ANALYZE` juntos após operações em massa está bom.Bloat em standby?
O vacuum do primário avança os horizontes; réplicas não fazem vacuum em tabelas de usuário.Tabelas TOAST?
Monitore o tamanho de `reltoastrelid` junto com o heap.Autovacuum na nuvem?
Ajuste por tabela mesmo em produção.Vacuum particionado?
Cada partição faz vacuum independentemente; ajuste as configurações do pai.Role para `manual vacuum`?
Superusuário ou role `pg_maintain` com privilégios de vacuum.Próximo grupo?
Connection pooling para isolamento de workload de lotes com uso intensivo de vacuum.Relacionados
- Noções Básicas de Vacuum - Mecanismos
- Ajuste de Autovacuum - Parâmetros
- Transaction ID Wraparound - Alertas de Freeze
- Bloat de Tabela e Índice - Remediação
Versões do Stack: Esta página foi escrita para PostgreSQL 18.4 (stable 18, maintenance 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, e PostGIS 3.5+.