MariaDB のメタデータロックとユーザーロックを理解する: METADATA_LOCK_INFO Table の詳細解説
MariaDB の Information Schema METADATA_LOCK_INFO Table
は、データベース内のアクティブなメタデータロックとユーザーロックに関する情報を提供します。これは、データベースのパフォーマンスとロックの問題を診断する際に役立ちます。
テーブル構造
METADATA_LOCK_INFO Table
は以下の列で構成されています。
EXPIRE
: ロックの有効期限CREATED
: ロック作成時刻OWNER
: ロックの所有者 (例: "user@host")SOURCE
: ロックを取得したソース (例: "INSERT"、"ALTER TABLE")BLOCKING_LOCK_ID
: ロックによってブロックされているロック IDBLOCKING_THREAD_ID
: ロックによってブロックされているスレッド IDWAIT_RANK
: ロック待機順位WAIT_DURATION
: ロック待機時間 (秒)GRANTED
: ロックが許可されたかどうかOBJECT_TYPE
: ロック対象のオブジェクトの種類 ("TABLE"、"VIEW"、"INDEX" など)OBJECT_NAME
: ロック対象のオブジェクト名 (テーブル、ビュー、インデックスなど)OBJECT_SCHEMA
: ロック対象のスキーマ名LOCK_MODE
: ロックモード ("READ" は読み取りロック、"WRITE" は書き込みロック)LOCK_TYPE
: ロックの種類 ("MDL" はメタデータロック、"MUTEX" はユーザーロック)THREAD_ID
: ロックを取得しているスレッド ID
プログラミング例
以下の例では、METADATA_LOCK_INFO Table
を使用して、アクティブなすべてのメタデータロックを取得する方法を示します。
SELECT * FROM information_schema.METADATA_LOCK_INFO;
以下の例では、特定のスキーマ内のすべてのメタデータロックを取得する方法を示します。
SELECT * FROM information_schema.METADATA_LOCK_INFO
WHERE OBJECT_SCHEMA = 'my_schema';
以下の例では、特定のテーブルにロックをかけているスレッド ID を取得する方法を示します。
SELECT THREAD_ID
FROM information_schema.METADATA_LOCK_INFO
WHERE OBJECT_SCHEMA = 'my_schema'
AND OBJECT_NAME = 'my_table';
- ロックに関する詳細な情報は、
performance_schema
スキーマのevents_statements_summary_by_digest
テーブルで確認できます。 - ロック情報は頻繁に変更されるため、このテーブルを繰り返しクエリすることはデータベースのパフォーマンスに影響を与える可能性があります。
METADATA_LOCK_INFO Table
は、リアルタイムの情報ではなく、スナップショットを提供します。
アクティブなすべてのメタデータロックを取得
SELECT * FROM information_schema.METADATA_LOCK_INFO;
特定のスキーマ内のすべてのメタデータロックを取得
SELECT * FROM information_schema.METADATA_LOCK_INFO
WHERE OBJECT_SCHEMA = 'my_schema';
このクエリは、my_schema
スキーマ内のすべてのメタデータロックを返します。
特定のテーブルにロックをかけているスレッド ID を取得
SELECT THREAD_ID
FROM information_schema.METADATA_LOCK_INFO
WHERE OBJECT_SCHEMA = 'my_schema'
AND OBJECT_NAME = 'my_table';
このクエリは、my_schema
スキーマの my_table
テーブルにロックをかけているスレッド ID を返します。
ロック待機時間 (秒) の合計をスキーマごとに取得
SELECT OBJECT_SCHEMA, SUM(WAIT_DURATION) AS TOTAL_WAIT_TIME
FROM information_schema.METADATA_LOCK_INFO
GROUP BY OBJECT_SCHEMA;
このクエリは、各スキーマのロック待機時間の合計を返します。
SELECT LOCK_MODE, COUNT(*) AS LOCK_COUNT
FROM information_schema.METADATA_LOCK_INFO
GROUP BY LOCK_MODE;
このクエリは、各ロックモードのロック数を返します。
- ロックに関する詳細な情報は、
performance_schema
スキーマのevents_statements_summary_by_digest
テーブルで確認できます。 - ロック情報は頻繁に変更されるため、クエリの実行結果がすぐに古くなる可能性があります。
- 上記の例はほんの一例です。
METADATA_LOCK_INFO Table
には他にも多くの列があり、さまざまな方法でクエリを実行できます。
Information Schema METADATA_LOCK_INFO Table
以外にも、MariaDB のメタデータロックとユーザーロックに関する情報を取得する方法がいくつかあります。
Performance Schema events_statements_summary_by_digest テーブル
performance_schema
スキーマの events_statements_summary_by_digest
テーブルは、METADATA_LOCK_INFO Table
よりも詳細なロック情報を提供します。このテーブルには、ロックの種類、モード、待機時間、所有者などに関する情報が含まれています。
SELECT * FROM performance_schema.events_statements_summary_by_digest
WHERE SCHEMA_NAME LIKE '%my_schema%'
AND DIGEST LIKE '%my_table%';
GET_LOCK ステートメント
GET_LOCK
ステートメントを使用して、特定のオブジェクトに関連するアクティブなロックに関する情報を取得できます。
SELECT * FROM information_schema.innodb_locks
WHERE object_name = 'my_table';
ロックに関するツール
Navicat や MySQL Workbench などのツールには、グラフィカルユーザーインターフェースを使用してロック情報を表示する機能が組み込まれています。
performance_schema
スキーマのevents_statements_summary_by_digest
テーブルは、より詳細で正確なロック情報を提供します。- ロック情報は頻繁に変更されるため、このテーブルを繰り返しクエリすることはデータベースのパフォーマンスに影響を与える可能性があります。
METADATA_LOCK_INFO Table
は、リアルタイムの情報ではなく、スナップショットを提供します。