Comprendre le comportement de l’autovacuum avec les bases de données non valides - Amazon Relational Database Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Comprendre le comportement de l’autovacuum avec les bases de données non valides

Une nouvelle valeur -2 est introduite dans la colonne datconnlimit du catalogue pg_database pour indiquer que les bases de données qui ont été interrompues au milieu de l’opération DROP DATABASE ne sont pas valides.

Cette nouvelle valeur est disponible dans les versions suivantes de RDS pour PostgreSQL :

  • 15.4 et toutes les versions ultérieures

  • 14.9 et versions ultérieures

  • 13.12 et versions ultérieures

  • 12.16 et versions ultérieures

  • 11.21 et versions ultérieures

Les bases de données non valides n’affectent pas la capacité de la fonction d’autovacuum à geler la fonctionnalité des bases de données valides. Autovacuum ignore les bases de données non valides. Par conséquent, les opérations de vacuum régulières continueront à fonctionner correctement et efficacement pour toutes les bases de données valides de votre environnement PostgreSQL.

Surveillance de l’ID de transaction

Cette fonction age(datfrozenxid) est couramment utilisée pour surveiller l’âge des ID de transaction (XID) des bases de données afin d’empêcher le bouclage de l’ID de transaction.

Les bases de données non valides étant exclues de l’autovacuum, leur compteur d’ID de transaction (XID) peut atteindre la valeur maximale de 2 billion, revenir à - 2 billion et poursuivre ce cycle indéfiniment. Une requête typique pour surveiller le bouclage de l’ID de transaction peut ressembler à ceci :

SELECT max(age(datfrozenxid)) FROM pg_database;

Cependant, avec l’introduction de la valeur -2 pour datconnlimit, les bases de données non valides peuvent fausser les résultats de cette requête. Étant donné que ces bases de données ne sont pas valides et ne doivent pas faire l’objet de contrôles de maintenance réguliers, elles peuvent générer des faux positifs, ce qui vous laisse penser que age(datfrozenxid) est supérieur à ce qu’il est réellement.

Ajustement de la requête de surveillance

Pour garantir une surveillance précise, vous devez ajuster votre requête de surveillance afin d’exclure les bases de données non valides. Suivez cette requête recommandée :

SELECT max(age(datfrozenxid)) FROM pg_database WHERE datconnlimit <> -2;

Cette requête garantit que seules les bases de données valides sont prises en compte dans le calcul age(datfrozenxid), ce qui reflète fidèlement l’âge des ID de transaction dans l’environnement PostgreSQL.

Résolution du problème de base de données non valide

Lorsque vous essayez de vous connecter à une base de données non valide, vous pouvez rencontrer un message d’erreur similaire à ce qui suit :

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

En outre, si le paramètre log_min_messages est défini sur DEBUG2 ou supérieur, vous remarquerez peut-être que les entrées de journal suivantes indiquent que le processus autovacuum ignore la base de données non valide :

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"

Pour résoudre le problème, suivez le HINT fourni lors de la tentative de connexion. Connectez-vous à n’importe quelle base de données valide à l’aide de votre compte principal RDS ou d’un compte de base de données doté du rôle rds_superuser, puis supprimez les bases de données non valides.

SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec