升级 RDS for PostgreSQL 实例时,如何解决与 PostGIS 扩展相关的问题?
由于 PostGIS 扩展出现问题,我的适用于 PostgreSQL 的Amazon Relational Database Service(Amazon RDS)实例的主要版本升级失败。
概述
Amazon RDS for PostgreSQL 实例的主要版本升级可能由于多种原因而失败。最常见的原因是过时的 PostGIS 扩展或依赖项扩展。在执行主要版本升级之前,必须更新 PostGIS 扩展和依赖项扩展。依赖项扩展包括 address_standardizer、address_standardizer_data_us、postgis_tiger_geocoder、postgis_topology 或 postgis_raster。
首先,确定您的 RDS for PostgreSQL 实例的主要版本升级是否因扩展而失败。如果问题出在扩展上,则升级 PostGIS 及其依赖项的扩展。
解决方案
检查您的实例是否需要扩展升级
要确定您的 RDS for PostgreSQL 实例的主要版本升级是否因扩展而失败,请完成以下任务。
查看该实例的事件。您可能会看到与以下事件类似的事件:
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
查看该实例的预检查日志文件。在主要版本升级中,RDS for PostgreSQL 对实例执行预检查程序。您可以在 pg_upgrade_precheck.log 文件中找到预检查期间发生的问题。
如果预检查日志文件包含与以下示例类似的消息,则升级过程由于 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 列中的值显示当前安装的扩展版本。如果此列没有值,则未安装扩展。
准备 PostGIS 扩展升级
升级 RDS for PostgreSQL 实例时,请执行以下操作:
- 分多个步骤执行升级。
- 在升级 RDS for PostgreSQL 实例之前,请先在每个步骤中升级扩展版本。
运行 **SELECT postgis_full_version()**命令。在输出中,检查是否有待升级的扩展。
带有必须升级的扩展的示例输出:
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)
不带有需要升级的扩展的示例输出:
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)
选择可供升级的版本
确认 pg_extension 目录表输出中的 PostGIS 安装和版本信息与 **SELECT postgis_full_version()**命令相匹配。
运行以下命令检查安装在 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;
选择可供升级的最高支持版本。
**注意:**在升级 PostgreSQL 引擎之前,请检查 pg_extension 表,确认没有“下一个”、“开发”或“未打包”的扩展版本。如果您使用其中任一版本中,那么最佳做法是先迁移到标准扩展版本。
升级扩展
要升级扩展,请运行以下任一命令。
如果安装的 PostGIS 版本为 2.5 或更高版本,则运行以下命令:
SELECT postgis_extensions_upgrade();
要将 PostGIS 从 2.5.x 版本升级到 3.x,请运行以下命令两次:
SELECT postgis_extensions_upgrade();
如果安装的 PostGIS 版本是 2.4 或更早版本,则运行 ALTER EXTENSION 命令:
ALTER EXTENSION PostgreSQL-extension UPDATE TO 'new-version';
如果您安装了多个 PostGIS 模块,比如 postgis_topology,则分别更新每个模块。以下示例显示了使用 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';
**注意:**扩展安装在数据库级别。确保更新所有安装了扩展的数据库中的扩展。
如果当前安装的 PostGIS 版本为 3.0 或更高版本,则必须单独更新栅格函数。如果您不使用栅格函数,请在更新扩展后运行以下命令:
postgres=> DROP EXTENSION postgis_raster;
更新扩展后,升级 RDS for PostgreSQL 的引擎版本以获取支持的扩展版本。
升级实例后,重复这些步骤以检查已安装的 PostGIS 版本及其依赖项扩展。
**注意:**最佳做法是在当前 RDS for PostgreSQL 版本上将 PostGIS 及其依赖项扩展升级到支持的最新版本。
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 个月前