在 RDS for PostgreSQL 实例升级期间,如何排查与 PostGIS 扩展相关的问题?

3 分钟阅读
0

由于 PostGIS 扩展出现问题,我的 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 实例的主要版本升级失败。

简短描述

由于多种原因,您的 Amazon RDS for PostgreSQL 实例的主要版本升级可能失败。最常见的原因可能是您在执行主要版本升级之前没有将 PostGIS 扩展或相关扩展(例如 address_standardizer、address_standardizer_data_us、postgis_tiger_geocoder、postgis_topology 或 postgis_raster)更新到当前支持的版本。

若要检查您的 RDS PostgreSQL 实例主要版本升级是否因 PostGIS 或相关扩展而失败,请执行以下操作:

1.    检查实例的事件。您可能会看到类似于以下内容的事件:

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.    检查数据库实例的预检查日志文件,这些文件是在升级过程中创建的。在主要版本升级期间,RDS for PostgreSQL 会对实例执行某些预检查流程,以确定可能导致升级流程失败的问题。您可以在 pg_upgrade_precheck.log 文件中找到预检查期间遇到的任何问题的相关信息。Amazon RDS 会将时间戳附加到文件名。

如果预检查日志文件包含类似于以下内容的消息,则升级流程将因 PostGIS 或相关扩展失败。

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

若要检查已安装的 PostGIS 版本和相关扩展,请运行以下命令:

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

installed_version 列中的值显示当前安装的扩展版本。如果此列没有值,则表示未安装此扩展。

解决方法

若要排查 RDS for PostgreSQL 实例中的升级失败问题,请根据您的使用案例使用以下方法之一。

移除 PostGIS 扩展

在以下情况下,删除扩展并在升级成功后重新创建扩展:

  • 您不需要实例中的 PostGIS 或相关扩展。
  • 扩展的更新路径不存在。

**注意:**删除扩展也会删除相关列。

1.    若要删除扩展,请运行以下命令:

postgres=> DROP EXTENSION example_extension CASCADE;

2.    在安装扩展的所有数据库中删除扩展后,请升级您的 RDS for PostgreSQL 实例。

3.    升级实例后,若需要,请通过运行以下命令创建扩展:

postgres=> CREATE EXTENSION extension_name;

更新 PostGIS 扩展

执行以下操作:

  • 分多个步骤执行升级。
  • 在升级 RDS for PostgreSQL 实例之前,请在每个步骤中更新扩展版本。

检查 RDS for PostgreSQL 实例中安装的扩展的下一条最高支持更新路径。运行以下命令:

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

请务必更换以下内容:

  • extension_name 更换为已安装扩展的名称
  • current_version 更换为当前已安装的扩展版本

如果该命令没有返回更新路径,但扩展的 installed_versiondefault_version 值相同,则表示扩展已更新。在这种情况下,您可以执行引擎版本升级。

例如:

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

示例输出:

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

如果 installed_versiondefault_version 的值不同,请将已安装的 PostGIS 和相关扩展升级到最高支持目标版本。

若要升级扩展,请运行以下命令:

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

**注意:**请务必在实例中更新 PostGIS 扩展以及相关扩展。这些扩展在数据库级别安装。因此,请务必在安装扩展的所有数据库中更新扩展。

若要在使用 PostGIS 版本 2.5.0 或更高版本时更新 PostGIS 和 postgis_raster 扩展,请运行以下命令:

postgres=> SELECT postgis_extensions_upgrade();

在 PostGIS 版本 3.0 及更高版本中,光栅功能划分为单独的扩展。如果您不使用光栅,请在更新扩展后运行以下命令:

postgres=> DROP EXTENSION postgis_raster;

更新扩展后,您可以升级 RDS for PostgreSQL 实例到支持这些扩展版本的引擎版本。

升级实例后,您可以重复更新扩展版本的步骤,然后升级 RDS 实例引擎版本,直到安装目标引擎版本。


相关信息

如何执行主要版本升级

将 PostgreSQL 扩展与 Amazon RDS for PostgreSQL 结合使用

AWS 官方
AWS 官方已更新 2 年前