Temos uma mesa onde armazenamos eventos. Esta é uma tabela somente de acréscimo com 4 bilhões de linhas/eventos nela. Nós nunca excluímos nem atualizamos as linhas nesta tabela, portanto, nunca temos dead_rows
nela.
O wraparound de ID de transação AFAIK é impedido por execuções frequentes de AUTOVACUUM .
No entanto, no meu entendimento, o AUTOVACUUM nunca é executado em tabelas somente gravação porque elas não têm linhas mortas, portanto, nunca excedem o autovacuum_threshold
.
Como o wraparound de ID de transação seria evitado nesse caso?
Por
autovacuum_multixact_freeze_max_age
, cujo padrão é 200 milhões.Uma vez que uma tabela tenha uma linha ativa descongelada que seja mais
autovacuum_multixact_freeze_max_age
antiga do que as transações, o autovacuum iniciará um trabalhador que executa um vácuo anti-wraparound na tabela e congela as linhas mais antigas que asvacuum_freeze_min_age
transações.Observe que a partir do PostgreSQL v13, o autovacuum não é apenas acionado por tuplas mortas, mas também pelo número de linhas inseridas (com base em
autovacuum_vacuum_insert_threshold
eautovacuum_vacuum_insert_scale_factor
). Isso permite congelar as linhas mais cedo e reduz o impacto de um vácuo anti-envoltório. Veja minha postagem no blog para obter detalhes.