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 ツールを使用するには、この手順に従います:
-
ソースから MySQL をビルドし、ビルドに LOCK_ORDER ツールが含まれるように
-DWITH_LOCK_ORDER=ON
CMake オプションを使用して構成します。注記WITH_LOCK_ORDER
オプションを有効にすると、MySQL ビルドに flex プログラムが必要になります。 LOCK_ORDER ツールを有効にしてサーバーを実行するには、サーバーの起動時に
lock_order
システム変数を有効にします。 LOCK_ORDER 構成には、他にもいくつかのシステム変数を使用できます。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_loop
や lock_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[={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[={OFF|ON}]
導入 8.0.17 システム変数 lock_order_debug_loop
スコープ グローバル 動的 いいえ SET_VAR
ヒントの適用いいえ 型 Boolean デフォルト値 OFF
ロック順序グラフでループとしてフラグ付けされた依存性が検出されたときに、LOCK_ORDER ツールがデバッグアサーションの失敗の原因となるかどうか。
-
コマンド行形式 --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[={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=file_name
導入 8.0.17 システム変数 lock_order_dependencies
スコープ グローバル 動的 いいえ SET_VAR
ヒントの適用いいえ 型 ファイル名 デフォルト値 empty string
サーバーのロック順序依存性グラフを定義する
lock_order_dependencies.txt
ファイルへのパス。依存関係は指定できません。 この場合、空の依存性グラフが使用されます。
-
コマンド行形式 --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=dir_name
導入 8.0.17 システム変数 lock_order_output_directory
スコープ グローバル 動的 いいえ SET_VAR
ヒントの適用いいえ 型 ディレクトリ名 デフォルト値 empty string
LOCK_ORDER ツールがログを書き込むディレクトリ。 この変数が設定されていない場合、デフォルトは現在のディレクトリです。
-
コマンド行形式 --lock-order-print-txt[={OFF|ON}]
導入 8.0.17 システム変数 lock_order_print_txt
スコープ グローバル 動的 いいえ SET_VAR
ヒントの適用いいえ 型 Boolean デフォルト値 OFF
LOCK_ORDER ツールがロック順グラフ分析を実行し、テキストレポートを出力するかどうか。 このレポートには、検出されたロック取得サイクルが含まれます。
-
コマンド行形式 --lock-order-trace-loop[={OFF|ON}]
導入 8.0.17 システム変数 lock_order_trace_loop
スコープ グローバル 動的 いいえ SET_VAR
ヒントの適用いいえ 型 Boolean デフォルト値 OFF
ロック順序グラフでループとしてフラグ付けされた依存性が検出されたときに、LOCK_ORDER ツールがトレースをログファイルに出力するかどうか。
-
コマンド行形式 --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[={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 ツールがトレースをログファイルに出力するかどうか。