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
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 Aurora 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.
Argomenti
Monitoraggio dell’ID di transazione
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
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
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