テーブルに対してDDLを実行しようとするとSHOW PROCESSLIST
、「テーブルメタデータロックを待機しています」というメッセージが表示されます。
どのトランザクションがまだクローズされていないかを確認するにはどうすればよいですか?
MySQLv5.5.24を使用しています。
テーブルに対してDDLを実行しようとするとSHOW PROCESSLIST
、「テーブルメタデータロックを待機しています」というメッセージが表示されます。
どのトランザクションがまだクローズされていないかを確認するにはどうすればよいですか?
MySQLv5.5.24を使用しています。
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ページ。
テーブルをロックしているプロセスが見つからない場合(すでに死んでいるため)、スレッドはまだこのようにクリーンアップされている可能性があります
セクショントランザクション
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;
私のために働いた。
mysql 5.7は、 performance_schema.metadata_locks
テーブルを介してメタデータロック情報を公開します。
ここにドキュメント
Datagripでも同様の問題が発生しましたが、これらのソリューションはいずれも機能しませんでした。
Datagrip Clientを再起動すると、問題はなくなり、テーブルを再度削除できました。
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. |
+---------+------+-----------------------------------------------------------------------------------------------+
私はちょうどこの問題を抱えていました、そして上記のクエリのどれもロックを示しませんでした。しかし、この「Waiting fortablemetadatalock」メッセージで変更がロックされました。長時間実行されているクエリがあることがわかりました(2時間以上実行されていました)。私はそのクエリを強制終了し、変更はすぐにロック解除されました。