Aurora PostgreSQL メジャーバージョンアップ事前作業

本書はAurora PostgreSQL 11.16 → 14.5 へアップグレードする前の作業について記載する。
バージョン対応表は以下を参照
![利用可能なバージョン表(2023/7/12時点)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336399/7e6eec91-b339-77bf-d827-1d5b9eaea935.png "利用可能なバージョン表_20230712時点")

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.PostgreSQL.html#USER_UpgradeDBInstance.PostgreSQL.UpgradeVersion

## 環境
DB クラスター
　エンジン：Aurora postgresql
　キャパシティータイプ：シングルマスター
　リージョン：ap-northeast-1

DB インスタンス
　インスタンスクラス：db.r5.large
　AZ(ライター)：ap-northeast-1c
　AZ(リーダー)：ap-northeast-1d

EC2
　インスタンスタイプ：c5.large
　AZ：ap-northeast-1d
　OS：Red Hat Enterprise Linux 7.7
　導入済みパッケージ：postgresql11-11.10-1PGDG.rhel7.x86_64
　　　　　　　　　　　postgresql11-libs-11.10-1PGDG.rhel7.x86_64


## 作業一覧
1. カスタムパラメータグループ作成
1. サポートされていない使用の確認

:::note warn
注意
カスタムパラメータグループ作成は必須ではないが、作成することを推奨。
パラメータグループをデフォルトに設定した場合、パラメータの変更不可。
デフォルトからカスタムパラメータへ変更する際に再起動が必須となる。
:::

## 作業手順
### 1. カスタムパラメータグループ作成
:::note
カスタムパラメータグループには2種類ある
　1. DB パラメータ グループ
　2. DB **クラスター** パラメータグループ
違いはインスタンス別で設定可能か、クラスター単位で設定可能かどうか。

簡単に言えば [1. DB パラメータ グループ] の設定値が優先で適用され、[1. DB パラメータ グループ] でデフォルト値の場合、[2. DB **クラスター** パラメータグループ] の設定値が適用される。
:::


#### ①DB パラメータ グループ作成
**パラメータグループファミリー**
　バージョンアップ後のバージョンを選択
**タイプ**
　```DB Parameter Group``` を選択
**グループ名**/**説明**
　任意の文字列を入力
![カスタムパラメータグループ作成_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336399/4d38ac2c-bf20-ee69-4279-e69fef6c56f4.png)

#### ②DB クラスター パラメータグループ作成
**パラメータグループファミリー**
　バージョンアップ後のバージョンを選択
**タイプ**
　```DB Cluster Parameter Group``` を選択
**グループ名**/**説明**
　任意の文字列を入力
![カスタムパラメータグループ作成_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336399/a9525786-d717-007a-6322-ab96bcd0daf2.png)


#### ③各パラメータの変更
例)カスタムパラメータグループの[timezone]の変更
　UTC → Asia/Tokyo へ変更
![カスタムパラメータグループ作成_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336399/7ebb3d86-01cc-9f8d-4159-5294c484b3a5.png)


### 2. サポートされていない使用の確認
#### ①準備済みのトランザクションが存在しないことを確認
```sql
SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
```

```sql:実行例
 postgres=> SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
  count 
 -------
      0
 (1 行)
```

#### ② 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');
```

```sql:実行例
 postgres=> SELECT count(*) FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a 
 postgres->   WHERE c.oid = a.attrelid 
 postgres->       AND NOT a.attisdropped 
 postgres->       AND a.atttypid IN ('pg_catalog.regproc'::pg_catalog.regtype, 
 postgres(>                          'pg_catalog.regprocedure'::pg_catalog.regtype, 
 postgres(>                          'pg_catalog.regoper'::pg_catalog.regtype, 
 postgres(>                          'pg_catalog.regoperator'::pg_catalog.regtype, 
 postgres(>                          'pg_catalog.regconfig'::pg_catalog.regtype, 
 postgres(>                          'pg_catalog.regdictionary'::pg_catalog.regtype) 
 postgres->       AND c.relnamespace = n.oid 
 postgres->       AND n.nspname NOT IN ('pg_catalog', 'information_schema');
  count 
 -------
      0
 (1 行)
```

#### ③template1 と template0 の確認
　template1 と template0 が存在し、テンプレートとしてリストされていること
```sql
SELECT datname, datistemplate FROM pg_database;
```

```sql:実行例
 postgres=> SELECT datname, datistemplate FROM pg_database;
datname    | datistemplate
-----------+---------------
template0  | t
rdsadmin   | f
template1  | t
postgres   | f
```
:::note warn
template1 と template0 の [datistemplate] の値が「t」であること
:::

#### ④論理的なレプリケーションスロットがないことを確認
```sql
SELECT * FROM pg_replication_slots;
```

```sql:実行例
 postgres=> SELECT * FROM pg_replication_slots;
  slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn 
 -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
 (0 行)
```

#### ⑤拡張機能の確認
インストール済みの拡張機能に以下がある場合は、Auroraメジャーバージョンアップ前に拡張機能のアップデートを実施
* pgRouting
* postgis_raster
* postgis_tiger_geocoder
* postgis_topology
* address_standardizer
* address_standardizer_data_us

```sql:拡張機能一覧表示
SELECT * FROM pg_extension;
```
```sql:拡張機能アップデート
ALTER EXTENSION PostgreSQL-extension UPDATE TO 'new-version';
```
:::note warn
インストールされている拡張機能ごとにアップデートが必要
:::


## 参考
AWS公式 Aurora PostgreSQL DBエンジンのアップグレード

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.PostgreSQL.html#USER_UpgradeDBInstance.PostgreSQL.MajorVersion

メジャーバージョンアップ

https://qiita.com/20230420/items/32a0d2843552e933c915

マイナーバージョンアップ

https://qiita.com/20230420/items/fc381234b017e16eda40