Determinar se as tabelas no seu banco de dados precisam de vacuum
Você pode usar a consulta a seguir para mostrar o número de transações vacuum em um banco de dados. A coluna datfrozenxid
de uma linha pg_database
do banco de dados é um limite inferior nos IDs de transação normais que aparecem nesse banco de dados. Essa coluna é o mínimo dos valores de relfrozenxid
por tabela no banco de dados.
SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY age(datfrozenxid) desc limit 20;
Por exemplo, os resultados da execução da consulta anterior podem ser os seguintes.
datname | age mydb | 1771757888 template0 | 1721757888 template1 | 1721757888 rdsadmin | 1694008527 postgres | 1693881061 (5 rows)
Quando a idade de um banco de dados atingir 2 bilhões de IDs de transação, ocorrerá a conclusão de IDs de transação (XID), e o banco de dados se tornará somente leitura. Use essa consulta para produzir uma métrica e execute-a algumas vezes por dia. Por padrão, o autovacuum é definido para manter a idade das transações como um máximo de 200,000,000 (autovacuum_freeze_max_age
Uma estratégia de monitoramento de exemplo pode ser assim:
-
Defina o valor
autovacuum_freeze_max_age
como 200 milhões de transações. -
Se uma tabela atingir 500 milhões de transações sem vacuum, um alarme de baixa gravidade será disparado. Este não é um valor não razoável, mas pode indicar que o autovacuum não está dando conta.
-
Se uma tabela chegar a 1 bilhão, ela deverá ser tratada como um alarme que requer medidas. Em geral, convém manter as idades mais próximas de
autovacuum_freeze_max_age
por motivos de performance. Recomendamos que você investigue usando as recomendações a seguir. -
Se uma tabela atingir 1,5 bilhões de transações sem vacuum, um alarme de alta gravidade será disparado. Dependendo da rapidez com que seu banco de dados usa IDs de transação, esse alarme pode indicar que o sistema está ficando sem tempo para executar o autovacuum. Nesse caso, recomendamos que você resolva isso imediatamente.
Se uma tabela estiver ultrapassando constantemente esses limiares, modifique ainda mais seus parâmetros de autovacuum. Por padrão, usar VACUUM manualmente (que tem atrasos baseados em custos desabilitados) é mais agressivo do que usar o autovacuum padrão, mas também é mais intrusivo para o sistema como um todo.
Recomendamos o seguinte:
-
Esteja ciente e ative um mecanismo de monitoramento para que você tenha conhecimento da idade das transações mais antigas.
Para obter informações sobre como criar um processo que avisa sobre a conclusão de IDs de transação, consulte a publicação do blog de banco de dados da AWS Implement an early warning system for transaction ID wraparound no Amazon RDS for PostgreSQL
(Implementar um sistema de alerta antecipado para conclusão de IDs de transação no Amazon RDS for PostgreSQL). -
Para tabelas mais ocupadas, execute um congelamento de vacuum manual regularmente durante uma janela de manutenção além de depender do autovacuum. Para obter informações sobre a realização de um congelamento manual de vacuum, consulte Realização de um congelamento manual de vacuum.