Transaction ID Wraparound
O PostgreSQL reutiliza IDs de transação de 32 bits. O Vacuum deve congelar linhas antigas antes que o cluster se aproxime do desligamento por wraparound no PostgreSQL 18.4.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
SELECT datname, age(datfrozenxid) AS frozen_age, datfrozenxid
FROM pg_database
ORDER BY age(datfrozenxid) DESC;Quando usar: Logs mencionam wraparound, autovacuum é executado com autovacuum (to prevent wraparound), ou age(datfrozenxid) excede centenas de milhões.
Exemplo de Trabalho
CREATE TABLE ledger (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
amount numeric(12,2) NOT NULL,
updated_at timestamptz NOT NULL DEFAULT now()
);
INSERT INTO ledger (amount)
SELECT (random() * 100)::numeric(12,2) FROM generate_series(1, 100000);
-- O churn cria tuplas que precisam ser congeladas
UPDATE ledger SET amount = amount + 1;
SELECT
c.relname,
age(c.relfrozenxid) AS table_frozen_age,
s.n_dead_tup,
s.last_autovacuum
FROM pg_class c
JOIN pg_stat_user_tables s ON s.relid = c.oid
WHERE c.relname = 'ledger';
SELECT datname, age(datfrozenxid) AS db_frozen_age
FROM pg_database
WHERE datname = current_database();O que isso demonstra:
age(relfrozenxid)por tabela- Idade
datfrozenxidem nível de banco de dados - Ligação entre churn, vacuum e congelamento
Mergulho Profundo
Como Funciona
- Cada linha tem IDs de transação xmin/xmax para visibilidade.
- O Vacuum marca transações confirmadas antigas como congeladas para que os IDs possam ser reutilizados com segurança.
autovacuum_freeze_max_age(padrão 200M) força o vacuum agressivo.- O modo de emergência para conexões se o horizonte de wraparound for violado (raro com autovacuum saudável).
Limiares de Monitoramento
| Métrica | Nível de Ação |
|---|---|
age(datfrozenxid) > 400M | Investigar atraso do vacuum |
age(datfrozenxid) > 600M | Ajuste urgente |
age(datfrozenxid) > 800M | Resposta a incidentes |
Notas SQL
SELECT relname, last_autovacuum, last_vacuum
FROM pg_stat_user_tables
ORDER BY age(relid) DESC NULLS LAST
LIMIT 15;
VACUUM FREEZE VERBOSE ledger;Armadilhas
- Transações abertas longas - Bloqueiam o congelamento; a idade aumenta. Correção:
idle_in_transaction_session_timeout, monitorarpg_stat_activity.xact_start. - Slots de replicação sem consumo - Impedem a limpeza do vacuum no primário. Correção: Remover slots obsoletos; monitorar
pg_replication_slots. - Autovacuum desabilitado - Caminho rápido para risco de desligamento. Correção: Reabilitar imediatamente;
VACUUM FREEZEmanual. - Apenas monitorar a idade do banco de dados, não a idade da tabela - Uma tabela ruim pode arrastar o horizonte. Correção: Dashboards
age(relfrozenxid)por tabela. - Adiar o vacuum em arquivos somente para anexar - Mesmo tabelas somente para anexar precisam de congelamento ocasional. Correção: Vacuum leve agendado.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Menor autovacuum_freeze_max_age por tabela | Arquivo estático enorme | OLTP padrão |
| Desanexar/remover partição | Dados antigos descartáveis | Retenção legal necessária |
| Cluster de arquivo somente leitura | Dividir dados frios | Simplicidade de DB único |
FAQs
O que é autovacuum freeze max age?
Força o vacuum a congelar páginas quando a idade do relfrozenxid da tabela excede a configuração.
vacuum freeze vs normal?
O vacuum de congelamento prioriza o avanço do xmin; pode ser executado com a flag de urgência.
wraparound de multixact?
Horizonte separado; monitorar a idade de pg_database.datminmxid de forma semelhante.
slots de replicação lógica?
Podem reter xmin; impedir o vacuum se o consumidor estiver atrasado.
monitoramento de standby?
Observar as idades do primário; os standbys não avançam o frozenxid localmente para dados do usuário.
vacuum_defer_cleanup_age?
Configuração de replicação que atrasa a limpeza; diminuir em streaming moderno, a menos que necessário.
log de desligamento iminente?
Vacuum de emergência ou VACUUM FREEZE manual em todas as tabelas; matar bloqueadores.
job de congelamento pg_cron?
Rede de segurança para tabelas estáticas com gatilhos de autovacuum raros.
visões de monitoramento 18.4?
Combinar pg_stat_user_tables com alertas personalizados em limites de idade.
Próximo?
Bloat de tabela e índice quando o vacuum atrasa, mas antes da emergência de wraparound.
Relacionados
- Ajuste de Autovacuum - Prevenir atraso
- Noções Básicas de Vacuum - Papel do congelamento
- Noções Básicas de Monitoramento - Alertas
- Melhores Práticas de Vacuum - Nunca desabilitar autovacuum
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.