「テーブル メタデータ ロックの待機中」状態を引き起こすトランザクションの特定
テーブルに対して DDL 操作を実行しようとすると、 SHOW PROCESSLIST の「テーブル メタデータ ロックを待機しています」メッセージ。これは、別のトランザクションがまだテーブルを参照しており、そのメタデータが変更されないことを示します。
トランザクションの識別
5.7.3 より前の MySQL バージョン:
MySQL バージョン 5.7 の場合.3 以降:
待機中のすべてのロック トランザクションを識別するには:
USE INFORMATION_SCHEMA; SELECT * FROM INNODB_LOCK_WAITS;
ブロックしているトランザクションを識別するには:
SELECT * FROM INNODB_LOCKS WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);
特定のテーブルのロックを識別するには:
SELECT * FROM INNODB_LOCKS WHERE LOCK_TABLE = db_name.table_name;
ロックを待機しているトランザクション:
SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY FROM INNODB_TRX WHERE TRX_STATE = 'LOCK WAIT';
出力例:
INNODB_LOCK_WAITS クエリは次のような出力を提供します:
... REQUESTING TRXs: trx id 10,mysql thread id 1161142,query SELECT ... trx id 16,mysql thread id 1161141,query SELECT ... ...
これは、トランザクション ID 10 と 16 がロックを待っていることを示します。提供されている他のクエリを使用して、ブロックしているトランザクションとロックされている特定のテーブルを特定することで、さらに分析を行うことができます。
以上がMySQL で「テーブル メタデータ ロックの待機中」を引き起こしているトランザクションを特定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。