

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
<a name="appendix.postgresql.commondbatasks.autovacuumbehavior"></a>

 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 : 
+ Version 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.

**Topics**
+ [Surveillance de l’ID de transaction](#appendix.postgresql.commondbatasks.autovacuum.monitorxid)
+ [Ajustement de la requête de surveillance](#appendix.postgresql.commondbatasks.autovacuum.monitoradjust)
+ [Résolution du problème de base de données non valide](#appendix.postgresql.commondbatasks.autovacuum.connissue)

## Surveillance de l’ID de transaction
<a name="appendix.postgresql.commondbatasks.autovacuum.monitorxid"></a>

 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
<a name="appendix.postgresql.commondbatasks.autovacuum.monitoradjust"></a>

 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
<a name="appendix.postgresql.commondbatasks.autovacuum.connissue"></a>

 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
```