Noções básicas sobre o comportamento do autovacuum com bancos de dados inválidos
Um novo valor -2
é introduzido na coluna datconnlimit
do catálogo pg_database
para indicar bancos de dados que foram interrompidos no meio da operação DROP DATABASE como inválidos.
Esse novo valor está disponível nas seguintes versões do RDS para PostgreSQL:
15.4 e todas as versões posteriores
14.9 e versões posteriores
13.12 e versões posteriores
12.16 e versões posteriores
11.21 e versões posteriores
Bancos de dados inválidos não afetam a capacidade do autovacuum de congelar a funcionalidade de bancos de dados válidos. O Autovacuum ignora bancos de dados inválidos. Consequentemente, as operações regulares de limpeza continuarão funcionando de forma adequada e eficiente em todos os bancos de dados válidos no ambiente do PostgreSQL.
Tópicos
ID da transação de monitoramento
A função age(datfrozenxid)
geralmente é usada para monitorar a idade do ID de transação (XID) dos bancos de dados para evitar o encapsulamento de IDs de transação.
Como bancos de dados inválidos são excluídos do autovacuum, seu contador de ID de transação (XID) pode atingir o valor máximo de 2 billion
, ser encapsulado em - 2 billion
e continuar esse ciclo indefinidamente. Uma consulta típica para monitorar o encapsulamento de IDs de transação pode ser:
SELECT max(age(datfrozenxid)) FROM pg_database;
No entanto, com a introdução do valor -2 para datconnlimit
, bancos de dados inválidos podem distorcer os resultados dessa consulta. Como esses bancos de dados não são válidos e não devem fazer parte das verificações de manutenção regulares, eles podem causar falsos positivos, levando você a acreditar que o age(datfrozenxid)
é maior do que realmente é.
Ajustar a consulta de monitoramento
Para garantir um monitoramento preciso, você deve ajustar sua consulta de monitoramento para excluir bancos de dados inválidos. Siga esta consulta recomendada:
SELECT max(age(datfrozenxid)) FROM pg_database WHERE datconnlimit <> -2;
Essa consulta garante que somente bancos de dados válidos sejam considerados no cálculo age(datfrozenxid)
, fornecendo um reflexo real da idade do ID da transação no ambiente do PostgreSQL.
Resolver o problema de banco de dados inválido
Ao tentar se conectar a um banco de dados inválido, talvez seja exibida uma mensagem de erro semelhante à seguinte:
postgres=> \c db1 connection to server at "mydb.xxxxxxxxxx.us-west-2.rds.amazonaws.com" (xx.xx.xx.xxx), port xxxx failed: FATAL: cannot connect to invalid database "db1" HINT: Use DROP DATABASE to drop invalid databases. Previous connection kept
Além disso, se o parâmetro log_min_messages
estiver definido como DEBUG2
ou posterior, você poderá observar as seguintes entradas de log indicando que o processo de autovacuum está ignorando o banco de dados inválido:
2024-07-30 05:59:00 UTC::@:[32000]:DEBUG: autovacuum: skipping invalid database "db6" 2024-07-30 05:59:00 UTC::@:[32000]:DEBUG: autovacuum: skipping invalid database "db1"
Para resolver o problema, siga a HINT
fornecida durante a tentativa de conexão. Conecte-se a qualquer banco de dados válido usando sua conta principal do RDS ou uma conta de banco de dados com o perfil rds_superuser
e elimine bancos de dados inválidos.
SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec