

# RDS for MySQL のメジャーバージョンのアップグレード
<a name="USER_UpgradeDBInstance.MySQL.Major"></a>

Amazon RDS では現在、MySQL データベースエンジンで以下のインプレースのメジャーバージョンのアップグレードがサポートされています。
+ MySQL 5.7 から MySQL 8.0 へ
+ MySQL 8.0 から MySQL 8.4 へ

**注記**  
最新世代の DB インスタンスクラスと現行世代の DB インスタンスクラスでは、MySQL バージョン 5.7、8.0、および 8.4 の DB インスタンスのみ作成できます。  
場合によっては、旧世代の DB インスタンスクラスで実行されている DB インスタンスを、それ以降のバージョンの MySQL エンジンを使用した DB インスタンスにアップグレードする必要があります。このような場合は、まず最新世代または現行世代の DB インスタンスクラスを使用するように DB インスタンスを変更します。変更したら、上位バージョンの MySQL データベースエンジンを使用するように DB インスタンスを変更してください。Amazon RDS DB インスタンスクラスについては、「[ DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。

**Topics**
+ [

## MySQL のメジャーバージョンのアップグレードの概要
](#USER_UpgradeDBInstance.MySQL.Major.Overview)
+ [

## アップグレードの事前チェック
](#USER_UpgradeDBInstance.MySQL.Prechecks)
+ [

## アップグレードに失敗した後のロールバック
](#USER_UpgradeDBInstance.MySQL.Major.RollbackAfterFailure)

## MySQL のメジャーバージョンのアップグレードの概要
<a name="USER_UpgradeDBInstance.MySQL.Major.Overview"></a>

メジャーバージョンのアップグレードには、既存のアプリケーションとの下位互換性のないデータベースの変更が含まれる場合があります。そのため、メジャーバージョンのアップグレードは自動的に Amazon RDS に適用されません。手動で DB インスタンスを変更する必要があります。本稼働インスタンスへの適用前に、いずれのアップグレードも徹底的にテストすることをお勧めします。

メジャーバージョンアップグレードを実行するには、最初に OS アップデートを実行します。OS のアップデートが完了したら、それぞれのメジャーバージョン (例えば 5.7 から 8.0、8.0 から 8.4 など) にアップグレードします。RDS for MySQL マルチ AZ DB クラスターのアップグレードについては、「[Amazon RDS のマルチ AZ DB クラスターのエンジンバージョンのアップグレード](multi-az-db-clusters-upgrading.md)」を参照してください。2014 年 4 月 24 日以前に作成された MySQL DB は、更新が適用されるまで使用可能な OS の更新を表示します。OS 更新の詳細については、「[DB インスタンスへの更新の適用](USER_UpgradeDBInstance.Maintenance.md#USER_UpgradeDBInstance.OSUpgrades)」を参照してください。

MySQL のメジャーバージョンアップグレード中、必要に応じて Amazon RDS によって MySQL バイナリ `mysql_upgrade` が実行され、テーブルがアップグレードされます。また、メジャーバージョンアップグレード中に Amazon RDS によって `slow_log` および `general_log` テーブルが空にされます。ログ情報を保持するには、メジャーバージョンアップグレードの前にログファイルの内容を保存します。

MySQL のメジャーバージョンアップグレードは、通常約 10 分で完了します。一部のアップグレードでは、DB インスタンスクラスのサイズのため、またはインスタンスが「[Amazon RDS のベストプラクティス](CHAP_BestPractices.md)」の運用ガイドラインに従っていないため、この時間が長くなることがあります。Amazon RDS コンソールから DB インスタンスをアップグレードする場合、アップグレードが完了すると、DB インスタンスのステータスが表示されます。AWS Command Line Interface (AWS CLI) を使用してアップグレードする場合は、[describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) コマンドを使用し、`Status` 値を確認します。

## アップグレードの事前チェック
<a name="USER_UpgradeDBInstance.MySQL.Prechecks"></a>

Amazon RDS は、アップグレード前に事前チェックを実行して非互換性を確認します。これらの非互換性は、アップグレード先の MySQL バージョンによって異なります。

事前チェックには、MySQL に含まれている証明書と Amazon RDS チーム用によって特別に作成された証明書が含まれます。MySQL が提供する事前確認については、[Upgrade Checker Utility](https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-shell-utilities-upgrade.html)」を参照してください。

DB インスタンスがアップグレードで停止される前に事前チェックが実行されます。つまり、実行時にダウンタイムが発生することはありません。事前チェックで非互換性が見つかった場合、DB インスタンスが停止する前に、Amazon RDS により自動的にアップグレードがキャンセルされます。Amazon RDS では、非互換性のためのイベントも生成されます。Amazon RDS イベントの詳細については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。

Amazon RDS は、ログファイル `PrePatchCompatibility.log` に各非互換性に関する詳細情報を記録します。ほとんどの場合、ログエントリには非互換性を修正するための MySQL のドキュメントへのリンクが含まれています。ログの表示の詳細については、「[データベースログファイルの表示とリスト化](USER_LogAccess.Procedural.Viewing.md)」を参照してください。

事前チェックの性質上、データベース内のオブジェクトが分析されます。この分析によりリソースが消費され、アップグレードが完了するまでの時間が長くなります。

**Topics**
+ [

### MySQL 8.0 から 8.4 へのアップグレードの事前確認
](#USER_UpgradeDBInstance.MySQL.80to84Prechecks)
+ [

### MySQL 5.7 から 8.0 へのアップグレードの事前確認
](#USER_UpgradeDBInstance.MySQL.57to80Prechecks)

### MySQL 8.0 から 8.4 へのアップグレードの事前確認
<a name="USER_UpgradeDBInstance.MySQL.80to84Prechecks"></a>

MySQL 8.4 には MySQL 8.0 との非互換性がいくつかあります。このような非互換性が原因で MySQL 8.0 から MySQL 8.4 へのアップグレード中に問題が生じる可能性があります。そのため、アップグレードを成功させるには、データベースで何らかの準備が必要になる場合があります。このような非互換性の一般的なリストを以下に示します。
+ テーブルで古いデータ型や関数を使用してはいけません。
+ トリガーの definer が欠落しているか、空である、またはトリガーに無効な作成コンテキストが含まれていてはいけません。
+ キーワードや予約語に違反してはいけません。MySQL 8.4 では、以前に予約されていなかったキーワードもあります。

  詳細については、MySQL ドキュメントの「[キーワードと予約語](https://dev.mysql.com/doc/refman/8.4/en/keywords.html)」を参照してください。
+ MySQL 8.0 の `mysql` システムデータベースに、MySQL 8.4 データディクショナリで使用されるテーブルと同じ名前のテーブルがあってはいけません。
+ `sql_mode` システム可変設定で、古い SQL モードを定義してはいけません。
+ 長さが 255 文字または 1,020 バイトを超える `ENUM` または `SET` 列要素をそれぞれ持つテーブルまたはストアドプロシージャがあってはいけません。
+ MySQL 8.4 でサポートされていない機能を MySQL 8.0 のインストールで使用することはできません。

  詳細については、MySQL ドキュメントの「[MySQL 8.4 で削除された機能](https://dev.mysql.com/doc/refman/8.4/en/mysql-nutshell.html#mysql-nutshell-removals)」を参照してください。
+ 64 文字を超える外部キーの制約名があってはいけません。
+ Unicode サポートを改善するには、次の情報を確認してください。
  + `utf8mb3` 文字セットを使用するオブジェクトを、`utf8mb4` 文字セットを使用するように変換することを検討してください。`utf8mb3` 文字セットは廃止されました。
  + 文字セット参照に `utf8mb4` を `utf8` の代わりに使用することを検討してください。現在 `utf8` は `utf8mb3` 文字セットの別名であるためです。可能であれば、まず `utf8` を `utf8mb4` に変更してから、データベースをアップグレードします。
  + 古いクライアントは `utf8mb3` に対して不明な文字セットエラーを受け取る可能性があるため、データベースをアップグレードする前にデータベースクライアントをアップグレードしてください。

  詳細については、MySQL ドキュメントの「[utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコード)](https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-utf8mb3.html)」を参照してください。

  文字セットを変更するには、データベースのバックアップ、復元、レプリケーションを手動で実行できます。または、Amazon RDS のブルー/グリーンデプロイを使用できます。詳細については、「[データベース更新のために Amazon RDS ブルー/グリーンデプロイを使用する](blue-green-deployments.md)」を参照してください。

MySQL 8.0 から 8.4 へのアップグレードをスタートすると、Amazon RDS では、これらの非互換性を検出するために自動的に事前チェックが実行されます。MySQL 8.4 へのアップグレードについては、MySQL ドキュメントの「[MySQL のアップグレード](https://dev.mysql.com/doc/refman/8.4/en/upgrading.html)」を参照してください。

これらの事前確認は必須です。スキップすることはできません。事前チェックには次の利点があります。
+ アップグレード中の計画外のダウンタイムを回避することができます。
+ 非互換性がある場合、Amazon RDS でアップグレードすることはできません。詳細を示すログが出力されます。ログを使用して、非互換性を排除することにより、データベースを MySQL 8.4 にアップグレードする準備を行うことができます。非互換性の排除の詳細については、MySQL ドキュメントの「[アップグレードのためのインストールの準備](https://dev.mysql.com/doc/refman/8.4/en/upgrade-prerequisites.html)」を参照してください。

### MySQL 5.7 から 8.0 へのアップグレードの事前確認
<a name="USER_UpgradeDBInstance.MySQL.57to80Prechecks"></a>

MySQL 8.0 には MySQL 5.7 との非互換性がいくつかあります。このような非互換性が原因で MySQL 5.7 から MySQL 8.0 へのアップグレード中に問題が生じる可能性があります。そのため、アップグレードを成功させるには、データベースで何らかの準備が必要になる場合があります。このような非互換性の一般的なリストを以下に示します。
+ テーブルで古いデータ型や関数を使用してはいけません。
+ 孤立した \$1.frm ファイルがあってはいけません。
+ トリガーの definer が欠落しているか、空である、またはトリガーに無効な作成コンテキストが含まれていてはいけません。
+ ネイティブのパーティショニングをサポートしていないストレージエンジンを使用するパーティショニングされたテーブルがあってはいけません。
+ キーワードや予約語に違反してはいけません。MySQL 8.0 では、以前に予約されていなかったキーワードもあります。

  詳細については、MySQL ドキュメントの「[キーワードと予約語](https://dev.mysql.com/doc/refman/8.0/en/keywords.html)」を参照してください。
+ MySQL 5.7 の `mysql` システムデータベースに、MySQL 8.0 データディクショナリで使用されるテーブルと同じ名前のテーブルがあってはいけません。
+ `sql_mode` システム可変設定で、古い SQL モードを定義してはいけません。
+ 長さが 255 文字または 1,020 バイトを超える `ENUM` または `SET` 列要素をそれぞれ持つテーブルまたはストアドプロシージャがあってはいけません。
+ MySQL 8.0.13 以降にアップグレードする前に、共有 InnoDB テーブルスペースに存在するテーブルパーティションがあってはいけません。
+ `ASC` 句に `DESC` または `GROUP BY` 修飾子を使用する、MySQL 8.0.12 以前のクエリおよびストアドプログラム定義があってはなりません。
+ MySQL 8.0でサポートされていない機能を MySQL 5.7 のインストールで使用することはできません。

  詳細については、MySQL ドキュメントの「[MySQL 8.0 で削除された機能](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals)」を参照してください。
+ 64 文字を超える外部キーの制約名があってはいけません。
+ Unicode サポートを改善するには、次の情報を確認してください。
  + `utf8mb3` 文字セットを使用するオブジェクトを、`utf8mb4` 文字セットを使用するように変換することを検討してください。`utf8mb3` 文字セットは廃止されました。
  + 文字セット参照に `utf8mb4` を `utf8` の代わりに使用することを検討してください。現在 `utf8` は `utf8mb3` 文字セットの別名であるためです。可能であれば、まず `utf8` を `utf8mb4` に変更してから、データベースをアップグレードします。
  + 古いクライアントは `utf8mb3` に対して不明な文字セットエラーを受け取る可能性があるため、データベースをアップグレードする前にデータベースクライアントをアップグレードしてください。

  詳細については、MySQL ドキュメントの「[utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコード)](https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-utf8mb3.html)」を参照してください。

  文字セットを変更するには、データベースのバックアップ、復元、レプリケーションを手動で実行できます。または、Amazon RDS のブルー/グリーンデプロイを使用できます。詳細については、「[データベース更新のために Amazon RDS ブルー/グリーンデプロイを使用する](blue-green-deployments.md)」を参照してください。

MySQL 5.7 から 8.0 へのアップグレードをスタートすると、Amazon RDS では、これらの非互換性を検出するために自動的に事前チェックが実行されます。MySQL 8.0 へのアップグレードについては、MySQL ドキュメントの「[MySQL のアップグレード](https://dev.mysql.com/doc/refman/8.0/en/upgrading.html)」を参照してください。

これらの事前確認は必須です。スキップすることはできません。事前チェックには次の利点があります。
+ アップグレード中の計画外のダウンタイムを回避することができます。
+ 非互換性がある場合、Amazon RDS でアップグレードすることはできません。詳細を示すログが出力されます。ログを使用して、非互換性を排除することにより、データベースを MySQL 8.0 にアップグレードする準備を行うことができます。非互換性の排除の詳細については、MySQL ドキュメントの「[アップグレードのためのインストールの準備](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)」と「[MySQL 8.0? へのアップグレード」を参照してください。MySQL Server ブログの「知っておくべきこと](https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/)」を参照してください。

## アップグレードに失敗した後のロールバック
<a name="USER_UpgradeDBInstance.MySQL.Major.RollbackAfterFailure"></a>

DB インスタンスを MySQL バージョン 5.7 から MySQL バージョン 8.0、または MySQL バージョン 8.0 から 8.4 にアップグレードすると、アップグレードが失敗することがあります。特に、事前チェックでキャプチャされなかった非互換性がデータディクショナリに含まれていると、失敗する可能性があります。この場合、データベースは新しい MySQL 8.0 または 8.4 バージョンで正常に起動できません。この時点で、Amazon RDS は、アップグレードに対して実行された変更をロールバックします。ロールバック後、MySQL DB インスタンスは元のバージョンを実行しています。
+ MySQL バージョン 8.0 (MySQL 8.4 からロールバックする場合)
+ MySQL バージョン 5.7 (MySQL 8.0 からロールバックする場合)

アップグレードが失敗してロールバックされると、Amazon RDS は、イベント ID RDS-EVENT-0188 のイベントを生成します。

通常、DB インスタンス内のデータベースとターゲットの MySQL バージョン間のメタデータに非互換性があるため、アップグレードは失敗します。アップグレードが失敗した場合、`upgradeFailure.log` ファイルでこのような互換性に関する詳細を確認できます。アップグレードを再試行する前に、非互換性を解決してください。

アップグレードの試行とロールバックが失敗すると、DB インスタンスが再起動されます。保留中のパラメータの変更は、再起動時に適用され、ロールバック後も保持されます。

MySQL 8.0 へのアップグレードの詳細については、MySQL ドキュメントの次のトピックを参照してください。
+ [アップグレードのためのインストールの準備](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)
+ [ MySQL 8.0 にアップグレードしますか? こちらをお読みください.](https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/).。

MySQL 8.4 へのアップグレードの詳細については、MySQL ドキュメントの「[アップグレードのためのインストールの準備](https://dev.mysql.com/doc/refman/8.4/en/upgrade-prerequisites.html)」を参照してください。