MySQL 8.0 リファレンスマニュアル


27.12.13.3 metadata_locks テーブル

MySQL では、メタデータロックを使用して、データベースオブジェクトへの同時アクセスを管理し、データの一貫性を確保します。セクション8.11.4「メタデータのロック」 を参照してください。 メタデータのロックは、テーブルのみでなく、スキーマ、ストアドプログラム (プロシージャ、ファンクション、トリガー、スケジュール済イベント)、テーブルスペース、GET_LOCK() 関数で取得されたユーザーロック (セクション12.15「ロック関数」 を参照)、および セクション5.6.8.1「ロックサービス」 で説明されているロックサービスで取得されたロックにも適用されます。

パフォーマンススキーマは、metadata_locks テーブルを介してメタデータロック情報を公開します:

  • 付与されているロック (現在どのセッションがどのメタデータロックを所有しているかが表示されます)。

  • リクエストされたがまだ付与されていないロック (どのセッションがどのメタデータロックを待機しているかを示します)。

  • デッドロック検出機能によって強制終了されたロックリクエスト。

  • タイムアウトし、リクエストしているセッションロックリクエストが破棄されるのを待機しているロックリクエスト。

この情報を使用すると、セッション間のメタデータロックの依存性を理解できます。 セッションが待機しているロックだけでなく、そのロックを現在保持しているセッションも表示できます。

metadata_locks テーブルは読取り専用であり、更新できません。 デフォルトでは自動サイズ設定されています。テーブルサイズを構成するには、サーバーの起動時に performance_schema_max_metadata_locks システム変数を設定します。

メタデータロックインストゥルメンテーションでは、デフォルトで有効になっている wait/lock/metadata/sql/mdl インストゥルメントが使用されます。

サーバー起動時のメタデータロックインストゥルメンテーションの状態を制御するには、my.cnf ファイルで次のような行を使用します:

  • 有効化:

    [mysqld]
    performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'
  • 無効化:

    [mysqld]
    performance-schema-instrument='wait/lock/metadata/sql/mdl=OFF'

実行時にメタデータロックインストゥルメンテーションの状態を制御するには、setup_instruments テーブルを更新します:

  • 有効化:

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'YES', TIMED = 'YES'
    WHERE NAME = 'wait/lock/metadata/sql/mdl';
  • 無効化:

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'NO', TIMED = 'NO'
    WHERE NAME = 'wait/lock/metadata/sql/mdl';

パフォーマンススキーマは、LOCK_STATUS カラムを使用して各ロックのステータスを示す metadata_locks テーブルの内容を次のように保守します:

  • メタデータロックがリクエストされてすぐに取得されると、ステータスが GRANTED の行が挿入されます。

  • メタデータロックがリクエストされ、すぐに取得されない場合、ステータスが PENDING の行が挿入されます。

  • 以前にリクエストされたメタデータロックが付与されると、その行ステータスは GRANTED に更新されます。

  • メタデータロックが解放されると、その行は削除されます。

  • デッドロック検出でデッドロック (ER_LOCK_DEADLOCK) を解除するために保留中のロックリクエストが取り消されると、その行ステータスが PENDING から VICTIM に更新されます。

  • 保留中のロックリクエスト (ER_LOCK_WAIT_TIMEOUT) がタイムアウトすると、その行ステータスが PENDING から TIMEOUT に更新されます。

  • ロックまたは保留中のロックリクエストが強制終了されると、その行ステータスが GRANTED または PENDING から KILLED に更新されます。

  • VICTIMTIMEOUT および KILLED のステータス値は簡潔で、ロック行が削除されようとしていることを示します。

  • PRE_ACQUIRE_NOTIFY および POST_RELEASE_NOTIFY のステータス値は簡潔であり、ロック取得操作の開始中またはロック解放操作の終了中に、メタデータロックサブシステムが関連するストレージエンジンに通知していることを示します。

metadata_locks テーブルには、次のカラムがあります:

  • OBJECT_TYPE

    メタデータロックサブシステムで使用されるロックのタイプ。 値は、GLOBAL, SCHEMA, TABLE, FUNCTION, PROCEDURE, TRIGGER (現在未使用)、EVENT, COMMIT, USER LEVEL LOCK, TABLESPACE または LOCKING SERVICE のいずれかです。

    USER LEVEL LOCK の値は、GET_LOCK() で取得されたロックを示します。 LOCKING SERVICE の値は、セクション5.6.8.1「ロックサービス」 で説明されているロックサービスで取得されたロックを示します。

  • OBJECT_SCHEMA

    オブジェクトを格納するスキーマ。

  • OBJECT_NAME

    インストゥルメントされたオブジェクトの名前。

  • OBJECT_INSTANCE_BEGIN

    インストゥルメントされたオブジェクトのメモリー内のアドレス。

  • LOCK_TYPE

    メタデータロックサブシステムからのロックタイプ。 値は、INTENTION_EXCLUSIVE, SHARED, SHARED_HIGH_PRIO, SHARED_READ, SHARED_WRITE, SHARED_UPGRADABLE, SHARED_NO_WRITE, SHARED_NO_READ_WRITE または EXCLUSIVE のいずれかです。

  • LOCK_DURATION

    メタデータロックサブシステムからのロック期間。 値は、STATEMENTTRANSACTION または EXPLICIT のいずれかです。 STATEMENT および TRANSACTION の値は、それぞれステートメントまたはトランザクションの終了時に暗黙的に解放されるロックを示します。 EXPLICIT の値は、残りのステートメントまたはトランザクションが終了し、FLUSH TABLES WITH READ LOCK で取得されたグローバルロックなどの明示的なアクションによって解放されるロックを示します。

  • LOCK_STATUS

    メタデータロックサブシステムからのロックステータス。 値は、PENDING, GRANTED, VICTIM, TIMEOUT, KILLED, PRE_ACQUIRE_NOTIFY または POST_RELEASE_NOTIFY のいずれかです。 パフォーマンススキーマは、前述のようにこれらの値を割り当てます。

  • SOURCE

    イベントを生成した、インストゥルメントされたコードを格納するソースファイルの名前と、インストゥルメンテーションが行われたファイルの行番号。 これにより、ソースをチェックして、コードに含まれるものを正確に判断することができます。

  • OWNER_THREAD_ID

    メタデータロックをリクエストしているスレッド。

  • OWNER_EVENT_ID

    メタデータロックをリクエストしているイベント。

metadata_locks テーブルには次のインデックスがあります:

  • 主キー (OBJECT_INSTANCE_BEGIN)

  • (OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME) のインデックス

  • (OWNER_THREAD_IDOWNER_EVENT_ID) のインデックス

TRUNCATE TABLE は、metadata_locks テーブルに対して許可されていません。


関連キーワード:  テーブル, ロック, スキーマ, パフォーマンス, metadata, リクエスト, events, ステータス, replication, locks