Aurora(PostgreSQL)のアップグレード


Aurora(PostgreSQL)のアップグレード

PostgreSQLは1年に1回メジャーバージョンアップし、その後にセキュリティパッチ、バグフィックスなどを含めたマイナーバージョンがリリースされます。メジャーバージョンがリリースされてから5年でEOLを迎えます。

Aurora(PostgreSQL)でも遅れてPostgreSQLのメジャーバージョン、マイナーバージョンがリリースされます。2020年4月時点では、9.6から11.6までのバージョンが利用できます。最新のPostgreSQLは12.2なので、若干古いバージョンになっています。

AWS公式のアップグレードに関する情報は以下のページで確認することができます。

Amazon Aurora PostgreSQLのバージョンの確認

Auroraには、Auroraとデータベースエンジンの2つのバージョンを持っています。

データベースエンジンのバージョンは、通常のPostgreSQLと同様に以下のように確認できます。
今回は後でアップグレードを試すために少し古いバージョン(10.5)を利用しています。

postgres=> SHOW SERVER_VERSION;
 server_version 
----------------
 10.5
(1 row)

次のAuroraのバージョンは以下のように確認できます。

postgres=> SELECT AURORA_VERSION();
 aurora_version 
----------------
 2.1.1
(1 row)

なお、AuroraとPostgreSQLとバージョンの紐づけは以下のページで確認できます。
(Auroraのバージョンを知ると何か良いことがあるのかは分かりませんが。。。)

アップグレードできるバージョンの確認

Auroraをアップグレードできるかどうかは以下のコマンドで確認することができます。

aws rds describe-db-engine-versions --engine aurora-postgresql

例えば、10.5のバージョンの場合は以下のように出力されます。
「"AutoUpgrade": true」で自動アップグレードの対象かどうかが確認できるようになっているようです。

なお、10.5からは10.6~10.11へバージョンアップができるようです。

        {
            "Engine": "postgres",
            "EngineVersion": "10.5",
            "DBParameterGroupFamily": "postgres10",
            "DBEngineDescription": "PostgreSQL",
            "DBEngineVersionDescription": "PostgreSQL 10.5-R1",
            "ValidUpgradeTarget": [
                {
                    "Engine": "postgres",
                    "EngineVersion": "10.6",
                    "Description": "PostgreSQL 10.6-R1",
                    "AutoUpgrade": true,
                    "IsMajorVersionUpgrade": false
                },
                {
                    "Engine": "postgres",
                    "EngineVersion": "10.7",
                    "Description": "PostgreSQL 10.7-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": false
                },
~省略~
                {
                    "Engine": "postgres",
                    "EngineVersion": "10.11",
                    "Description": "PostgreSQL 10.11-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": false
                },
                {
                    "Engine": "postgres",
                    "EngineVersion": "11.1",
                    "Description": "PostgreSQL 11.1-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": true
                },
~省略~
                {
                    "Engine": "postgres",
                    "EngineVersion": "11.6",
                    "Description": "PostgreSQL 11.6-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": true
                }
            ],
            "ExportableLogTypes": [
                "postgresql",
                "upgrade"
            ],
            "SupportsLogExportsToCloudwatchLogs": true,
            "SupportsReadReplica": true,
            "SupportedFeatureNames": [],
            "Status": "available"
        },

アップグレードの概要

インスタンスのアップグレードには以下の2種類があります。

  • メジャーバージョンのアップグレード
  • マイナーバージョンのアップグレード

メジャーバージョンのアップグレード

10.5から11.7へのアップグレードなどがメジャーバージョンのアップグレードです。
メジャーバージョンのアップグレードは下位互換性がなく、標準でサポートされていません。
そのため、別のDBクラスタを構成し、pg_dump/pg_restoreなどを使用して移行する必要があります。

例えば以下の手順が考えられます。

1)現行のスナップショットを取得。
2)現行のクラスタを停止。
3)現行のスナップショットを用いて新規にAuroraクラスタを構築。
4)AuroraのEndpointに切り替える。

アプリケーションからの書き込みがあるとデータに差分が発生するのでアプリケーションは停止しておく必要があります。
この方法ですとダウンタイムが長くなってしまいますので、ダウンタイムを短くしたい場合はAuroraクラスタ間でレプリケーションを行うことになります。

マイナーバージョンのアップグレード

・マイナーバージョンのアップグレードは下位互換性があります。
 例えば、11.6から11.7にアップグレードする場合です。
・自動アップグレードと手動アップグレードの2種類があります。
・アップグレード時にデータベースは停止状態になります。
・拡張機能はアップグレードされません。拡張機能を更新するためにALTER EXTENSION UPDATE のコマンドを実行します。

自動アップグレード

・DBインスタンスの作成時、変更時に、「マイナーバージョン自動アップグレード」を有効にする、もしくは推奨バージョン未満である場合に自動アップグレードされます。
・自動アップグレードはメンテナンスウィンドウで実行されます。

自動アップグレードで勝手にアップグレードして停止するケースが発生するので、無停止のシステムであれば注意が必要です。

手動アップグレードを実行する

手動アップグレードは、メンテナンスウィンドウ中か、すぐに適用するかを選べます。
すぐに適用するを選択した場合、変更直後ではありませんが、可能な限り早くアップグレードが実行されます。
今回は変更の設定をしてから数分後にアップグレードが完了していました。数分間停止したわけではなく、数分後に完了したということで、実際に停止した時間は確認していません。

アップグレードの手順は以下に記載があります。

コンソールからマイナーバージョンをアップグレードする手順は以下のようになります。
今回は10.5から10.7へのマイナーバージョンのアップグレードを試してみます。

コンソールでアップグレードを実行するデータベースを選択して、「変更」を選択します。

「DBエンジンのバージョン」で変更するバージョンを選択します。
今回は10.6から10.11までが選択できます。

次に「変更のスケジュール」でメンテナンスウィンドウ中で実行するか、すぐに適用するかを選択します。

データベースの画面に戻ると、ステータスが変わり、アップグレード待ちの状態になっています。

アップグレード実行後にバージョンを確認すると以下のように10.7へアップグレードされていることが確認できます。

postgres=> SHOW SERVER_VERSION;
 server_version 
----------------
 10.7
(1 row)

イベントを確認すると、以下のように「Database cluster has been patched」と出力されていました。

最後に拡張機能は自動でアップグレードされませんので、必要に応じて手動でアップグレードします。
現在の拡張機能を確認するには以下のように実行します。

postgres=> select * from pg_available_extensions;
             name             | default_version | installed_version |                                                       comment                                                       
------------------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------
 dblink                       | 1.2             |                   | connect to other PostgreSQL databases from within a database
 pg_repack                    | 1.4.3           |                   | Reorganize tables in PostgreSQL databases with minimal locks
 hstore                       | 1.4             |                   | data type for storing sets of (key, value) pairs
 postgis_tiger_geocoder       | 2.4.4           |                   | PostGIS tiger geocoder and reverse geocoder
 pg_visibility                | 1.2             |                   | examine the visibility map (VM) and page-level visibility info
 orafce                       | 3.6             |                   | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS
 prefix                       | 1.2.0           |                   | Prefix Range module for PostgreSQL
 isn                          | 1.1             |                   | data types for international product numbering standards
~省略~

installed_versionがdefault_versionより古い場合はアップグレードしておきましょう。(今回はありませんが)
アップグレードするためには以下のコマンドを実行します。

ALTER EXTENSION [拡張名] UPDATE TO [新しいバージョン];

今回はコンソールからアップグレードを実行しましたが、他にもAWS CLIとRDS APIで変更することができます。

参考