¿Cómo soluciono los problemas relacionados con la extensión PostGIS al actualizar mi instancia de RDS para PostgreSQL?

Última actualización: 03-06-2022

La actualización de la versión principal de mi instancia de Amazon Relational Database Service (Amazon RDS) para PostgreSQL ha fallado debido a problemas con la extensión PostGIS.

Descripción corta

La actualización de la versión principal de la instancia de RDS para PostgreSQL puede fallar por varios motivos. La razón más común puede ser que no haya actualizado la extensión de PostGIS ni las extensiones dependientes, como address_standardizer, address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology y postgis_raster, a la versión compatible actual antes de realizar la actualización de la versión principal.

Para comprobar si la actualización de la versión principal de la instancia de PostgreSQL de RDS falló debido a PostGIS o extensiones dependientes, haga lo siguiente:

1.    Compruebe los eventos de la instancia. Es posible que vea un evento similar al siguiente:

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.    Compruebe los archivos de registro de comprobación previa de la instancia de base de datos que se creó durante el proceso de actualización. Durante la actualización de la versión principal, RDS para PostgreSQL realiza ciertos procedimientos de comprobación previa en la instancia para identificar los problemas que podrían provocar un error en el proceso de actualización. Puede encontrar información sobre los problemas encontrados durante la comprobación previa en el archivo pg_upgrade_precheck.log. Amazon RDS agrega una marca de tiempo al nombre del archivo.

Si el archivo de registro de verificación previa incluye un mensaje similar al siguiente, el proceso de actualización falló debido a PostGIS o extensiones dependientes.

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

Para comprobar la versión instalada de PostGIS y las extensiones dependientes, ejecute los siguientes comandos:

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

El valor de la columna installed_version muestra la versión actualmente instalada de la extensión. Si esta columna no tiene ningún valor, significa que la extensión no está instalada.

Resolución

Para solucionar el error de actualización en la instancia de RDS para PostgreSQL, utilice uno de los siguientes métodos en función de su caso de uso.

Eliminar la extensión PostGIS

Si no necesita las extensiones PostGIS o dependientes en la instancia, elimine la extensión y vuelva a crearla después de que la actualización se realice correctamente.

Nota: Al eliminar la extensión también se eliminan las columnas dependientes.

1.    Para eliminar la extensión, ejecute el siguiente comando:

postgres=> DROP EXTENSION example_extension CASCADE;

2.    Después de eliminar las extensiones en todas las bases de datos en las que están instaladas, actualice la instancia de RDS para PostgreSQL.

3.    Después de actualizar la instancia, cree la extensión, si es necesario, mediante la ejecución del siguiente comando:

postgres=> CREATE EXTENSION extension_name;

Actualizar la extensión PostGIS

Haga lo siguiente:

  • Realice la actualización en varios pasos.
  • Actualice la versión de la extensión en cada paso antes de actualizar la instancia de RDS para PostgreSQL.

Busque la siguiente ruta de actualización más compatible para la extensión instalada en la instancia de RDS para PostgreSQL. Ejecute el siguiente 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 '%--%';

Asegúrese de reemplazar lo siguiente:

  • extension_name por el nombre de la extensión instalada
  • current_version por la versión de la extensión instalada actualmente

Si el comando no devuelve una ruta de actualización, pero los valores installed_version y default_version de las extensiones son los mismos, significa que la extensión ya está actualizada. En este caso, puede realizar la actualización de la versión del motor.

Por ejemplo:

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

Salida de ejemplo:

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

Si los valores de installed_version y default_version son diferentes, actualice las extensiones PostGIS y extensiones dependientes instaladas a la versión de destino más compatible.

Para actualizar la extensión, ejecute el siguiente comando:

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

Nota: Asegúrese de actualizar la extensión PostGIS junto con las extensiones dependientes de la instancia. Estas extensiones se instalan en el nivel de la base de datos. Por lo tanto, asegúrese de actualizar las extensiones en todas las bases de datos en las que se instalaron.

Para actualizar la extensión PostGIS y postgis_raster cuando esté en PostGIS versión 2.5.0 o posterior, ejecute el siguiente comando:

postgres=> SELECT postgis_extensions_upgrade();

En PostGIS versión 3.0 y posteriores, la funcionalidad ráster se divide como una extensión independiente. Si no usa ráster, ejecute el siguiente comando después de actualizar la extensión:

postgres=> DROP EXTENSION postgis_raster;

Después de actualizar las extensiones, puede actualizar la instancia de RDS para PostgreSQL a la versión del motor compatible con estas versiones de extensión.

Después de actualizar la instancia, puede repetir los pasos de actualización de la versión de la extensión y, a continuación, actualizar la versión del motor de instancias de RDS hasta que instale la versión del motor de destino.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?