RDS インスタンスのメジャーバージョンのアップグレード

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

|メジャーバージョン|マイナーバージョン|
|---|---|
|手動|手動、自動|
|既存アプリケーションとの下位互換性のないDBの変更が含まれる場合有。|既存のアプリケーションとの下位互換性がある変更のみ。|

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

- 商用環境への適用前に、いずれのアップグレードも徹底的にテストすること。
- メジャーバージョンアップグレード中、必要に応じて RDS によって MySQL バイナリ `mysql_upgrade` が実行され、テーブルがアップグレードされます。
- メジャーバージョンアップグレード中、RDS によって `slow_log` および `general_log` テーブルが空にされます。これらのログ情報を保持するには、メジャーバージョンアップグレードの前にログファイルの内容を保存する。
- 通常は約 10 分で完了するが、インスタンスタイプによる。

# MySQL 5.7 から 8.0 へのアップグレードの事前チェック

- MySQL 8.0 には 5.7 との非互換性がいくつかある。
- MySQL 5.7 から 8.0 へのアップグレードをスタートすると、RDS では、これらの非互換性を検出するために自動的に事前チェック（必須）が実行されます。非互換性がある場合、RDS でアップグレードすることはできません。事前チェックで非互換性が見つかった場合、DB インスタンスが停止する前に、RDS により自動的にアップグレードがキャンセルされるため、実行時にダウンタイムが発生することはありません。

# MySQL 5.7 から 8.0 へのアップグレードに失敗した後のロールバック

- アップグレードに失敗した場合、DB は新しい MySQL 8.0 で正常に起動できなく、DB は再起動され、MySQL 5.7 にロールバックします。

# アップグレードをテストする

1.ドキュメントで互換性の問題を確認する。

https://dev.mysql.com/doc/refman/8.0/ja/upgrading-from-previous-series.html

2.カスタムDBパラメータグループを利用している場合、新しいメジャーバージョンと互換性のある既存の設定で新しいDBパラメータグループを作成し、手順5でテストインスタンスをアップグレードするときに新しいDBパラメータグループを指定する。
3.アップグレードする DB の スナップショットを作成する。
4.スナップショットから復元して、新しいテスト DB を作成する。
5.新しいテスト DB を新しいバージョンにアップグレードする。
6.アップグレードした DB によって使用されるストレージを評価し、アップグレードに追加のストレージが必要かどうかも判断する。
7.新しいバージョンの DB とアプリケーションが正しく動作することを確認する。

# アップグレード方法

## 従来のアップグレード方法

- マルチ AZ 配置にある場合、プライマリとスタンバイの両方がアップグレードされます。アップグレードが完了するまで、DBインスタンスは利用できなくなります。

[データベース]を選択し、アップグレードする DB インスタンスを選択し、[変更]をクリック。
![スクリーンショット 2023-03-08 22.23.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9eda5d89-5686-9e85-1302-91ee3e1a95ab.png)

DB エンジンバージョンには、8.0 の新しいバージョンを指定し、[続行]。
![スクリーンショット 2023-03-08 22.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/33c507d5-2e83-5d80-c23e-a18aa3462332.png)
![スクリーンショット 2023-03-08 22.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d5951795-b7e3-ac01-e373-fef4b24cf84a.png)

[DB インスタンスを変更]をクリック。
![スクリーンショット 2023-03-08 22.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a5a19aca-04b1-b06a-671a-3e415f73c9af.png)

結果を確認します。
![スクリーンショット 2023-03-08 22.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7126ebb9-7e1b-cfb6-9ad1-78b1467c6513.png)
イベントから、次の通り再起動がされるため、ダウンタイムが発生することがわかります。
![スクリーンショット 2023-03-08 22.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/dc3a827c-5a14-0559-38e0-20d43f06991d.png)

## リードレプリカを使用してダウンタイムを短縮してアップグレードする方法

MySQL 5.7 DB のリードレプリカを作成します。[アクション] で [リードレプリカを作成] を選択して作成します。※なお、リードレプリカを作成するには、「自動バックアップ」機能が有効になっている必要があります。これは、バックアップから復元してリードレプリカが作成されるからです。
![スクリーンショット 2023-03-10 18.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d183e16d-f4ce-55c9-312c-7cd0cdbdaea4.png)

リードレプリカが作成されたら MySQL 8.0 にアップグレードします。
※これは、「従来のアップグレード方法」と同様の手順です。

