はじめに

初めまして、MSPチームのまっちゃんこと松﨑です。
以後、まっちゃんでお見知り置きを。

AWSから「RDS for MySQLのアップグレードが必要です」という通知が来ましたね。
現在対応をしている中で、エラーに直面していて、何をしたらいいか分からず困っていませんか?
本記事では、私が実際にRDS for MySQL 5.7から8.0へアップグレードした際の手順やエラーと解決方法をご紹介します。
この記事が、皆さんのアップグレード作業の一助となれば幸いです。

AWSからのアップグレード通知と概要

AWSより2024年12月30日頃にAWS_RDS_PLANNED_LIFECYCLE_EVENTの案内が来たかと思います。

AWSからの通知内容
本通知は、Amazon RDS for MySQL のマイナーバージョン 8.0.36、8.0.35、8.0.34、8.0.33、または 8.0.32 を実行しているインスタンスを 1 つ以上お持ちで、ご注意が必要なお客様へお送りしております。Amazon RDS for MySQL マイナーバージョン 8.0.36、8.0.35、8.0.34、8.0.33、8.0.32 は 2025 年 3 月 31 日に標準サポートが終了する予定です。メジャーバージョンとマイナーバージョンのサポートに関連する RDS ポリシーの詳細については、RDS FAQ [1] の「データベースエンジンのバージョン」セクションを参照してください。
2025 年 2 月 28 日午前 00 時 01 分 (太平洋標準時) 以降、AWS コンソールまたは CLI から Amazon RDS for MySQL マイナーバージョン 8.0.36、8.0.35、8.0.34、8.0.33、または 8.0.32 の新しいデータベースインスタンスを作成できなくなります。Amazon RDS は、マイナーバージョン 8.0.36、8.0.35、8.0.34、8.0.33、8.0.32 を実行している Amazon RDS for MySQL データベースと、これらのバージョンのスナップショットから復元されたすべてのインスタンスを、2025 年 3 月 31 日午前 00 時 01 分 (太平洋夏時間) から 2025 年 4 月 30 日午前 00 時 01 分 (太平洋夏時間) までのインスタンスのメンテナンスウィンドウ中に 8.0.40 以上に自動的にアップグレードします。2025 年 4 月 30 日午前 00 時 01 分 (太平洋夏時間) に、マイナーバージョン 8.0.36、8.0.35、8.0.34、8.0.33、8.0.32 を実行している Amazon RDS for MySQL データベースは、インスタンスのメンテナンスウィンドウに関係なく、8.0.40 以上にアップグレードされます。
マイナーバージョン 8.0.36、8.0.35、8.0.34、8.0.33、8.0.32 を実行している Amazon RDS for MySQL データベースを、2025 年 3 月 31 日までに 8.0.40 以上にアップグレードすることをお勧めします。または、マイナーバージョン自動アップグレード [2] を有効にして、Amazon RDS がインスタンスをアップグレードできるようにすることもできます。
これは必須のエンジンバージョンアップグレードであり、ダウンタイムが発生します。アップグレード中のダウンタイムを最小限に抑えるには、フルマネージドの Amazon RDS Blue/Green デプロイメントサービス [3] を使用できます。
マイナーバージョン 8.0.36、8.0.35、8.0.34、8.0.33、および 8.0.32 を実行している Amazon RDS for MySQL インスタンスは、「影響を受けるリソース」タブに一覧表示されます。
RDS for MySQL の各バージョンの標準サポート終了日の詳細と、今後のアップグレードに向けた積極的な計画については、AWS ドキュメントの MySQL on Amazon RDS バージョンページ [4] で参照できます。
質問や懸念がある場合は、AWS re:Post [5] および AWS サポート [6] から利用できるサポートチームにお問い合わせください。
[1] https://aws.amazon.com/rds/faqs/#Database_Engine_Versions
[2] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Upgrading.html#USER_UpgradeDBInstance.Upgrading.AutoMinorVersionUpgrades
[3] https://aws.amazon.com/blogs/aws/new-fully-managed-blue-green-deployments-in-amazon-aurora-and-amazon-rds/
[4] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Concepts.VersionMgmt.html
[5] https://repost.aws
[6] https://aws.amazon.com/support

