MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

5.9.3 LOCK_ORDER ツール

MySQL サーバーは、相互排他ロック、rwlocks (prlocks および sxlocks を含む)、条件、ファイルなど、多数の内部ロックおよびロック関連のプリミティブを使用するマルチスレッドアプリケーションです。 サーバー内では、ロック関連オブジェクトのセットは、パフォーマンス向上のための新機能およびコードリファクタの実装によって変更されます。 ロックプリミティブを使用するマルチスレッドアプリケーションと同様に、複数のロックが一度に保持されている場合、実行中にデッドロックが発生するリスクが常にあります。 MySQL の場合、デッドロックの影響は致命的であり、サービスが完全に失われます。

MySQL 8.0.17 では、ロック取得デッドロックの検出およびランタイム実行が解放されていることの強制を有効にするために、MySQL は LOCK_ORDER ツールをサポートしています。 これにより、ロック順序の依存性グラフをサーバー設計の一部として定義し、サーバー実行時チェックを使用して、ロック取得が非循環であり、実行パスがグラフに準拠していることを確認できます。

このセクションでは、LOCK_ORDER ツールの使用方法について説明しますが、基本レベルでのみ説明します。 詳細は、https://dev.mysql.com/doc/index-other.html で入手可能な MySQL Server Doxygen ドキュメントの「ロック順序」のセクションを参照してください。

LOCK_ORDER ツールは、本番用ではなく、サーバーのデバッグを目的としています。

LOCK_ORDER ツールを使用するには、この手順に従います:

  1. ソースから MySQL をビルドし、ビルドに LOCK_ORDER ツールが含まれるように -DWITH_LOCK_ORDER=ON CMake オプションを使用して構成します。

    注記

    WITH_LOCK_ORDER オプションを有効にすると、MySQL ビルドに flex プログラムが必要になります。

  2. LOCK_ORDER ツールを有効にしてサーバーを実行するには、サーバーの起動時に lock_order システム変数を有効にします。 LOCK_ORDER 構成には、他にもいくつかのシステム変数を使用できます。

  3. MySQL テストスイート操作の場合、mysql-test-run.pl には、テストケースの実行中に LOCK_ORDER ツールを有効にするかどうかを制御する --lock-order オプションがあります。

次に説明するシステム変数は、MySQL が LOCK_ORDER ツールを含むように構築されていることを前提として、LOCK_ORDER ツールの構成操作を行います。 主な変数は lock_order で、実行時に LOCK_ORDER ツールを有効にするかどうかを示します:

注記

一般に、--lock-order オプションを指定して mysql-test-run.pl を実行し、mysql-test-run.pl で LOCK_ORDER システム変数を適切な値に設定することで、LOCK_ORDER ツールを構成することを目的としています。

すべての LOCK_ORDER システム変数は、サーバー起動時に設定する必要があります。 実行時には、その値は表示されますが変更できません。

一部のシステム変数は、lock_order_debug_looplock_order_trace_loop などのペアで存在します。 このようなペアでは、変数が関連付けられている条件が発生すると、変数は次のように区別されます:

表 5.7 「LOCK_ORDER システム変数サマリー」

変数名 変数型 変数スコープ
lock_order Boolean グローバル
lock_order_debug_loop Boolean グローバル
lock_order_debug_missing_arc Boolean グローバル
lock_order_debug_missing_key Boolean グローバル
lock_order_debug_missing_unlock Boolean グローバル
lock_order_dependencies ファイル名 グローバル
lock_order_extra_dependencies ファイル名 グローバル
lock_order_output_directory ディレクトリ名 グローバル
lock_order_print_txt Boolean グローバル
lock_order_trace_loop Boolean グローバル
lock_order_trace_missing_arc Boolean グローバル
lock_order_trace_missing_key Boolean グローバル
lock_order_trace_missing_unlock Boolean グローバル