在升級 RDS for PostgreSQL 執行個體時,如何解決與 PostGIS 延伸相關的問題?

上次更新日期:2022 年 6 月 3 日

PostGIS 延伸存在問題,導致我的 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 執行個體的主要版本升級失敗。

簡短描述

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 執行個體引擎版本,直至安裝目標引擎版本。