【Amazon RDS】PostgreSQL 13.12 を 14.10 へアップグレードする

# 背景
Amazon RDS 上で利用している PostgreSQL 13.12 を、メジャーバージョンの 14.10 へアップグレードしたので、その手順をまとめます。


# 目次
* [1. はじめに](#1-はじめに)
* [2. 実施方法](#2-実施方法)
    - [2-1. パラメータグループの作成](#2-1-パラメータグループの作成)
    - [2-2. データベースクラスの互換性確認](#2-2-データベースクラスの互換性確認)
    - [2-3. 準備済みのトランザクションとreg データ型の存在確認](#2-3-準備済みのトランザクションとreg-データ型の存在確認)
    - [2-4. 論理レプリケーションスロットの削除](#2-4-論理レプリケーションスロットの削除)
    - [2-5. バックアップの実行](#2-5-バックアップの実行)
    - [2-6. 特定のエクステンションの更新](#2-6-特定のエクステンションの更新)
    - [2-7. 特定のエクステンションの削除](#2-7-特定のエクステンションの削除)
    - [2-8. unknown データ型の削除](#2-8-unknown-データ型の削除)
    - [2-9. 開発環境のデータベースのアップグレード](#2-9-開発環境のデータベースのアップグレード)
    - [2-10. 本番環境のデータベースのアップグレード](#2-10-本番環境のデータベースのアップグレード)
    - [2-11. pg_statistic テーブルの更新](#2-11-pg_statistic-テーブルの更新)


# 1. はじめに
今回は PostgreSQL 13.12 を一つ上の 14系 にアップグレードすることを目的としました。
現在利用している PostgreSQL からアップグレード可能な対象のバージョンについては、以下の公式ドキュメントから確認できます。

>PostgreSQL のメジャーバージョンアップグレードの選択
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html#USER_UpgradeDBInstance.PostgreSQL.MajorVersion


# 2. 実施方法
Amazon RDS では、13 から 14 のようなメジャーバージョンのアップグレードは自動的に適用されません。
そのため、手動でのアップグレードが必要となりますが、大まかな手順は以下の公式ドキュメントから確認できます。
今回はこちらのドキュメントを元に、手順をまとめていきます。

>メジャーバージョンのアップグレードを実施する方法
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html#USER_UpgradeDBInstance.PostgreSQL.MajorVersion.Process


# 2-1. パラメータグループの作成
まず最初に、アップグレード先のバージョンに対応する、パラメータグループを作成します。
マネジメントコンソールから RDS を選択して、「パラメータグループ」>「パラメータグループの作成」を開きます。

![【RDSバージョンアップ】手順①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527980/5a94ffad-eccb-5c8c-2ee4-ab0b2fbecddf.png)

上記の設定項目は、全て必須となります。
* パラメータグループファミリー：アップグレード先を指定
* タイプ：利用するものを選択
* グループ名：自由に記載
* 説明：自由に記載


# 2-2. データベースクラスの互換性確認
現行のデータベース（PostgreSQL 13.12）に設定しているインスタンスクラスが、アップグレード先（PostgreSQL 14.10）と互換性があることを確認します。
互換性の一覧については、以下の公式ドキュメントから確認できます。

>DB インスタンスクラスでサポートされている DB エンジン
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html#Concepts.DBInstanceClass.Support


# 2-3. 準備済みのトランザクションとreg データ型の存在確認
* 準備済みのトランザクションの確認
アップグレードの実行前に、準備済みのトランザクションがデータベース上に存在しないことを確認します。
PostgreSQL に接続し、以下のSQL文を実行してください。
```
SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
```
※準備済みのトランザクションが存在していた場合、コミットまたはロールバックを実行してください。

* reg* データ型の確認
同様に、データベース上でreg* データ型が使用されていないことを確認します。
以下のSQL文を実行してください。
```
SELECT count(*) FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a
  WHERE c.oid = a.attrelid
      AND NOT a.attisdropped
      AND a.atttypid IN ('pg_catalog.regproc'::pg_catalog.regtype,
                         'pg_catalog.regprocedure'::pg_catalog.regtype,
                         'pg_catalog.regoper'::pg_catalog.regtype,
                         'pg_catalog.regoperator'::pg_catalog.regtype,
                         'pg_catalog.regconfig'::pg_catalog.regtype,
                         'pg_catalog.regdictionary'::pg_catalog.regtype)
      AND c.relnamespace = n.oid
      AND n.nspname NOT IN ('pg_catalog', 'information_schema');
                                    
```
※reg* データ型が使用されていた場合、削除を実行してください。


# 2-4. 論理レプリケーションスロットの削除
アップグレードの実行前に、論理レプリケーションスロットがデータベース上に存在しないことを確認します。
存在する場合は、使用されていないことを確認した上で、以下のSQL文を実行して削除してください。
```
SELECT * FROM pg_replication_slots;
SELECT pg_drop_replication_slot(slot_name);
```


# 2-5. バックアップの実行
アップグレードの実行前に、データベースのバックアップを実行します。
対象のデータベースを選択して、アクションタブから「スナップショットの取得」を実行します。

![【RDSバージョンアップ】手順⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527980/c1562987-5b3c-e8f3-c206-4f888c43bcad.png)

※スナップショットの取得には、データベースを開始しておく必要があります。


# 2-6. 特定のエクステンションの更新
メジャーバージョンをスキップしてアップグレードする場合、特定のエクステンションを更新する必要があります。
メジャーバージョンのスキップとは、例えば バージョン 9.5.x または 9.6.x から バージョン 11.x 以降 へアップグレードするといったことです。
今回のアップグレードはこちらに該当していないため、更新しません。


# 2-7. 特定のエクステンションの削除
メジャーバージョンをスキップしてアップグレードする場合、特定のエクステンションを削除する必要があります。
[2-6. ](#2-6-特定のエクステンションの更新) と同様に今回のアップグレードでは該当していないため、削除しません。


# 2-8. unknown データ型の削除
PostgreSQL 10.x 以降 では、unknown データ型のサポートが終了しています。
今回は PostgreSQL 13.12 以降 を対象としたアップグレードのため、削除は不要となります。


# 2-9. 開発環境のデータベースのアップグレード
本番環境のデータベースをアップグレードする前に、開発環境などのデータベースを利用してリハーサルを行います。
対象のデータベースを選択して、変更タブから設定に移行し、「DBエンジンバージョン」を「14.10」にします。
その後、「続行」を選択することでアップグレードが実行されます。
但し変更が適用されるまでには時間を要するため、必ず開始から終了までの時間を計測しておきましょう。

![【RDSバージョンアップ】手順⑨.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527980/66e29f5e-2b2c-e735-64b2-34308ece331e.png)

※データベースの変更には、データベースを開始しておく必要があります。


# 2-10. 本番環境のデータベースのアップグレード
開発環境でのリハーサルが完了したら、本番環境のデータベースをアップグレードします。
リハーサルでの作業内容や終了時間を参考に、実施を進めてください。


# 2-11. pg_statistic テーブルの更新
本番環境でのアップグレードが問題なく完了したら、最後にデータベースに対して `ANALYZE` を実行して pg_statistic テーブルを更新します。
こちらはアップグレード後に、PostgreSQL のすべてのテーブルに対して行う必要があります。
以下のSQL文を実行してください。
```
ANALYZE VERBOSE;
```

以上で一通りの手順は完了となります。