概要は以下の「Amazon RDS for MySQL マイナーバージョンが、2025 年 3 月 31 日に標準サポート終了する予定のためアップグレード先を8.0.40以降にしてね。」という案内です。

バージョン 終了期間
8.0.32 2025年3月31日
8.0.33 2025年3月31日
8.0.34 2025年3月31日
8.0.35 2025年3月31日
8.0.36 2025年3月31日

一応、8.0.37と8.0.39にもアップグレードができますが、アップグレード先は8.0.40以降が推奨されています。
なぜなら、以下を参照すると8.0.37と8.0.39は2025年9月にサポート終了予定のため、すぐにアップグレードの対応をしなければいけなくなるからです。
余裕を持って、8.0.40以降に変更していただくことを推奨いたします。

バージョン 終了期間
8.0.37 2025年9月
8.0.39 2025年9月
8.0.40 2026年3月
8.0.43 2026年3月

サポート終了期間について(AWS公式ドキュメント)

さて、対応方法の進め方を見る前にまずはアップグレードに伴う変更点について確認していきましょう。
全部紹介するには長すぎるので、今回紹介する変更点は私が対応した内容に伴う変更点になります。
公式ページも掲載しますので、詳細は公式ページを確認してください!
「もう知ってるよ」という方は飛ばしてください!

アップグレードに伴う変更点

優先認証プラグインとしての caching_sha2_password

認証方式がバージョン5.7系のデフォルト値ではmysql_native_passwordとなっています。
よりセキュアなパスワードの暗号化と優れたパフォーマンスを提供するようになったcaching_sha2_passwordに変更してねという内容です。

文字コードについて

utf8mb3からutf8mb4に変更してねという内容です。
これは、保存できる文字が異なります。
絵文字や旧漢字などが使用できるか否かという感じです。
utf8mb3 → 1~3バイトまで対応
utf8mb4 → 1~4バイトまで対応
utf8mb4を推奨しておりますので、バージョン8.0ではデフォルトの設定にしていれば問題ないです!
もっと詳しく知りたい方は以下を参照してください!
3バイト文字セットと4バイト文字セット間の変換(MySQL公式ドキュメント)

バージョン8.0での変更点(MySQL公式ページ)

事前準備

パラメータ値の確認

現在使用しているパラメタータ値と変更するパラメータ値との差分を確認します。
変更用のパラメータ値の作成がされていない場合は作成が必要となります。
確認をした上で、必要箇所の変更をしてください。
パラメータ値の確認手順(AWS公式ドキュメント)

事前チェックリストの確認をする

アップグレードにおいて、変更前と変更後のデータベース互換性が取れているかを事前に確認しておく必要があります。
以下のAWSとMySQLから記されているチェックリストを確認し、変更点があれば変更を実施します。
AWS事前チェックリスト
MySQL事前チェックリスト

エラーログの確認方法

上記の事前チェックリストを確認した上でRDSのアップグレード時にエラーになり、アップグレードができなかった際に以下のエラーログを確認します。

PrePatchCompatibility.log

こちらは事前準備で記載した、事前チェックリストの項目でデータの不整合を検知したためエラーが起きています。
エラーにも段階分けがされています。
エラーログの下の方にErrorsWarningsと記載があります。
横に記載されている数字の数によって、対処する数も変化します。

  • Warnings: 1
  • 推奨レベルです。解決しなくてもデータベースの整合性が取れている場合はアップグレードができることがあります。

  • Errors: 1
  • 必ず解決しないとアップグレードができません。

エラーログの見方

PrePatchCompatibility.logのエラー文の見方について以下を例に解説します。

データベース名.テーブル名.カラム名 - column's default character set: utf8

データベース名.テーブル名.カラム名は該当のカラムの箇所です。
column's default character set: utf8は文字セットがutf8mb3であることを示しています。
そのため、該当箇所の文字セットがutf8mb3のためutf8mb4へ変更する必要がある。ということです。

