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

Data da última atualização: 03/06/2022

A atualização da versão principal para minha instância do 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 para sua instância do RDS para PostgreSQL pode falhar por vários motivos. O motivo mais comum pode ser que você não atualizou a extensão PostGIS ou extensões dependentes, como address_standardizer, address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology e postgis_raster, para a versão atual compatível antes de realizar a atualização da versão principal.

Para verificar se a atualização da versão principal da instância PostgreSQL do RDS falhou devido ao PostGIS ou a extensões dependentes, faça o seguinte:

1.    Verifique os eventos da instância. Você pode ver um evento parecido com o 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

2.    Verifique os arquivos de log de pré-verificação da instância do banco de dados que foi criada durante o processo de atualização. Durante a atualização da versão principal, o RDS para PostgreSQL executa determinados procedimentos de pré-verificação na instância para identificar problemas que podem causar falha no processo de atualização. Você pode encontrar informações sobre quaisquer problemas encontrados durante a pré-verificação no arquivo pg_upgrade_precheck.log. O Amazon RDS anexa um carimbo de data/hora ao nome do arquivo.

Se o arquivo de log de pré-verificação incluir uma mensagem parecida com a seguinte, o processo de atualização falhou devido ao PostGIS ou a 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 as 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, significa que a extensão não está instalada.

Resolução

Para solucionar problemas de falha de atualização em sua instância do RDS para PostgreSQL, use um dos métodos a seguir com base no seu caso de uso.

Remova a extensão PostGIS

Se você não precisar do PostGIS ou extensões dependentes na instância, descarte a extensão e recrie-a depois que a atualização for bem-sucedida.

Observação: descartar a extensão também remove as colunas dependentes.

1.    Para descartar a extensão, execute o seguinte comando:

postgres=> DROP EXTENSION example_extension CASCADE;

2.    Depois de descartar as extensões em todos os bancos de dados em que estão instaladas, atualize sua instância do RDS para PostgreSQL.

3.    Depois de atualizar a instância, crie a extensão, se necessário, executando o seguinte comando:

postgres=> CREATE EXTENSION extension_name;

Atualize a extensão PostGIS

Faça o seguinte:

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

Verifique o próximo caminho de atualização com suporte mais alto para a extensão instalada em sua instância do RDS para PostgreSQL. Execute o seguinte 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 '%--%';

Certifique-se de substituir o seguinte:

  • extension_name pelo o nome da extensão instalada
  • current_version pela a versão atualmente instalada da extensão

Se o comando não retornar um caminho de atualização, mas os valores das extensões installed_version e default_version forem os mesmos, isso significa que a extensão já está atualizada. Nesse caso, você pode realizar a atualização da versão do mecanismo.

Por exemplo:

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

Exemplo de saída:

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

Se os valores para installed_version e default_version forem diferentes, atualize o PostGIS instalado e as extensões dependentes para a versão de destino compatível mais alta.

Para atualizar a extensão, execute o seguinte comando:

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

Observação: certifique-se de atualizar a extensão PostGIS junto com as extensões dependentes na instância. Essas extensões são instaladas no nível do banco de dados. Portanto, certifique-se de atualizar as extensões em todos os bancos de dados em que elas foram instaladas.

Para atualizar a extensão PostGIS e postgis_raster quando você estiver noPostGIS versão 2.5.0 ou posterior, execute o seguinte comando:

postgres=> SELECT postgis_extensions_upgrade();

No PostGIS versão 3.0 e posterior, a funcionalidade raster é dividida como uma extensão separada. Se você não usar raster, execute o seguinte comando depois de atualizar a extensão:

postgres=> DROP EXTENSION postgis_raster;

Depois de atualizar as extensões, você pode atualizar a instância do RDS para PostgreSQL para a versão do mecanismo em que essas versões de extensão são compatíveis.

Depois de atualizar sua instância, você pode repetir as etapas de atualização da versão da extensão, seguidas pela atualização da versão do mecanismo de instância do RDS até instalar a versão do mecanismo de destino.