Come posso risolvere i problemi relativi all'estensione PostGIS quando aggiorno la mia istanza RDS per PostgreSQL?

Ultimo aggiornamento: 03/06/2022

L'aggiornamento della versione principale per la mia istanza del Servizio di database relazionale Amazon (Amazon RDS) per PostgreSQL non è riuscito a causa di problemi con l'estensione PostGIS.

Breve descrizione

L'aggiornamento della versione principale per l'istanza di RDS per PostgreSQL potrebbe non riuscire per diversi motivi. Il motivo più comune potrebbe essere che non hai aggiornato l'estensione PostGIS o le estensioni dipendenti, come address_standardizer, address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology e postgis_raster, alla versione corrente supportata prima di eseguire l'aggiornamento della versione principale.

Per verificare se l'aggiornamento della versione principale dell'istanza di RDS PostgreSQL non è riuscito a causa di PostGIS o di estensioni dipendenti, effettua le seguenti operazioni:

1.    Controlla gli eventi per l'istanza. È possibile che si verifichi un evento simile al seguente:

Database instance is in a state that cannot be upgraded: PreUpgrade checks failed: The instance could not be upgraded because one or more databases have settings or usages that are not compatible with the target engine version. Please check the precheck log file for more details

2.    Controlla i file di registro di precontrollo per l'istanza database creata durante il processo di aggiornamento. Durante l'aggiornamento della versione principale, RDS per PostgreSQL esegue alcune procedure di precontrollo sull'istanza per identificare i problemi che potrebbero causare il fallimento del processo di aggiornamento. Puoi trovare informazioni sugli eventuali problemi riscontrati durante il precontrollo nel file pg_upgrade_precheck.log. Amazon RDS aggiunge un timestamp al nome del file.

Se il file di registro di precontrollo include un messaggio simile al seguente, il processo di aggiornamento non è riuscito a causa di PostGIS o estensioni dipendenti.

------------------------------------------------------------------
Upgrade could not be run on Sun May 22 14:20:45 2022
------------------------------------------------------------------
The instance could not be upgraded from 9.6.22.R1 to 12.7.R1 because of following reasons.
Please take appropriate action on databases that have usages incompatible with requested major engine version upgrade and try again.
- Following usages in database 'test_db' need to be corrected before upgrade:
-- The instance could not be upgraded because the PostGIS extension and its dependent extensions (address_standardizer,
address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology, postgis_raster) installation in one or more databases is
not compatible with your desired upgrade path. Please upgrade postgis and its dependent extensions to version supported in requested version.
----------------------- END OF LOG  ----------------------

Per verificare la versione installata di PostGIS e le estensioni dipendenti, esegui i seguenti comandi:

postgres=> select * FROM pg_available_extensions where name like '%postgis%';
postgres=> select * FROM pg_available_extensions where name like '%address_standardizer%';
postgres=> select probin from pg_proc where proname = 'postgis_raster_lib_version';

Il valore nella colonna installed_version mostra la versione attualmente installata dell'estensione. Se questa colonna non ha alcun valore, significa che l'estensione non è installata.

Risoluzione

Per risolvere il problema dell'aggiornamento nell'istanza di RDS per PostgreSQL, utilizza uno dei seguenti metodi in base al tuo caso d'uso.

Rimuovi l'estensione PostGIS

Se non hai bisogno del PostGIS o delle estensioni dipendenti nell'istanza, elimina le estensioni e ricreale dopo che l'aggiornamento è andato a buon fine.

Nota: l'eliminazione delle estensioni rimuove anche le colonne dipendenti.

1.    Per eliminare le estensioni, esegui il seguente comando:

postgres=> DROP EXTENSION example_extension CASCADE;

2.    Dopo aver eliminato le estensioni in tutti i database in cui sono installate, aggiorna la tua istanza RDS per PostgreSQL.

3.    Dopo avere aggiornato l'istanza, crea l'estensione, se necessario, eseguendo il seguente comando:

postgres=> CREATE EXTENSION extension_name;

Aggiorna l'estensione PostGIS

Esegui le seguenti operazioni:

  • Esegui l'aggiornamento in più passaggi.
  • Aggiorna la versione dell'estensione in ogni passaggio prima di aggiornare l'istanza RDS per PostgreSQL.

Verifica il successivo percorso di aggiornamento supportato più recente per l'estensione installata nell'istanza di RDS per PostgreSQL. Esegui il comando:

postgres=> SELECT * FROM pg_extension_update_paths('extension_name') WHERE source='current_version' AND target NOT LIKE '%next%' AND source<target AND path LIKE '%--%';

Assicurati di sostituire quanto segue:

  • extension_name con il nome dell'estensione installata
  • current_version con la versione dell'estensione attualmente installata

Se il comando non restituisce un percorso di aggiornamento ma i valori installed_version e default_version delle estensioni sono gli stessi, significa che l'estensione è già aggiornata. In questo caso, è possibile eseguire l'aggiornamento della versione del motore.

Ad esempio:

postgres=> SELECT * FROM pg_extension_update_paths('postgis') WHERE source='2.3.7' AND target NOT LIKE '%next%' AND source<target AND path LIKE '%--%';

Output di esempio:

source | target |     path
------+--------+--------------
2.3.7  | 2.5.2  | 2.3.7--2.5.2 (1 row)

Se i valori installed_version e default_version sono diversi, aggiorna il PostGIS installato e le estensioni dipendenti alla versione di destinazione più recente supportata.

Per aggiornare l'estensione, esegui il seguente comando:

postgres=> ALTER EXTENSION PostgreSQL-extension UPDATE TO 'new-version';

Nota: assicurati di aggiornare l'estensione PostGIS insieme alle estensioni dipendenti nell'istanza. Queste estensioni sono installate a livello di database. Pertanto, assicurati di aggiornare le estensioni in tutti i database in cui sono state installate.

Per aggiornare l'estensione PostGIS e postgis_raster quando utilizzi PostGIS versione 2.5.0 o successive, esegui il seguente comando:

postgres=> SELECT postgis_extensions_upgrade();

In PostGIS versione 3.0 e successive, la funzionalità raster è suddivisa come estensione separata. Se non utilizzi raster, esegui il seguente comando dopo avere aggiornato l'estensione:

postgres=> DROP EXTENSION postgis_raster;

Dopo avere aggiornato le estensioni, puoi aggiornare l'istanza di RDS per PostgreSQL alla versione del motore in cui queste versioni di estensione sono supportate.

Dopo avere aggiornato l'istanza, puoi ripetere i passaggi di aggiornamento della versione dell'estensione seguiti dall'aggiornamento della versione del motore dell'istanza RDS fino a quando non installi la versione del motore di destinazione.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?