リードレプリカの MySQL 8.0 へのアップグレードが完了したら、リードレプリカがソース MySQL 5.7 の DBインスタンスと最新であることを確認します。

```sql
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
        Seconds_Behind_Source: 0
```

MySQL 8.0 にアップグレードしたばかりのリードレプリカを選択し、[アクション] で、[昇格] させます。
![スクリーンショット 2023-03-12 17.17.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ce3c3945-b694-a26a-b2f4-a19e4f5ae984.png)

これで、MySQL データベースのアップグレードバージョンが作成されたため、アプリケーションを新しい MySQL 8.0 DB インスタンスへ向き先を変更するだけです。
![スクリーンショット 2023-03-12 17.35.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/876c2654-4586-6e77-fbfe-f928d28b6c5e.png)


## ブルーグリーン

### ブルー/グリーンデプロイの作成

DB インスタンス（database-1）を選択し、「アクション」 で 「ブルー/グリーンデプロイの作成」 を選択します。
![スクリーンショット 2023-03-18 17.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cbe70f05-f19f-efa9-7d00-90ca5b84d79b.png)

「ブルーグリーン識別子」を入力し、今回はエンジンバージョンが、ブルー環境は「5.7.41」→ グリーン環境は「8.0.32」にしたいので、以下の通り設定します。
![スクリーンショット 2023-03-18 16.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e4ec262a-3d3c-13d1-ae5b-b8e98b80db7a.png)

### ブルー/グリーンデプロイの表示

database-1（Blue）と database-1-green(Green)が作成されました。
エンドポイントにおいても、それぞれ、Blue と Green のものが作成されているため、切り替え前に、Green に対してテストを行うことができます。
![スクリーンショット 2023-03-18 17.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e105d55e-2dc7-27c7-97e2-5c980491dddf.png)
ここで注目しておいてほしいのは「リソースID」です、後程切り替え後の状態も確認します。
![スクリーンショット 2023-03-18 17.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ff45db9f-28f2-28ed-5bf4-b8158e196399.png)

### ブルー/グリーンデプロイの切り替え

切り替えるブルー/グリーンデプロイを選択し、「アクション」から「切り替え」を選択します。
![スクリーンショット 2023-03-18 17.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b71d22c3-5bac-1187-15ac-f93e8aebdf79.png)

切り替えの内容を確認し、タイムアウトはデフォルトの 5 minutes のまま「切り替え」します。
![スクリーンショット 2023-03-18 17.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7c85f827-7d85-c2d5-cd1e-bd423e3695a9.png)

切り替え後の状態を確認してみます。 
Green
![スクリーンショット 2023-03-18 18.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/72666436-439c-684c-bb61-ca00b8216777.png)
![スクリーンショット 2023-03-18 17.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a8c75f04-a3a8-dec9-8c79-27fdea96673b.png)
Blue
![スクリーンショット 2023-03-18 18.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/79e10653-286f-f9d8-5bec-30b72341eb70.png)
![スクリーンショット 2023-03-18 17.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/217ad7e6-381d-5642-39c7-965bbcf9ff38.png)

- エンドポイント
Green のエンドポイントは、Blue のエンドポイントとなり、
Blue のエンドポイントは、`old*` が付与されたエンドポイントになったことがわかります。
- DB インスタンス ID
Green の DB インスタンス ID は、Blue の DB インスタンス ID となり、
Blue の DB インスタンス ID は、`old*` が付与された DB インスタンス ID になったことがわかります。
- リソース ID
Green のリソース ID は、Green、
Blue のリソース ID は、Blue のままです。

即ち、DB インスタンス ID は変更になりませんが、リソース ID は変更になるため、この点は注意が必要であり、事前に[ブルー/グリーンデプロイの考慮事項](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/blue-green-deployments-overview.html#blue-green-deployments-considerations)を確認した方が良さそうです。

# ブルーグリーンのついでに...

## 2024/11/20 追記

既存の RDS データベースインスタンスのストレージボリュームを縮小することはできません。
そのため、以前はボリュームサイズの小さい新しいデータベースインスタンスを手動で作成し、現在のデータベースから新しく作成したデータベースインスタンスにデータを手動で移行するなどの必要がありました。
下記のアップデートにより、ブルーグリーンで RDS データベースインスタンスのストレージボリュームを縮小して移行できるようになったので、ブルーグリーンで RDS インスタンスのメジャーバージョンのアップグレードをする場合はついでに検討してみてはいかがでしょうか。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/amazon-rds-blue-green-deployments-storage-volume-shrink/