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
に更新されます。VICTIM
、TIMEOUT
および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
メタデータロックサブシステムからのロック期間。 値は、
STATEMENT
、TRANSACTION
または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_ID
、OWNER_EVENT_ID
) のインデックス
TRUNCATE TABLE
は、metadata_locks
テーブルに対して許可されていません。