2021.01.25

MySQL

MySQL 5.7.33 GA版(リリース日:2021年1月18日)

主な変更点

■ オプティマイザ関連

● MySQLは、LIMIT句を含むORDER BYまたはGROUP BYクエリに順序付きインデックスを使用することによって実行が速くなると判断した場合はいつも、それをしようとし、オプティマイザによる他の選択を上書きします。この判断をするためのアルゴリズムは、データの分散やその他の条件について特定の仮定を行うため、必ずしも完全に正しいとは限りません。場合によっては、そのようなクエリに別の最適化を選択する方がパフォーマンスが向上する可能性があります。このようなことに対処するために、optimizer_switchシステム変数のprefer_ordering_indexフラグをオフに設定することにより、この最適化を無効にすることが可能になりました。

 (バグ #31686878)

 参照:バグ #97001、バグ #30348211。

■ セキュリティ関連

● MySQLサーバー用のリンクされたOpenSSLライブラリがバージョン1.1.1iに更新されました。新しいOpenSSLバージョンで修正された問題については、https://www.openssl.org/news/cl111.txtおよびhttps://www.openssl.org/news/vulnerabilities.htmlで説明されています。(バグ #32260610)

■ 追加・変更された機能

● --all-databasesオプションを指定して呼び出された時、mysqldumpは最初にmysqlデータベースをダンプするようになりました。そのため、ダンプファイルがリロードされる時、他のオブジェクトのDEFINER句で指定されたアカウントはすでに作成されています。(バグ #32141046)

■ 主なバグ修正

● InnoDB:全文検索同期スレッドが、以前に解放された単語をインデックスキャッシュから読み取ろうとしました。(バグ #31310404)

● InnoDB:numa_all_nodes_ptrの呼び出しは、numa_get_mems_allowed()関数に置き換えられました。(バグ #24693086、バグ #83044)

● レプリケーション:システム変数transaction_write_set_extraction=XXHASH64が設定されている場合(これはMySQL 8.0のデフォルトであり、グループレプリケーションの要件です)、トランザクションの書き込みのコレクションは、以前はサイズの上限がありませんでした。現在、標準のソースからレプリカへのレプリケーションでは、binlog_transaction_dependency_history_sizeで指定された書き込みセットの数値制限が適用されます。その後、書き込みセット情報は破棄されますが、トランザクションは引き続き実行されます。書き込みセット情報は依存関係の計算に使用できないため、トランザクションは非並行としてマークされ、レプリカで順次処理されます。グループレプリケーションの場合、トランザクションから書き込みを抽出するプロセスは、全てのグループメンバーの競合検出と認証に必要であるため、トランザクションが完了する場合に書き込みセット情報を破棄することはできません。数値制限の代わりに、group_replication_transaction_size_limitで設定されたバイト制限が適用され、その制限を超えるとトランザクションの実行に失敗します。(バグ #32019842)

● レプリケーション:準同期ソースサーバーから複製するレプリカの数が増えると、ロックの競合により、パフォーマンスが低下する可能性がありました。プラグインで使用されるロックメカニズムは、可能であれば共有ロックを使用し、不要なロックの取得を回避し、コールバックを制限するように変更されました。新しい動作は、次のシステム変数を有効にすることで実装できます。

 ・replication_sender_observe_commit_only=1は、コールバックを制限します。
 ・replication_optimize_for_static_plugin_config=1は、共有ロックを追加し、不要なロックの取得を回避します。プラグインをアンインストールしたい場合は、このシステム変数を無効にする必要があります。

 両方のシステム変数は、準同期レプリケーションプラグインのインストールの前か後に有効にでき、レプリケーションの実行中に有効にできます。準同期レプリケーションソースサーバーは、レプリカと同じロックメカニズムを使用するため、これらのシステム変数を有効にすることでパフォーマンス上の利点も得ることができます。(バグ #30519928)

● レプリケーション:コミット順序が保持されているマルチスレッドレプリカでは、ワーカースレッドは、独自のトランザクションをコミットする前に、リレーログで以前に発生した全てのトランザクションがコミットされるのを待つ必要があります。コミット順序の後半でのトランザクションのコミットを待機しているスレッドが、コミット順序の前半でトランザクションに必要な行をロックしたために、デッドロックが発生した場合、デッドロック検出アルゴリズムは待機中のスレッドにトランザクションをロールバックするように通知します。以前は、トランザクションの再試行が利用できなかった場合、トランザクションをロールバックしたワーカースレッドは、コミット順序で他のワーカースレッドに通知せずにすぐに終了し、レプリケーションが停止する可能性がありました。現在、この状況のワーカースレッドは、ロールバック関数を呼び出す順番を待機します。これは、他のスレッドに正しく通知することを意味します。(バグ #26883680、バグ #87796)

● レプリケーション:GTIDは、符号付き64ビット整数の負でない値の数(2の63乗引く1)までのサーバーインスタンスでのみ使用できます。 gtid_purgedの値をこの制限に近い数に設定すると、後続のコミットによってサーバーのGTIDが不足し、binlog_error_actionで指定されたアクションが実行される可能性があります。MySQL 8.0.23以降、サーバーインスタンスがその制限に近づくと、警告メッセージが発行されます。(バグ #26035544)

● Microsoft Windows:Windowsでは、MySQLサーバーをサービスとして実行すると、共有メモリ接続が失敗しました。(バグ #32009251)

● サーバーは、WHERE_CONDITIONの最適化の全てのケースを正しく処理しませんでした。(バグ #31905199)

● プライマリキーの拡張をサポートするエンジンの場合、キーの全長がMAX_KEY_LENGTHを超えた場合、または、キーパーツの数がMAX_REF_PARTSを超えた場合、これらの制限内に収まらないプライマリキーのキーパーツはセカンダリキーに追加されませんでしたが、プライマリキーのキーパーツは無条件にセカンダリキーの一部としてマークされました。

 これにより、セカンダリキーがカバーインデックスとして扱われる状況が発生し、間違ったアクセス方法が選択されることがありました。

 これは、プライマリキーのキーパーツがセカンダリキーに追加される方法を変更して、前述の制限内に収まらないものがクリアされるようにすることで修正されています。(バグ #31617858)

● 一部のINFORMATION_SCHEMAテーブルの権限が正しくチェックされませんでした。(バグ #31553323)

● 特定のケースで、サーバーは複数ネストされたサブクエリを正しく処理しませんでした。(バグ #31472704)

● skip_name_resolveシステム変数が有効になっている場合、特定のアカウントがサーバーの起動エラーを引き起こす可能性がありました。(バグ #31018510)

● 通信パケットに不良なデータが含まれていると、クライアントプログラムが予期せず終了する可能性がありました。(バグ #30890850)

● クライアントライブラリのバッファオーバーフローが修正されました。(バグ #30885987)

● mysql_config_editorは、パスワード値の#をコメント文字として誤って扱いました。(バグ #29861961、バグ #95597)

全ての変更点やバグ修正については、以下のページをご覧ください。
MySQL 5.7.33 リリースノート(MySQLウェブサイト):
https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-33.html

MySQL Editions

MySQL EditionsMySQLのサブスクリプションは、24時間365日体制でお客様をサポートいたします。さらに MySQL Enterprise Edition では、データベース管理者支援ツール MySQL Enterprise Monitor やバックアップツール MySQL Enterprise Backup をご利用いただけます。

MySQL Editionsの詳細