Como soluciono problemas relacionados à extensão PostGIS ao atualizar minha instância do RDS para PostgreSQL?

6 minuto de leitura
0

A atualização da versão principal da minha instância Amazon Relational Database Service (Amazon RDS) para PostgreSQL falhou devido a problemas com a extensão PostGIS.

Breve descrição

A atualização da versão principal da sua instância do Amazon RDS para PostgreSQL pode falhar por vários motivos. O motivo mais comum é uma extensão PostGIS desatualizada ou extensões dependentes. Antes de realizar a atualização da versão principal, você deve atualizar o PostGIS e as extensões dependentes. As extensões dependentes incluem address_standardizer, address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology ou postgis_raster.

Primeiro, determine se a atualização da versão principal da instância do RDS para PostgreSQL falhou devido às extensões. Se o problema for com as extensões, atualize o PostGIS e suas extensões dependentes.

Resolução

Verifique se sua instância precisa de atualizações de extensão

Para determinar se a atualização da versão principal da instância do RDS para PostgreSQL falhou devido às extensões, conclua as tarefas a seguir.

Veja os eventos da instância. Você pode ver um evento semelhante ao seguinte:

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

Visualize os arquivos de log de pré-verificação da instância. Em uma atualização de versão principal, o RDS for PostgreSQL executa procedimentos de pré-verificação na instância. Você pode encontrar problemas que ocorrem durante a pré-verificação no arquivo pg_upgrade_precheck.log.

Se o arquivo de log de pré-verificação incluir uma mensagem semelhante ao exemplo a seguir, o processo de atualização falhou devido ao PostGIS ou às extensões dependentes:

------------------------------------------------------------------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 verificar a versão instalada do PostGIS e suas extensões dependentes, execute os seguintes 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';

O valor na coluna installed_version mostra a versão atualmente instalada da extensão. Se essa coluna não tiver valor, a extensão não está instalada.

Prepare a atualização das extensões PostGIS

Ao atualizar uma instância do RDS para PostgreSQL, execute as seguintes ações:

  • Execute a atualização em várias etapas.
  • Antes de atualizar a instância do RDS para PostgreSQL, primeiro atualize a versão da extensão em cada etapa.

Execute o comando SELECT postgis_full_version(). Na saída, verifique se há extensões que estão pendentes de atualização.

Exemplo de saída com extensões que devem ser atualizadas:

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)

Exemplo de saída sem extensões que exijam uma atualização:

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)

Escolha a versão que está disponível para uma atualização

Confirme se as informações de instalação e versão do PostGIS na saída da tabela do catálogo pg_extension correspondem ao comando SELECT postgis_full_version().

Execute o comando a seguir para verificar a próxima versão compatível com as extensões que estão instaladas em sua instância do RDS para 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;

Selecione a versão com maior suporte que está disponível para uma atualização.

Observação: antes de atualizar o mecanismo PostgreSQL, verifique a tabela pg_extension para confirmar se não há versões de extensão “next”, “dev” ou “unpackaged”. Se você usa qualquer uma dessas versões, é uma prática recomendada passar primeiro para a versão de extensão padrão.

Atualize as extensões

Para atualizar as extensões, execute um dos seguintes comandos.

Se a versão instalada do PostGIS for 2.5 ou posterior, execute o seguinte comando:

SELECT postgis_extensions_upgrade();


Para atualizar o PostGIS da versão 2.5.x para 3.x, execute o seguinte comando duas vezes:

SELECT postgis_extensions_upgrade();

Se a versão instalada do PostGIS for a versão 2.4 ou anterior, execute o comando ALTER EXTENSION:

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

Se você instalou vários módulos PostGIS, como postgis_topology, atualize cada módulo individualmente. O exemplo a seguir mostra a melhor prática para atualizar vários módulos com o comando 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';


Observação: as extensões são instaladas no nível do banco de dados. Certifique-se de atualizar as extensões em todos os bancos de dados em que elas estão instaladas.

Se a versão atual do PostGIS instalada for 3.0 ou posterior, você deverá atualizar separadamente as funções do raster. Se você não usa funções de varredura, execute o seguinte comando depois de atualizar as extensões:

postgres=> DROP EXTENSION postgis_raster;

Depois de atualizar as extensões, atualize a versão do mecanismo RDS para PostgreSQL para as versões de extensão aceitas.

Depois de atualizar sua instância, repita as etapas para verificar a versão instalada do PostGIS e suas extensões dependentes.

Observação: é uma prática recomendada atualizar o PostGIS e suas extensões dependentes para a versão mais recente aceitas em sua versão atual do RDS para PostgreSQL.