Comportamiento de autovacuum con bases de datos no válidas
Se introduce un nuevo valor -2
en la columna datconnlimit
del catálogo pg_database
para indicar que las bases de datos interrumpidas en mitad de la operación DROP DATABASE no son válidas.
Este nuevo valor está disponible en las siguientes versiones de RDS para PostgreSQL:
Versión 15.4 y todas las versiones posteriores
Versión 14.9 y posteriores
Versión 13.12 y posteriores
Versión 12.16 y posteriores
Versión 11.21 y posteriores
Las bases de datos no válidas no afectan a la capacidad de autovacuum de bloquear la funcionalidad de las bases de datos válidas. Autovacuum ignora las bases de datos no válidas. Por lo tanto, las operaciones vacuum habituales seguirán funcionando de forma adecuada y eficiente en todas las bases de datos válidas de su entorno de PostgreSQL.
Temas
Supervisión del ID de transacción
La función age(datfrozenxid)
se suele utilizar para supervisar la antigüedad del ID de transacción (XID) de las bases de datos a fin de evitar que este se reinicie.
Como las bases de datos no válidas se excluyen del autovacuum, su contador de ID de transacción (XID) puede alcanzar el valor máximo de 2 billion
, reiniciarse en - 2 billion
y continuar este ciclo indefinidamente. Una consulta típica para supervisar el reinicio del ID de transacción podría ser así:
SELECT max(age(datfrozenxid)) FROM pg_database;
Sin embargo, al introducir el valor -2 para datconnlimit
, las bases de datos no válidas pueden sesgar los resultados de esta consulta. Como estas bases de datos no son válidas y no deberían formar parte de las comprobaciones de mantenimiento periódicas, pueden provocar falsos positivos y dar la impresión de que age(datfrozenxid)
es mayor de lo que realmente es.
Ajustes en la consulta de supervisión
Para garantizar una supervisión precisa, debe ajustar la consulta de supervisión a fin de excluir las bases de datos no válidas. Siga esta consulta recomendada:
SELECT max(age(datfrozenxid)) FROM pg_database WHERE datconnlimit <> -2;
Esta consulta garantiza que solo se tengan en cuenta las bases de datos válidas en el cálculo de age(datfrozenxid)
, lo que aporta información fiable sobre la antigüedad del ID de transacción en todo el entorno de PostgreSQL.
Resolución de problemas relacionados con bases de datos no válidas
Al intentar conectarse a una base de datos no válida, es posible que vea un mensaje de error similar al siguiente:
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
Además, si el parámetro log_min_messages
tiene un valor igual o superior a DEBUG2
, es posible que vea que las siguientes entradas de registro muestran que el proceso de autovacuum omite la base de datos no válida:
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 el problema, siga la HINT
proporcionada durante el intento de conexión. Conéctese a cualquier base de datos válida mediante su cuenta maestra de RDS o una cuenta de base de datos con el rol rds_superuser
y elimine las bases de datos no válidas.
SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec