このページは機械翻訳したものです。
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 テーブルに対して許可されていません。