1. ホーム
  2. mysql

[解決済み] どのトランザクションが「テーブルメタデータのロック待ち」状態を引き起こしているかを確認するにはどうすればよいですか?

2022-03-12 22:10:08

質問

あるテーブルに対してDDLを実行しようとしているのですが SHOW PROCESSLIST の結果、「Waiting for table metadata lock "」というメッセージが表示されます。

どのトランザクションがまだ終了していないのかを知るにはどうしたらよいですか?

MySQL v5.5.24を使用しています。

解決方法を教えてください。

MySqlのバージョン5.7.3で動作します。

SHOW ENGINE INNODB STATUS \G

セクションを探す

TRANSACTIONS

を使用することができます。 情報スキーマ テーブルです。

便利なクエリ

トランザクションが待機しているすべてのロックについて確認する。

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 INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

特定のテーブルに対するロックのリスト。

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';

参考文献 - MySQL のトラブルシューティング。クエリが動作しないときの対処方法 第6章 - 96ページ