このページでは、Cloud SQL for MySQL 5.7 から Cloud SQL for MySQL 8.0 へのメジャー バージョンのアップグレードを実行した後に発生する可能性がある既知の問題と非互換性について説明します。
メジャー バージョンのアップグレードの詳細については、データベースのメジャー バージョンをインプレースでアップグレードするをご覧ください。エラーログの詳細については、エラーログを表示するをご覧ください。
パフォーマンスの問題
以下のセクションでは、既知のパフォーマンスの問題について説明します。
SELECT DISTINCT クエリに関する問題
MySQL 8.0.18 から MySQL 8.0.20 で SELECT DISTINCT クエリを使用すると、パフォーマンスの低下が生じることがあります。クエリの実行時間が MySQL 5.7 より 3 倍長くなることがあります。
詳しくは、MySQL バグ #99593 をご覧ください。
この問題を解決するには、次のトラブルシューティングの推奨事項を行います。
- MySQL 8.0.21、それ以降のマイナー バージョン、または最新リリースに更新します。
- MySQL 8.0.18 から MySQL 8.0.20 を使用している場合は、
internal_tmp_mem_storage_engineデータベース フラグの値をmemoryに更新します。SET SESSION internal_tmp_mem_storage_engine='memory' ;
GROUP BY クエリに関する問題
MySQL 8.0.36 以前で SELECT... GROUP BY クエリを使用している場合は、パフォーマンスが低下し、クエリの実行時間が長くなることがあります。
これは、クエリで TempTable エンジンを使用している場合に発生することがあります。
詳しくは、MySQL バグ #107700 をご覧ください。
この問題を解決するには、次のトラブルシューティングの推奨事項を行います。
- MySQL 8.0.37、それ以降のマイナー バージョン、または最新リリースに更新します。
- MySQL 8.0.36 以前を使用している場合は、一時テーブル エンジンではなくメモリエンジンを使用するように
internal_tmp_mem_storage_engineデータベース フラグを更新します。SET SESSION internal_tmp_mem_storage_engine='memory' ;
同時実行性の低いスレッドに関する問題
スレッドの同時実行性が低いクライアント アプリケーションに対応している MySQL 8.0.22 以降で作成されたインスタンスでは、パフォーマンスの問題が発生し、クエリの実行時間が長くなることがあります。
MySQL 8.0.22 では、同時実行性の高いシステムでのパフォーマンスを向上させるために innodb_log_writer_threads フラグが導入されました。このフラグは、デフォルトで有効になっています。スレッドの同時実行性が低いクライアント アプリケーションに対応している MySQL 8.0.22 以降で作成されたインスタンスがある場合は、innodb_log_writer_threads フラグを無効にすることをおすすめします。
詳しくは、MySQL バグ #93734 をご覧ください。
JOINS に関する問題
MySQL 8.0.29 から MySQL 8.0.32 を使用しているインスタンスの eq_ref ビューで JOIN クエリを使用すると、重大なパフォーマンスの問題が発生することがあります。
詳しくは、MySQL バグ #109361 をご覧ください。
この問題を解決するには、MySQL 8.0.33、それ以降のマイナー バージョン、または最新リリースに更新してください。
LIMIT 句と ORDER BY 句に関する問題
MySQL 8.0.32 以前で LIMIT 句と ORDER BY 句を使用してクエリを実行すると、パフォーマンスの問題が発生することがあります。場合によっては、同じクエリに対して MySQL 5.7 と MySQL 8.0 で異なるクエリプランが使用されることがあります。
詳細については、MySQL 8.0.33 での変更をご覧ください。
この問題を解決するには、MySQL 8.0.33、それ以降のマイナー バージョン、または最新リリースに更新してください。
MySQL 8.0 のメモリリークの問題
以下のセクションでは、MySQL 8.0 以降の既知のメモリリークの問題について説明します。これらの問題は、インスタンスのパフォーマンスにも影響する可能性があります。
範囲クエリが原因のメモリリーク
MySQL 8.0.16 から MySQL 8.0.28 のインスタンスで範囲オプティマイザーを使用している場合、コードファイルと関数 memory/sql/THD::main_mem_root によってメモリ消費量が増加することがあります。そのため、インスタンスでメモリ不足(OOM)が発生する可能性があります。
詳しくは、MySQL バグ #105331 をご覧ください。
この問題を解決するには、MySQL 8.0.29、それ以降のマイナー バージョン、または最新リリースに更新してください。
ストアド プロシージャに関連するメモリリーク
MySQL 8.0.27 から 8.0.31 のインスタンスのストアド プロシージャでクエリを実行すると、memory/sql/sp_head::execute_mem_root コードファイルと関数で非常に大量のメモリが消費されることがあります。
詳しくは、MySQL バグ #107327 をご覧ください。
この問題を解決するには、MySQL 8.0.32、それ以降のマイナー バージョン、または最新リリースに更新してください。
SELECT を使用したビューへのアクセスが原因のメモリリーク
MySQL 8.0.35 以前で SELECT クエリを使用し、アプリケーションで多数のビュー呼び出しを使用している場合、著しいメモリリークが発生する可能性があります。
また、DEFINER ビューが root@'%' または cloudsqlsuperuser ロールから派生したユーザーに設定されている場合も、メモリリークが発生する可能性があります。これは、cloudsqlsuperuser ロールに部分的な取り消し権限があるためです。
詳しくは、MySQL バグ #103133 をご覧ください。
この問題を解決するには、次のトラブルシューティングの推奨事項を行います。
- MySQL 8.0.36、それ以降のマイナー バージョン、または最新リリースに更新します。
- MySQL 8.0.35 以前を使用している場合は、
DEFINERビューに別のユーザー(つまり、部分的な取り消し権限を持たないユーザー)を使用します。root@'%'ユーザーまたはcloudsqlsuperuserロールを使用する必要がある場合、これらは管理プロセスでのみ使用し、アプリケーション クエリでは使用しないでください。メモリリークが解消されない場合は、MySQL 8.0.36、それ以降のマイナー バージョン、または最新リリースにアップグレードする必要があります。
レプリケーションの問題
以下のセクションでは、レプリケーションに関する既知の問題について説明します。
並列レプリケーションに関する問題
slave_preserve_commit_order コンポーネントが有効になっているマルチスレッド レプリカで並列レプリケーションを使用し、高い書き込みワークロードにインスタンスが使用されている場合、デッドロックおよび累積しているレプリケーションの遅延時間によってインスタンス オペレーションが無限に一時停止することがあります。
この問題は、MySQL 8.0.27 から MySQL 8.0.32 で発生します。
詳細については、MySQL バグ #95863 と MySQL バグ #103636 をご覧ください。
この問題を解決するには、次のトラブルシューティングの推奨事項を行います。
- MySQL 8.0.33、それ以降のマイナー バージョン、または最新リリースに更新します。
- この問題の原因を検証するために並列レプリケーションを無効にし、適切なアップグレードをスケジュールします。並列レプリケーションを無効にすると、問題が一時的に解決することがありますが、長期的な解決策としてはおすすめしません。
権限に関する問題
以下のセクションでは、権限に関する既知の問題について説明します。
権限の変更
MySQL 8.0 ではセキュリティとアカウント管理のシステムが変更されています。
MySQL 8.0 にアップグレードした場合、MySQL 5.7 で作成されたユーザーには、MySQL 8.0 で作成されたユーザーと同じ権限とアクセス権が付与されない可能性があります。その結果、MySQL 5.7 で作成されたユーザーには、次のシナリオでアクセス拒否のエラー メッセージが表示されることがあります。
- MySQL 5.7 からアップグレードされたユーザーには、
CREATE ROLE権限とDROP ROLE権限が付与されない場合があります。これは、MySQL 5.7 ではこれらの権限が存在していなかったためです。 - MySQL 5.7 からアップグレードされたユーザーは、
KILLコマンドを実行できない場合があります。このコマンドが MySQL 8.0 で動作するためには、CONNECTION_ADMIN権限が必要になりました。
詳細については、MySQL 8.0 で使用可能なすべての権限をご確認ください。
エラー メッセージの例は次のようになります。
ERROR 1227 (42000): Access denied; you need (at least one of) the GRANT OPTION privilege(s) for this operation
更新された権限を既存のユーザーに直接割り当てることはできません。この問題を解決するには、GRANT OPTION 権限を持つ管理者が、アップグレード後にユーザー権限をリセットして、メジャー バージョンのアップグレードを完了する必要があります。
詳細については、データベースのメジャー バージョンをインプレースでアップグレードするをご覧ください。
権限の変更によりアクセス拒否のエラーが発生する
MySQL 5.7 で作成され、MySQL 8.0 にアップグレードされたユーザーは、権限の問題によりデータベースに接続できない場合があります。そのような場合、ユーザーに次のエラー メッセージが表示されることがあります。
Access denied for user 'USER_NAME'@'%' to database 'MY_DATABASE_NAME' ;
Mysql 8.0.16 では partial_revokes データベース フラグが導入され、デフォルトで有効になっています。これにより、ユーザー権限を部分的に取り消すことが可能になりました。
MySQL 5.7 で作成されたユーザーがワイルドカード文字を使用して定義されている場合、そのユーザーはデータベースに接続できないことがあります。MySQL 8.0.16 以降では、ワイルドカード文字はサポートされなくなりました。そのため、MySQL でデータベースとユーザーの完全一致を見つけることができず、アップグレードで検出されない既存の権限割り当てが発生する可能性があります。
この問題は、MySQL 8.0.16 以降に影響します。
詳細については、データベース フラグを構成するとセキュリティとアカウント管理をご覧ください。
この問題を解決するには、管理者が MySQL 8.0 のユーザーに手動で権限を割り当てる必要があります。
MySQL 5.7 と MySQL 8.0 の間でのフラグ値の変更
MySQL 5.7 から MySQL 8.0 にアップグレードする際に、バージョン間のデフォルト値の変更により、一部のデータベース フラグの値が変更されることがあります。この動作により、パフォーマンスの問題が発生する可能性があります。
詳細については、MySQL 8.0 の新しいデフォルト値をご覧ください。
この問題を解決するには、MySQL 5.7 で設定された手動割り当てのデータベース フラグの値が、MySQL 8.0 以降にアップグレードした後も適用されるようにします。システムフラグに割り当てられたデフォルト値はそのままにしておくことをおすすめします。