MySQL 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 が無効 (デフォルト) の場合、他の 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 などのペアで存在します。 このようなペアでは、変数が関連付けられている条件が発生すると、変数は次のように区別されます:

  • _debug_変数が有効な場合は、デバッグアサーションが発生します。

  • _trace_変数が有効な場合は、ログにエラーが出力されます。

表 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 グローバル

  • lock_order

    コマンド行形式 --lock-order[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    実行時に LOCK_ORDER ツールを有効にするかどうか。 lock_order が無効 (デフォルト) の場合、他の LOCK_ORDER システム変数は無効になりません。 lock_order が有効になっている場合、他のシステム変数によって、有効にする LOCK_ORDER 機能が構成されます。

    lock_order が有効な場合、ロック順序グラフで宣言されていないロック問合せ順序がサーバーで検出されると、エラーが発生します。

  • lock_order_debug_loop

    コマンド行形式 --lock-order-debug-loop[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_debug_loop
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    ロック順序グラフでループとしてフラグ付けされた依存性が検出されたときに、LOCK_ORDER ツールがデバッグアサーションの失敗の原因となるかどうか。

  • lock_order_debug_missing_arc

    コマンド行形式 --lock-order-debug-missing-arc[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_debug_missing_arc
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    ロック順序グラフで宣言されていない依存性が検出されたときに、LOCK_ORDER ツールがデバッグアサーションの失敗を引き起こすかどうか。

  • lock_order_debug_missing_key

    コマンド行形式 --lock-order-debug-missing-key[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_debug_missing_key
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    パフォーマンススキーマで適切に計測されていないオブジェクトが検出されたときに、LOCK_ORDER ツールがデバッグアサーションの失敗を引き起こすかどうか。

  • lock_order_debug_missing_unlock

    コマンド行形式 --lock-order-debug-missing-unlock[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_debug_missing_unlock
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    LOCK_ORDER ツールが、まだ保持されている間に破棄されたロックを検出したときにデバッグアサーションの失敗を引き起こすかどうか。

  • lock_order_dependencies

    コマンド行形式 --lock-order-dependencies=file_name
    導入 8.0.17
    システム変数 lock_order_dependencies
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    ファイル名
    デフォルト値 empty string

    サーバーのロック順序依存性グラフを定義する lock_order_dependencies.txt ファイルへのパス。

    依存関係は指定できません。 この場合、空の依存性グラフが使用されます。

  • lock_order_extra_dependencies

    コマンド行形式 --lock-order-extra-dependencies=file_name
    導入 8.0.17
    システム変数 lock_order_extra_dependencies
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    ファイル名
    デフォルト値 empty string

    ロック順序依存性グラフの追加の依存性を含むファイルへのパス。 これは、サードパーティコードの動作を説明する追加の依存関係を使用して、lock_order_dependencies.txt ファイルで定義されているプライマリサーバー依存性グラフを修正する場合に役立ちます。 (かわりに、lock_order_dependencies.txt 自体を変更することをお薦めしません。)

    この変数が設定されていない場合、セカンダリファイルは使用されません。

  • lock_order_output_directory

    コマンド行形式 --lock-order-output-directory=dir_name
    導入 8.0.17
    システム変数 lock_order_output_directory
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    ディレクトリ名
    デフォルト値 empty string

    LOCK_ORDER ツールがログを書き込むディレクトリ。 この変数が設定されていない場合、デフォルトは現在のディレクトリです。

  • lock_order_print_txt

    コマンド行形式 --lock-order-print-txt[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_print_txt
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    LOCK_ORDER ツールがロック順グラフ分析を実行し、テキストレポートを出力するかどうか。 このレポートには、検出されたロック取得サイクルが含まれます。

  • lock_order_trace_loop

    コマンド行形式 --lock-order-trace-loop[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_trace_loop
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    ロック順序グラフでループとしてフラグ付けされた依存性が検出されたときに、LOCK_ORDER ツールがトレースをログファイルに出力するかどうか。

  • lock_order_trace_missing_arc

    コマンド行形式 --lock-order-trace-missing-arc[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_trace_missing_arc
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 ON

    ロック順序グラフで宣言されていない依存性が検出されたときに、LOCK_ORDER ツールがトレースをログファイルに出力するかどうか。

  • lock_order_trace_missing_key

    コマンド行形式 --lock-order-trace-missing-key[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_trace_missing_key
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 OFF

    パフォーマンススキーマで適切に計測されていないオブジェクトが検出されたときに、LOCK_ORDER ツールがトレースをログファイルに出力するかどうか。

  • lock_order_trace_missing_unlock

    コマンド行形式 --lock-order-trace-missing-unlock[={OFF|ON}]
    導入 8.0.17
    システム変数 lock_order_trace_missing_unlock
    スコープ グローバル
    動的 いいえ
    SET_VAR ヒントの適用 いいえ
    Boolean
    デフォルト値 ON

    まだ保持されている間に破棄されたロックが検出された場合に、LOCK_ORDER ツールがトレースをログファイルに出力するかどうか。


関連キーワード:  lock, order, 変数, LOCK, ORDER, サーバー, グローバル, ツール, ロック, 形式