こんにちは、クラウド事業部の倉岡です。
今回は、AWSのRDSをMySQL 5.7からMySQL 8にアップデートした際に、PHP経由での接続ができなくなった事象について、解決までの流れをお伝えしたいと思います。
事象の概要
AWSEC2サーバーからmysqlコマンドを実行して直接RDSに接続することは問題なくできるのですが、webサイト(PHP経由)からは接続できないという問題が発生しました。
サーバーの情報
- OS: Amazon Linux 1
- PHPバージョン: PHP 5.5
問題発生の時系列
- AWS管理画面でRDSのMySQLバージョンを5.7から8にアップデート
- RDSがMySQL 8になった瞬間からサイト(PHP経由)で接続できなくなる
- RDSのアップデートが完了し、EC2サーバーからmysqlコマンドを実行での接続確認はOK
- その後、サイトで接続できないとの報告を受ける
- サーバー内で接続確認や動作確認などを行ったが特にそれらしきものはなかった。
- パラメーターグループの文字コードを前回使用していたutf8にした
- RDSインスタンスを再起動してパラメーターを適用させるとサイトからの接続も正常に動作するようになった
原因の可能性を検証
可能性1: PHPのキャッシュ機能による障害
PHPの接続機能がMySQLのホスト情報をキャッシュのように保持している可能性を疑いました。しかし、phpMyAdminでも接続できなかったため、この仮説は否定されました。
可能性2: 認証プラグインの変更による影響
MySQL 8.0では、デフォルトの認証プラグインが「caching_sha2_password」に変更されています。一方、MySQL 5.7以前では「mysql_native_password」が使われていました。
しかし、MySQLのパラメーターグループでは、default_authentication_pluginは変更不可であり、MySQL 5.7から8にアップデートしても引き続き「mysql_native_password」が使用されるため、これも原因ではないと判断しました。
可能性3: PHP 5.5とMySQL 8の互換性問題(これが原因)
最終的に、PHP 5.5からMySQL 8に接続する際に、以下の問題があることに気づきました。
キャラセットのデフォルト設定がutf8mb4に変更
MySQL 8からはデフォルトのキャラセットがutf8mb4になりました。これにより、PHP 5.5ではこの文字コードを正しく扱うことができず、接続エラーが発生していました。
php5.5ではutf8 が扱うことができて utf8mb4 を扱うことが出来ないのです。
この問題により、PHP 5.5環境でMySQL 8に接続する際にエラーが発生していたのです。
解決方法
RDSのパラメーターグループをカスタムで作成し、以下の設定を変更することで、問題なく接続できるようになりました。
パラメーター | 設定値 |
character_set_client | utf8 |
character_set_connection | utf8 |
character_set_database | utf8 |
character_set_results | utf8 |
character_set_server | utf8 |
これにより、PHP 5.5でもMySQL 8への接続が可能になりました。
まとめ
今回の事象は、RDSのMySQLを8にアップデートした際に、PHPのバージョンが古いことによる互換性の問題が原因でした。
RDSのアップデート後は、サーバー上からmysqlコマンドを実行の接続確認だけでなく、実際のアプリケーション側での動作確認も必ず行うことが重要です。また、互換性のあるPHPバージョンを使用するか、必要に応じてパラメーター設定を見直すことが解決の鍵となります。
今後のアップデート作業でも、このような互換性のチェックを怠らないよう、引き続き注意していきたいと思います。
それでは、また次回のブログでお会いしましょう!