MySQL DB エンジンのアップグレード - Amazon Relational Database Service

MySQL DB エンジンのアップグレード

新しいバージョンのデータベースエンジンが Amazon RDS でサポートされている場合は、DB インスタンスをその新しいバージョンにアップグレードできます。アップグレードには、メジャーバージョンのアップグレードとマイナーバージョンのアップグレードの 2 種類があります。一般的に、メジャーエンジンバージョンのアップグレードは、既存のアプリケーションと互換性のない変更を導入する場合があります。それに対して、マイナーバージョンのアップグレードには、既存のアプリケーションとの下位互換性がある変更のみが含まれます。

メジャーバージョンアップグレードを実行するためには、DB インスタンスを手動で変更します。DB インスタンスでマイナーバージョン自動アップグレードを有効にすると、マイナーバージョンアップグレードが自動的に行われます。それ以外の場合は、マイナーバージョンアップグレードを実行するよう DB インスタンスを手動で変更します。

アップグレードの概要

Amazon RDS によってアップグレードプロセス中に 2 つの DB スナップショットが作成されます。最初の DB スナップショットは、アップグレードの変更が行われる前の DB インスタンスから作成されます。アップグレードがデータベースに対して機能しない場合は、このスナップショットを復元して、以前のバージョンを実行する DB インスタンスを作成できます。アップグレードが完了すると、2 番目の DB スナップショットが作成されます。

注記

DB インスタンスのバックアップ保持期間を 0 より大きく設定した場合にのみ、Amazon RDS は DB スナップショットを作成します。バックアップ保持期間を変更するには、「Amazon RDS DB インスタンスを変更する」を参照してください。

アップグレードが完了したら、データベースエンジンの前のバージョンに戻すことはできません。前のバージョンに戻す必要がある場合は、作成された最初の DB スナップショットを復元して、新しい DB インスタンスを作成します。

Amazon RDS でサポートされている新しいバージョンに DB インスタンスをアップグレードするタイミングを制御します。このレベルの管理によって、特定のデータベースのバージョンとの互換性を維持しながら、新しいバージョンを本稼働環境にデプロイする前にアプリケーションに対してテストできます。準備が整ったら、自分のスケジュールに最適なタイミングでバージョンアップグレードを実行できます。

DB インスタンスでリードレプリカを使用している場合は、ソースのインスタンスをアップグレードする前にすべてのリードレプリカをアップグレードします。

