Comment résoudre les problèmes liés à l'extension PostGIS lors de la mise à niveau d’une instance Amazon RDS for PostgreSQL ?

Lecture de 6 minute(s)
0

La mise à niveau vers une version majeure de mon instance Amazon Relational Database Service (Amazon RDS) for PostgreSQL a échoué en raison de problèmes liés à l'extension PostGIS.

Brève description

La mise à niveau vers une version majeure de votre instance Amazon RDS for PostgreSQL peut échouer pour plusieurs raisons. La raison la plus courante est l’obsolescence d’une extension PostGIS ou de ses extensions dépendantes. Avant d'effectuer la mise à niveau vers une version majeure, vous devez mettre à jour PostGIS et ses extensions dépendantes. Les extensions dépendantes incluent address_standardizer, address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology ou postgis_raster.

Commencez par déterminer si la mise à niveau vers une version majeure de votre instance RDS for PostgreSQL a échoué à cause des extensions. Si le problème provient des extensions, mettez à niveau PostGIS et ses extensions dépendantes.

Résolution

Vérifiez si votre instance nécessite une mise à niveau des extensions

Pour déterminer si la mise à niveau vers une version majeure de votre instance RDS for PostgreSQL a échoué à cause des extensions, effectuez les tâches suivantes.

Affichez les événements de l'instance. Il est possible que vous observiez un événement de cet type :

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

Consultez les fichiers journaux de vérification préalable de l'instance. Dans le cadre d’une mise à niveau vers une version majeure, RDS for PostgreSQL exécute des procédures de vérification préalable au niveau de l'instance. Les problèmes survenus lors de la vérification préalable peuvent être consultés dans le fichier pg_upgrade_precheck.log.

Si le fichier journal de vérification préalable inclut un message similaire à l'exemple suivant, cela signifie que le processus de mise à niveau a échoué à cause de PostGIS ou des extensions dépendantes :

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

Pour connaître la version installée de PostGIS et de ses extensions dépendantes, exécutez les commandes suivantes :

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';

La valeur dans la colonne installed_version indique la version actuellement installée de l'extension. Si cette colonne ne contient aucune valeur, l'extension n'est pas installée.

Préparez la mise à niveau des extensions PostGIS

Lorsque vous mettez à niveau une instance RDS for PostgreSQL, vous devez prendre les mesures suivantes :

  • Effectuez la mise à niveau en plusieurs étapes.
  • Avant de mettre à niveau l'instance RDS for PostgreSQL, commencez par mettre à niveau la version de l'extension à chaque étape.

Exécutez la commande SELECT postgis_full_version(). Dans la sortie, vérifiez si certaines extensions sont en attente de mise à niveau.

Exemple de sortie avec des extensions nécessitant une mise à niveau :

postgres=>  SELECT postgis_full_version();
                                                                                                                        postgis_full_version                                                                                                                          
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POSTGIS="2.2.5 r15298" GEOS="3.6.2-CAPI-1.10.2 4d2925d6" PROJ="Rel. 4.9.3, 15 August 2016" GDAL="GDAL 2.1.4, released 2017/06/23" LIBXML="2.9.1" LIBJSON="0.12.1" (core procs from "2.2.2 r14797" need upgrade) RASTER (raster procs from "2.2.2 r14797" need upgrade)

Exemple de sortie sans extension nécessitant une mise à niveau :

postgres=> SELECT postgis_full_version();
                                                                                postgis_full_version                                                                                 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POSTGIS="2.3.7 r16523" PGSQL="96" GEOS="3.6.2-CAPI-1.10.2 4d2925d6" PROJ="Rel. 4.9.3, 15 August 2016" GDAL="GDAL 2.1.4, released 2017/06/23" LIBXML="2.9.1" LIBJSON="0.12.1" RASTER
(1 row)

Choix d’une version disponible pour votre mise à niveau

Vérifiez que les informations d'installation et de version de PostGIS qui figurent dans la sortie de la table du catalogue pg_extension correspondent bien à celles de la commande SELECT postgis_full_version().

Exécutez la commande suivante pour identifier la prochaine version prise en charge pour les extensions installées dans votre instance RDS for PostgreSQL :

postgres=> SELECT name,version,installed FROM pg_catalog.pg_available_extension_versions WHERE name LIKE 'postgis%' AND version NOT LIKE ALL (array['%next%','%unpackaged%']) order by 2,1;
postgres=> SELECT name,version,installed FROM pg_catalog.pg_available_extension_versions WHERE name LIKE 'address%' AND version NOT LIKE ALL (array['%next%','%unpackaged%']) order by 2,1;

Sélectionnez la version la plus compatible disponible pour une mise à niveau.

Remarque : avant de procéder à une mise à niveau du moteur PostgreSQL, consultez la table pg_extension pour vous assurer qu'il n'existe pas de version d'extension de type « next », « dev » ou « unpackaged ». Si vous utilisez l'une de ces versions, il est recommandé de passer d'abord à la version d'extension standard.

Mise à niveau des extensions

Pour mettre à niveau les extensions, exécutez l'une des commandes suivantes.

Si la version installée de PostGIS est la version 2.5 ou ultérieure, exécutez la commande suivante :

SELECT postgis_extensions_upgrade();


Pour mettre à niveau PostGIS de la version 2.5.x vers la version 3.x, exécutez deux fois la commande suivante :

SELECT postgis_extensions_upgrade();

Si la version installée de PostGIS est la version 2.4 ou antérieure, exécutez la commande ALTER EXTENSION :

ALTER EXTENSION PostgreSQL-extension UPDATE TO 'new-version';

Si vous avez installé plusieurs modules PostGIS, tels que postgis_topology, mettez à jour chaque module individuellement. L'exemple suivant présente la méthode recommandée pour mettre à jour plusieurs modules à l'aide de la commande ALTER EXTENSION :

ALTER EXTENSION postgis UPDATE TO 'new-version';

ALTER EXTENSION postgis_topology UPDATE TO 'new-version';

ALTER EXTENSION postgis_tiger_geocoder UPDATE TO 'new-version';


Remarque : les extensions sont installées au niveau de la base de données. Vous devez mettre à jour les extensions dans toutes les bases de données où elles sont installées.

Si la version actuelle de PostGIS installée est la version 3.0 ou ultérieure, vous devez mettre à jour les fonctions raster séparément. Si vous n'utilisez pas de fonctions raster, exécutez la commande suivante après avoir effectué la mise à jour des extensions :

postgres=> DROP EXTENSION postgis_raster;

Une fois les extensions à jour, mettez à niveau la version du moteur RDS for PostgreSQL pour les versions d'extension prises en charge.

Après avoir mis à niveau votre instance, vous devez répéter ces étapes pour vérifier la version installée de PostGIS et de ses extensions dépendantes.

Remarque : il est recommandé de mettre à niveau PostGIS et ses extensions dépendantes vers la dernière version prise en charge par votre version actuelle de RDS for PostgreSQL.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 8 mois