117

テーブルに対してDDLを実行しようとするとSHOW PROCESSLIST、「テーブルメタデータロックを待機しています」というメッセージが表示されます。

どのトランザクションがまだクローズされていないかを確認するにはどうすればよいですか?

MySQLv5.5.24を使用しています。

4

6 に答える 6

170

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

SHOW ENGINE INNODB STATUS \G

セクションを探す-

TRANSACTIONS

INFORMATION_SCHEMAテーブルを使用できます。

便利なクエリ

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

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ページ。

于 2012-10-31T10:24:09.333 に答える
64

テーブルをロックしているプロセスが見つからない場合(すでに死んでいるため)、スレッドはまだこのようにクリーンアップされている可能性があります

セクショントランザクション

show engine innodb status;

最後に

---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up

Clear Transaction Deadlockのコメントで言及されているように ?

トランザクションスレッドを直接強制終了してみてください。

 KILL 5208136;

私のために働いた。

于 2014-05-20T10:26:46.857 に答える
19

mysql 5.7は、 performance_schema.metadata_locksテーブルを介してメタデータロック情報を公開します。

ここにドキュメント

于 2016-03-23T10:40:43.723 に答える
8

Datagripでも同様の問題が発生しましたが、これらのソリューションはいずれも機能しませんでした。

Datagrip Clientを再起動すると、問題はなくなり、テーブルを再度削除できました。

于 2017-12-23T04:29:57.917 に答える
6

MySQLバージョン>=5.7.3の場合、パフォーマンススキーマがメタデータロック情報を公開するようになりました。 https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html

このクエリを実行して、メタデータロックを保持しているユーザーを確認します

SELECT OBJECT_TYPE,
       OBJECT_SCHEMA,
       OBJECT_NAME,
       LOCK_TYPE,
       LOCK_STATUS,
       THREAD_ID,
       PROCESSLIST_ID,
       PROCESSLIST_INFO
FROM performance_schema.metadata_locks
INNER JOIN performance_schema.threads ON THREAD_ID = OWNER_THREAD_ID
WHERE PROCESSLIST_ID <> CONNECTION_ID();

受け入れられた回答でクエリを実行しようとすると、次のようになりました。

Empty set, 1 warning (0.001 sec)

その1つの警告を確認したところ、INNODB_LOCK_WAITS非推奨であることがわかりました。

MySQL [ebdb]> SHOW WARNINGS;
+---------+------+-----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                       |
+---------+------+-----------------------------------------------------------------------------------------------+
| Warning | 1681 | 'INFORMATION_SCHEMA.INNODB_LOCK_WAITS' is deprecated and will be removed in a future release. |
+---------+------+-----------------------------------------------------------------------------------------------+
于 2021-06-07T14:41:38.773 に答える
1

私はちょうどこの問題を抱えていました、そして上記のクエリのどれもロックを示しませんでした。しかし、この「Waiting fortablemetadatalock」メッセージで変更がロックされました。長時間実行されているクエリがあることがわかりました(2時間以上実行されていました)。私はそのクエリを強制終了し、変更はすぐにロック解除されました。

于 2021-04-19T18:15:46.320 に答える