RDS for PostgreSQL インスタンスをアップグレードする際に発生する PostGIS 拡張機能に関連する問題をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2022 年 6 月 3 日

PostgreSQL インスタンスの Amazon Relational Database Service (Amazon RDS) のメジャーバージョンアップグレードは、PostGIS 拡張機能の問題により失敗しました。

簡単な説明

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 インスタンスでインストールされている拡張機能について、サポートされている 2 番目に新しい更新パスを確認します。次のコマンドを実行します。

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 インスタンスエンジンのバージョンのアップグレードのステップを繰り返すことができます。