upgradeFailure.log

アップグレードの事前チェックは問題なく完了していますが、その後のアップグレードプロセス中にデータの不整合を検知したため、アップグレードが行えない状況になっています。
エラーログの中に以下の記載がありますので、ひとまず[ERROR]箇所の対処をしてアップグレードを試みてください。

  • [Note]
  • 情報提供レベルのメッセージです。通常、これに対する直接的な対応は不要です。
    アップグレードの成否には直接影響しない情報であることが多いです。

  • [System]
  • システムの動作状況を示すメッセージです。
    これも通常、ユーザーが直接対応する必要はありません。

  • [Warning]
  • 推奨レベルです。解決しなくてもデータベースの整合性が取れている場合はアップグレードができることがあります。

  • [ERROR]
  • 必ず解決しないとアップグレードができません。

調査する際には、以下の対応をすると見る所が限定されて調査がしやすいです。
  1. ローカル環境にエラーログをダウンロードします。
  2. 以下コマンドを使用すると [ERROR]の箇所だけが出力されます。
cat upgradeFailure.log | grep ERROR
エラーログの見方

upgradeFailure.logのエラー文の見方について以下を例に解説します。

2024-09-25T06:20:02.446392Z 2 [ERROR] [MY-013140] [Server] Comment for field 'データベース名.テーブル名.カラム名' contains an invalid utf8mb3 character string: '\x83R\x81'.

データベース名.テーブル名.カラム名は該当のカラムの箇所です。
contains an invalid utf8mb3 character string: '\x83R\x81は\x83R\x81はutf8mb3では無効な文字列(文字化け)であることを示しています。
そのため、該当箇所の文字列(\x83R\x81)がutf8mb3では無効(文字化け)となっているため、文字化けを解消してください。ということになります。

RDS MySQL 5.7.44 を MySQL 8 に変換するときに発生する抽象エラー

発生したエラーと解決策

エラー①:予約語との競合

3) Usage of db objects with names conflicting with new reserved keywords

詳細はこちら

エラー②:ゼロ日付、日時、タイムスタンプの値

18) Zero Date, Datetime, and Timestamp values

詳細はこちら

エラー③:ユーザー認証方法の非推奨

29) Check for deprecated or invalid user authentication methods.

詳細はこちら

エラー④:文字コード関連のエラー

2024-09-25T06:20:02.446392Z 2 [ERROR] [MY-013140] [Server] Comment for field ‘データベース名.テーブル名.カラム名’ contains an invalid utf8mb3 character string: ‘\x83R\x81’.

詳細はこちら

まとめ

今回、PrePatchCompatibility.logのエラーログを解消した後も、アップグレードができませんでした。
エラー④でも記載しましたが、upgradeFailure.logを解消する必要があり、これを特定するのに時間を要しました。
また、エラー③ではOSやPHPのバージョンがcaching_sha2_passwordに対応していなかったため、一時的にmysql_native_passwordを継続して使用することにしました。
環境に合わせて、柔軟に適応することで安全にアップグレードができると思います。

今回のアップグレード作業にあたり、データベースに関する知識を深めながら進めた部分もあり、特にエラーログの調査と解析には多くの時間を費やしました。
この経験を通じて、トラブルシューティングにおけるエラーログ確認という基本作業の重要性を改めて認識しました。
また、調査を進める中で特に有用だったのは、MySQLの公式ドキュメントです。
非常に詳細かつ分かりやすく記述されており、問題解決の大きな助けとなりました。
初心者から経験者まで、幅広いレベルの技術者にとって価値のあるリソースだと感じました。
皆さんも今後対応する際には、MySQLの公式ドキュメントを積極的に参照してみてはいかがでしょうか。

参考資料

適宜必要な箇所に掲載していますが、その他参考にした点を載せておきます。

事前チェックリストについて

Upgrading to MySQL 8.0? Here is what you need to know…
MySQL Shell 8.0.4: Introducing “Upgrade checker” utility

エラーログについて

Amazon RDS for MySQL のアップグレード前のチェックの失敗を解決するにはどうすればよいですか?