RDS for MySQL のメジャーバージョンのアップグレード
Amazon RDS では現在、MySQL データベースエンジンで以下のインプレースのメジャーバージョンのアップグレードがサポートされています。
MySQL 5.6 から MySQL 5.7 へ
MySQL 5.7 から MySQL 8.0 へ
注記
最新世代の DB インスタンスクラスと現行世代の DB インスタンスクラスでは、前世代 (db.m3) の DB インスタンスクラスに加えて、MySQL バージョン 5.7 および 8.0 DB インスタンスのみ作成できます。
場合によっては、旧世代の DB インスタンスクラス (db.m3 以外) で実行されている MySQL バージョン 5.6 DB インスタンスを MySQL バージョン 5.7 DB インスタンスにアップグレードする必要があります。このような場合は、まず最新世代または現行世代の DB インスタンスクラスを使用するように DB インスタンスを変更します。変更したら、MySQL バージョン 5.7 データベースエンジンを使用するように DB インスタンスを変更できます。Amazon RDS DB インスタンスクラスについては、「 DB インスタンスクラス」を参照してください。
トピック
MySQL のメジャーバージョンのアップグレードの概要
メジャーバージョンのアップグレードには、既存のアプリケーションとの下位互換性のないデータベースの変更が含まれる場合があります。そのため、メジャーバージョンのアップグレードは自動的に Amazon RDS に適用されません。手動で DB インスタンスを変更する必要があります。本稼働インスタンスへの適用前に、いずれのアップグレードも徹底的にテストすることをお勧めします。
Amazon RDS の MySQL バージョン 5.6 DB インスタンスから MySQL バージョン 5.7 以降へのメジャーバージョンアップグレードを実行するには、まず OS の更新 (ある場合) を実行します。OS の更新が完了したら、それぞれのメジャーバージョン (5.6 から 5.7、5.7 から 8.0) にアップグレードします。2014 年 4 月 24 日以前に作成された MySQL DB は、更新が適用されるまで使用可能な OS の更新を表示します。OS 更新の詳細については、「DB インスタンスのアップデートを適用する」を参照してください。
MySQL のメジャーバージョンアップグレード中、必要に応じて Amazon RDS によって MySQL バイナリ mysql_upgrade
が実行され、テーブルがアップグレードされます。また、メジャーバージョンアップグレード中に Amazon RDS によって slow_log
および general_log
テーブルが空にされます。ログ情報を保持するには、メジャーバージョンアップグレードの前にログファイルの内容を保存します。
MySQL のメジャーバージョンアップグレードは、通常約 10 分で完了します。一部のアップグレードでは、DB インスタンスクラスのサイズのため、またはインスタンスが「Amazon RDS のベストプラクティス」の運用ガイドラインに従っていないため、この時間が長くなることがあります。Amazon RDS コンソールから DB インスタンスをアップグレードする場合、アップグレードが完了すると、DB インスタンスのステータスが表示されます。AWS Command Line Interface (AWS CLI) を使用してアップグレードする場合は、describe-db-instances コマンドを使用し、Status
値を確認します。
MySQL バージョン 5.7 へのアップグレードは遅くなる場合がある
MySQL バージョン 5.6.4 では、datetime
、time
、timestamp
列で、日付と時刻の値に小数部を使用できる新しい日付と時刻の形式が導入されました。DB インスタンスを MySQL バージョン 5.7 にアップグレードすると、MySQL はすべての日付と時刻の列のタイプを新しい形式に強制的に変換します。
この変換はテーブルを再作成するため、DB インスタンスのアップグレードを完了するのにかなりの時間がかかる場合があります。この変換は、MySQL バージョン 5.6.4 より前のバージョンを実行しているすべての DB インスタンスに対して行われます。また、MySQL バージョン 5.6.4 より前のバージョンから 5.7 以外のバージョンにアップグレードされたすべての DB インスタンスでも行われます。
DB インスタンスが MySQL バージョン 5.6.4 より前のバージョンを実行している場合、または 5.6.4 より前のバージョンからアップグレードされている場合は、追加のステップを行うことをお勧めします。このような場合は、DB インスタンスを MySQL バージョン 5.7 にアップグレードする前に、データベース内の datetime
、time
、および timestamp
列を変換することをお勧めします。この変換により MySQL バージョン 5.7 へのアップグレードに必要な時間を大幅に削減することができます。日付と時刻の列を新しい形式にアップグレードするために、ALTER TABLE
コマンドを日付と時刻の列を含む各テーブルに実行します。テーブルを変更すると、テーブルが読み取り専用としてロックされるため、この更新はメンテナンス時間中に実行することをお勧めします。<table_name>
FORCE;
datetime
、time
、または timestamp
列を含むすべてのテーブルをデータベース内で検索し、角テーブルに ALTER
TABLE
コマンドを作成するには、次のクエリを使用します。<table_name>
FORCE;
SET show_old_temporals = ON; SELECT table_schema, table_name,column_name, column_type FROM information_schema.columns WHERE column_type LIKE '%/* 5.5 binary format */'; SET show_old_temporals = OFF;
MySQL 5.7 から 8.0 へのアップグレードの事前確認
MySQL 8.0 には MySQL 5.7 との非互換性がいくつかあります。このような非互換性が原因で MySQL 5.7 から MySQL 8.0 へのアップグレード中に問題が生じる可能性があります。そのため、アップグレードを成功させるには、データベースで何らかの準備が必要になる場合があります。このような非互換性の一般的なリストを以下に示します。
-
テーブルで古いデータ型や関数を使用してはいけません。
-
孤立した *.frm ファイルがあってはいけません。
-
トリガーの definer が欠落しているか、空である、またはトリガーに無効な作成コンテキストが含まれていてはいけません。
-
ネイティブのパーティショニングをサポートしていないストレージエンジンを使用するパーティショニングされたテーブルがあってはいけません。
-
キーワードや予約語に違反してはいけません。MySQL 8.0 では、以前に予約されていなかったキーワードもあります。
詳細については、MySQL ドキュメントの「キーワードと予約語
」を参照してください。 -
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 で削除された機能
」を参照してください。 -
64 文字を超える外部キーの制約名があってはいけません。
-
Unicode サポートの改善のため、
utf8mb3
文字セットを使用するオブジェクトを、utf8mb4
文字セットを使用するように変換することを検討してください。utf8mb3
文字セットは廃止されました。また、utf8mb4
の代わりにutf8
を文字セット参照に使用することを検討してください。現在utf8
はutf8mb3
文字セットの別名であるためです。詳細については、MySQL ドキュメントの「utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコード)
」を参照してください。
MySQL 5.7 から 8.0 へのアップグレードをスタートすると、Amazon RDS では、これらの非互換性を検出するために自動的に事前チェックが実行されます。MySQL 8.0 へのアップグレードについては、MySQL ドキュメントの「MySQL のアップグレード
これらの事前確認は必須です。スキップすることはできません。事前チェックには次の利点があります。
-
アップグレード中の計画外のダウンタイムを回避することができます。
-
非互換性がある場合、Amazon RDS でアップグレードすることはできません。詳細を示すログが出力されます。ログを使用して、非互換性を排除することにより、データベースを MySQL 8.0 にアップグレードする準備を行うことができます。非互換性の排除の詳細については、MySQL ドキュメントの「アップグレードのためのインストールの準備
」と「MySQL 8.0? へのアップグレード」を参照してください。MySQL Server ブログの「知っておくべきこと 」を参照してください。
事前チェックには、MySQL に含まれている証明書と Amazon RDS チーム用によって特別に作成された証明書が含まれます。MySQL が提供する事前確認については、Upgrade Checker Utility
DB インスタンスがアップグレードで停止される前に事前チェックが実行されます。つまり、実行時にダウンタイムが発生することはありません。事前チェックで非互換性が見つかった場合、DB インスタンスが停止する前に、Amazon RDS により自動的にアップグレードがキャンセルされます。Amazon RDS では、非互換性のためのイベントも生成されます。Amazon RDS イベントの詳細については、「Amazon RDS イベント通知の操作」を参照してください。
Amazon RDS は、ログファイル PrePatchCompatibility.log
に各非互換性に関する詳細情報を記録します。ほとんどの場合、ログエントリには非互換性を修正するための MySQL のドキュメントへのリンクが含まれています。ログの表示の詳細については、「データベースログファイルの表示とリスト化」を参照してください。
事前チェックの性質上、データベース内のオブジェクトが分析されます。この分析によりリソースが消費され、アップグレードが完了するまでの時間が長くなります。
注記
Amazon RDS では MySQL 5.7 から MySQL 8.0 へのアップグレードに対してのみ、これらのすべての事前チェックを実行します。MySQL 5.6 から MySQL 5.7 へのアップグレードでは、事前チェックは、孤立したテーブルがないこと、およびテーブルを再構築するのに十分なストレージ領域があることを確認することに限られます。MySQL 5.7 よりも前のリリースへのアップグレードでは、事前チェックは実行されません。
MySQL 5.7 から 8.0 へのアップグレードに失敗した後のロールバック
DB インスタンスを MySQL バージョン 5.7 から MySQL バージョン 8.0 にアップグレードすると、アップグレードが失敗することがあります。特に、事前チェックでキャプチャされなかった非互換性がデータディクショナリに含まれていると、失敗する可能性があります。この場合、データベースは新しい MySQL 8.0 バージョンで正常に起動できません。この時点で、Amazon RDS は、アップグレードに対して実行された変更をロールバックします。ロールバック後、MySQL DB インスタンスは MySQL バージョン 5.7 を実行しています。アップグレードが失敗してロールバックされると、Amazon RDS は、イベント ID RDS-EVENT-0188 のイベントを生成します。
通常、DB インスタンス内のデータベースとターゲットの MySQL バージョン間のメタデータに非互換性があるため、アップグレードは失敗します。アップグレードが失敗した場合、upgradeFailure.log
ファイルでこのような互換性に関する詳細を確認できます。アップグレードを再試行する前に、非互換性を解決してください。
アップグレードの試行とロールバックが失敗すると、DB インスタンスが再起動されます。保留中のパラメータの変更は、再起動時に適用され、ロールバック後も保持されます。
MySQL 8.0 へのアップグレードの詳細については、MySQL ドキュメントの次のトピックを参照してください。
注記
現在、アップグレード失敗後の自動ロールバックは、MySQL 5.7 から 8.0 へのメジャーバージョンアップグレードでのみサポートされています。