DB インスタンスがマルチ AZ 配置にある場合は、プライマリとスタンバイの両方の DB インスタンスがアップグレードされます。プライマリとスタンバイの DB インスタンスは同時にアップグレードされ、アップグレードが完了するまで停止します。停止時間は、DB インスタンスのサイズによって異なります。

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

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

  • MySQL 5.5 から MySQL 5.6 へ

  • 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.5 DB インスタンスから MySQL バージョン 5.6 以降へのメジャーバージョンアップグレードを実行するには、まず OS の更新 (ある場合) を実行します。OS の更新が完了したら、それぞれのメジャーバージョン (5.5 から 5.6、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 値を確認します。

カスタムパラメータグループを使用する場合は、新しい DB エンジンバージョンで、デフォルトのパラメータグループを指定するか、独自のカスタムパラメータグループを作成します。新しいパラメータグループを DB インスタンスと関連付けるには、アップグレードの完了後に、顧客主導型のデータベースの再起動が必要となります。パラメータグループの変更を適用するために DB インスタンスを再起動する必要がある場合には、DB インスタンスのパラメータグループのステータスとして pending-reboot が表示されます。DB インスタンスのパラメータグループのステータスを確認するには、コンソール、またはコール (例: describe-db-instances) を使用します。

MySQL バージョン 5.7 へのアップグレードは遅くなる場合があります。

MySQL バージョン 5.6.4 では、datetimetimetimestamp 列で、日付と時刻の値に小数部を使用できる新しい日付と時刻の形式が導入されました。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 にアップグレードする前に、データベース内の datetimetime、および timestamp 列を変換することをお勧めします。この変換により MySQL バージョン 5.7 へのアップグレードに必要な時間を大幅に削減することができます。日付と時刻の列を新しい形式にアップグレードするために、ALTER TABLE <table_name> FORCE; コマンドを日付と時刻の列を含む各テーブルに実行します。テーブルを変更すると、テーブルが読み取り専用としてロックされるため、この更新はメンテナンス時間中に実行することをお勧めします。

datetimetime、または timestamp 列を含むすべてのテーブルをデータベース内で検索し、角テーブルに ALTER TABLE <table_name> FORCE; コマンドを作成するには、次のクエリを使用します。

SELECT DISTINCT CONCAT('ALTER TABLE `', REPLACE(is_tables.TABLE_SCHEMA, '`', '``'), '`.`', REPLACE(is_tables.TABLE_NAME, '`', '``'), '` FORCE;') FROM information_schema.TABLES is_tables INNER JOIN information_schema.COLUMNS col ON col.TABLE_SCHEMA = is_tables.TABLE_SCHEMA AND col.TABLE_NAME = is_tables.TABLE_NAME LEFT OUTER JOIN information_schema.INNODB_SYS_TABLES systables ON SUBSTRING_INDEX(systables.NAME, '#', 1) = CONCAT(is_tables.TABLE_SCHEMA,'/',is_tables.TABLE_NAME) LEFT OUTER JOIN information_schema.INNODB_SYS_COLUMNS syscolumns ON syscolumns.TABLE_ID = systables.TABLE_ID AND syscolumns.NAME = col.COLUMN_NAME WHERE col.COLUMN_TYPE IN ('time','timestamp','datetime') AND is_tables.TABLE_TYPE = 'BASE TABLE' AND is_tables.TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema') AND (is_tables.ENGINE = 'InnoDB' AND syscolumns.MTYPE = 6);

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 テーブルスペースに存在するテーブルパーティションがあってはいけません。

  • GROUP BY 句に ASC または DESC 修飾子を使用する、MySQL 8.0.12 以前のクエリおよびストアドプログラム定義があってはなりません。

  • MySQL 8.0でサポートされていない機能を MySQL 5.7 のインストールで使用することはできません。

    詳細については、MySQL ドキュメントの「MySQL 8.0 で削除された機能」を参照してください。

  • 64 文字を超える外部キーの制約名があってはいけません。

  • Unicode サポートが向上するように、utf8mb4 文字セットを使用するように、utf8mb3 文字セットを使用するオブジェクトを変換することを検討してください。utf8mb3 文字セットは廃止されました。また、utf8 の代わりに utf8mb4 を文字セット参照に使用することを検討してください。現在 utf8utf8mb3 文字セットの別名であるためです。

    詳細については、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 8.0 より前のリリースへのアップグレードには実行されません。たとえば、MySQL 5.6 から MySQL 5.7 へのアップグレードでは事前チェックは実行されません。

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

DB インスタンスでメジャーバージョンアップグレードを実行する前に、新しいバージョンとの互換性についてデータベースを徹底的にテストしてください。また、データベースにアクセスするすべてのアプリケーションの新しいバージョンとの互換性についても徹底的にテストします。以下の手順を実行することをお勧めします。

メジャーバージョンのアップグレードをテストするには

  1. データベースエンジンの新しいバージョンについてアップグレードドキュメントを参照して、データベースやアプリケーションに影響を与える可能性のある互換性の問題があるかどうかを確認します。

  2. DB インスタンスがカスタム DB パラメータグループに関連付けられている場合は、新しいメジャーバージョンと互換性のある既存の設定で新しい DB パラメータグループを作成します。その新しい DB パラメータグループをテストインスタンスのアップグレード時に指定することで、アップグレードのテストでインスタンスが正常に機能することを確認できます。DB パラメータグループの作成の詳細については、「DB パラメータグループを使用する」を参照してください。

  3. アップグレードする DB インスタンスの DB スナップショットを作成します。詳細については、「DB スナップショットの作成」を参照してください。

  4. DB スナップショットを復元して、新しいテスト DB インスタンスを作成します。詳細については、「DB スナップショットの復元」を参照してください。

  5. この新しいテスト DB インスタンスを変更して新しいバージョンにアップグレードするには、次に説明するいずれかの方法を使用します。手順 2 で新しいパラメータグループを作成した場合は、そのパラメータグループを指定します。

  6. アップグレードしたインスタンスによって使用されるストレージを評価して、アップグレードに追加のストレージが必要かどうかを判断します。

  7. データベースとアプリケーションが新しいバージョンで正常に動作することが確認されるまで、アップグレードした DB インスタンスに対する品質保証テストを必要な回数だけ実行します。手順 1 で特定した互換性の問題の影響を評価するための新しいテストを実行します。すべてのストアドプロシージャと関数をテストします。アプリケーションのテストバージョンを、アップグレードした DB インスタンスに割り振ります。

  8. すべてのテストに合格したら、本稼働 DB インスタンスのアップグレードを実行します。すべてが正常に動作していることを確認するまでは、DB インスタンスへの書き込みオペレーションは許可しないことをお勧めします。

MySQL DB インスタンスをアップグレードする

MySQL DB インスタンスの手動または自動アップグレードについては、「DB インスタンス のエンジンバージョンのアップグレード」を参照してください。

わずかなダウンタイムでの MySQL データベースのアップグレード

MySQL DB インスタンスが現在本稼働アプリケーションで使用されている場合は、次の手順を使用して DB インスタンスのデータベースバージョンをアップグレードできます。この手順により、アプリケーションの停止時間を短縮できます。

次の手順は、MySQL バージョン 5.5 から MySQL バージョン 5.6 へのアップグレードの例を示します。他のメジャーバージョンへのアップグレードに、この同じ一般的なステップを使用できます。

DB インスタンスの使用中に MySQL データベースをアップグレードするには

  1. AWS マネジメントコンソールにサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. MySQL 5.5 DB インスタンスのリードレプリカを作成します。このプロセスにより、データベースのアップグレード可能なコピーが作成されます。

    1. コンソールで、[Databases (データベース)] を選択し、アップグレードする DB インスタンスを選択します。

    2. [アクション] で [リードレプリカの作成] を選択します。

    3. リードレプリカの [DB インスタンス識別子] の値を指定し、[DB インスタンスのクラス] などの設定がご使用の MySQL 5.5 DB インスタンスのものと一致していることを確認します。

    4. [Create read replica] を選択します。

  3. リードレプリカが作成され、[ステータス] に [利用可能] と表示されたら、リードレプリカを MySQL 5.6 にアップグレードします。

    1. コンソールで [データベース] を選択し、作成したリードレプリカを選択します。

    2. [Modify] を選択します。

    3. [DB engine version] では、アップグレードする MySQL 5.6 のバージョンを選択し、[Continue] を選択します。

    4. [Scheduling of Modifications] で、[Apply immediately] を選択します。

    5. [Modify DB instance] を選択してアップグレードを開始します。

  4. アップグレードが完了し、[ステータス] に [利用可能] と表示されたら、アップグレードしたリードレプリカがマスターの MySQL 5.5 DB インスタンスで最新であることを確認します。そのためには、リードレプリカに接続し、SHOW SLAVE STATUS コマンドを発行します。Seconds_Behind_Master フィールドが 0 である場合、レプリカは更新されています。

  5. MySQL 5.6 リードレプリカをマスター DB インスタンスにします。

    重要

    MySQL 5.6 のリードレプリカをスタンドアロンの single-AZ DB インスタンスに昇格させると、MySQL 5.5 DB インスタンスのレプリケーションのレプリカではなくなります。MySQL 5.6 のリードレプリカの昇格は、ソースの MySQL 5.5 DB インスタンスが読み取り専用モードですべての書き込みオペレーションが停止されているメンテナンスウィンドウ中に行うことをお勧めします。昇格が完了したら、アップグレードした MySQL 5.6 DB インスタンスに書き込み操作を割り振ることで、書き込み操作が失われないようにします。

    また、MySQL 5.6 のリードレプリカの昇格前に、必要なすべてのデータ定義言語 (DDL) のオペレーションを MySQL 5.6 のリードレプリカで実行することをお勧めします。たとえば、インデックスの作成があります。これにより、昇格後の MySQL 5.6 のリードレプリカのパフォーマンスへの悪影響を避けることができます。リードレプリカを昇格させるには、次の手順に従います。

    1. コンソールで [データベース] を選択し、アップグレードしたリードレプリカを選択します。

    2. [アクション] で、[Promote (昇格)] を選択します。

    3. [はい] を選択して、リードレプリカインスタンスの自動バックアップを有効にします。詳細については、「バックアップの使用」を参照してください。

    4. [Continue] を選択します。

    5. [Promote Read Replica] を選択します。

  6. これで、MySQL データベースのアップグレードバージョンが作成されました。この時点で、新しい MySQL 5.6 DB インスタンスへのアプリケーションの割り振り、リードレプリカの追加、マルチ AZ サポートの設定などが可能になります。