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: ロックによってブロックされているロック ID
  • BLOCKING_THREAD_ID: ロックによってブロックされているスレッド ID
  • WAIT_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 は、リアルタイムの情報ではなく、スナップショットを提供します。