

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Comprensione del comportamento della funzionalità di autovacuum con database non validi
<a name="appendix.postgresql.commondbatasks.autovacuumbehavior"></a>

 Viene introdotto un nuovo valore `-2` nella colonna `datconnlimit` del catalogo `pg_database` per indicare come non validi i database che sono stati interrotti durante l’operazione DROP DATABASE. 

 Questo nuovo valore è disponibile nelle seguenti versioni di RDS per PostgreSQL: 
+ 15.4 e tutte le versioni successive
+ 14.9 e versioni successive
+ 13.12 e versioni successive
+ 12.16 e versioni successive
+ 11.21 e versioni successive

I database non validi non influiscono sulla capacità della funzionalità di autovacuum di bloccare le funzionalità dei database validi. La funzionalità autovacuum ignora i database non validi. Di conseguenza, le normali operazioni di vacuum continueranno a funzionare correttamente ed efficacemente per tutti i database validi nell’ambiente PostgreSQL.

**Topics**
+ [Monitoraggio dell’ID di transazione](#appendix.postgresql.commondbatasks.autovacuum.monitorxid)
+ [Modifica della query di monitoraggio](#appendix.postgresql.commondbatasks.autovacuum.monitoradjust)
+ [Risoluzione dei problemi relativi a database non validi](#appendix.postgresql.commondbatasks.autovacuum.connissue)

## Monitoraggio dell’ID di transazione
<a name="appendix.postgresql.commondbatasks.autovacuum.monitorxid"></a>

 La funzione `age(datfrozenxid)` viene comunemente utilizzata per monitorare l’età degli ID di transazione (XID) dei database per evitare che si verifichi il wraparound degli ID. 

 Poiché i database non validi vengono esclusi dall’autovacuum, il relativo contatore dell’ID di transazione (XID) può raggiungere il valore massimo di `2 billion`, eseguire il wraparound a `- 2 billion` e continuare questo ciclo all’infinito. Una tipica query per monitorare il wraparound degli ID di transazione potrebbe essere simile a: 

```
SELECT max(age(datfrozenxid)) FROM pg_database;
```

Tuttavia, con l’introduzione del valore -2 per `datconnlimit`, i database non validi possono alterare i risultati di questa query. Poiché questi database non sono validi e non devono essere sottoposti a regolari controlli di manutenzione, possono causare falsi positivi, inducendo a credere che il valore `age(datfrozenxid)` sia superiore a quello reale.

## Modifica della query di monitoraggio
<a name="appendix.postgresql.commondbatasks.autovacuum.monitoradjust"></a>

 Per garantire l’accuratezza del monitoraggio, è necessario modificare la query di monitoraggio per escludere i database non validi. Segui questa query consigliata: 

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

Questa query garantisce che nel calcolo di `age(datfrozenxid)` vengano presi in considerazione solo i database validi, fornendo un riflesso fedele dell’età degli ID di transazione nell’ambiente PostgreSQL.

## Risoluzione dei problemi relativi a database non validi
<a name="appendix.postgresql.commondbatasks.autovacuum.connissue"></a>

 Quando tenti di connetterti a un database non valido, potrebbe essere visualizzato un messaggio di errore simile al seguente: 

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

 Inoltre, se il parametro `log_min_messages` è impostato su `DEBUG2` o successivo, è possibile che vengano visualizzate le seguenti voci di log che indicano che il processo autovacuum sta ignorando il database non valido: 

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

Per risolvere il problema, segui il valore `HINT` fornito durante il tentativo di connessione. Connettiti a qualsiasi database valido utilizzando l’account master RDS o un account di database con il ruolo `rds_superuser` ed elimina i database non validi.

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