web-dev-qa-db-ja.com

ロックされたテーブルの検出(LOCK TABLEによりロック)

MySQLでロックされたテーブルを検出する方法はありますか? LOCK TABLE table WRITE/READコマンドによってロックされたテーブルを意味します。

namedGET_LOCKで取得したロックの検出に関心のある読者は、 get_lockからの現在のロックをすべて表示 を読む必要があります)

49
Marcin

SHOW OPEN TABLESは、各テーブルのステータスとそのロックを表示します。

名前付きロックの場合は、 get_lockの現在のロックをすべて表示

17
confiq

つかいます SHOW OPEN TABLEShttp://dev.mysql.com/doc/refman/5.1/en/show-open-tables.html

このようなことができます

SHOW OPEN TABLES WHERE `Table` LIKE '%[TABLE_NAME]%' AND `Database` LIKE '[DBNAME]' AND In_use > 0;

データベース内のロックされたテーブルをチェックします。

55
Aruman

SHOW OPEN TABLESを使用して、各テーブルのロック状態を表示できます。コマンドのドキュメントページの詳細は here です。

44
Marc B

最も簡単な方法は次のとおりです。

SHOW OPEN TABLES WHERE In_use > 0

現在のデータベースのロックされたテーブルのみを取得します。

GET_LOCK(lockName、timeOut)を使用して独自のロックを作成できます。

テーブルをロックする前にタイムアウトが0でGET_LOCK(lockName, 0)を実行し、それに続いてRELEASE_LOCK(lockName)を実行すると、GET_LOCK()を実行する他のすべてのスレッドは値が0の場合、ロックが別のスレッドによって保持されていることを通知します。

ただし、テーブルをロックする前にGET_LOCK()を呼び出すすべてのスレッドがない場合、これは機能しません。テーブルをロックするためのドキュメントは here です

お役に立てば幸いです!

4
Giles Smith

この 記事 は、ロックされたMySQLリソースに関する情報を取得する方法を説明しています。 mysqladmin debugも役に立つかもしれません。

Performance_schemaから関連するすべての詳細を取得することもできます。

SELECT
OBJECT_SCHEMA
,OBJECT_NAME
,GROUP_CONCAT(DISTINCT EXTERNAL_LOCK)
FROM performance_schema.table_handles 
WHERE EXTERNAL_LOCK IS NOT NULL

GROUP BY
OBJECT_SCHEMA
,OBJECT_NAME

これは次のように機能します

show open tables WHERE In_use > 0
1
Hannes Fischer