web-dev-qa-db-ja.com

mysqlロックを表示するにはどうすればよいですか?

Mysqlデータベースでアクティブなすべてのロックを表示する方法はありますか?

54
Rory

InnoDBテーブルと警告については、Markoのリンクを参照してください。

MyISAMの場合、「これは問題のあるクエリです」という簡単な解決策はありません。常にプロセスリストから始める必要があります。ただし、表示されるクエリが切り捨てられないように、完全なキーワードを必ず含めてください。

SHOW FULL PROCESSLIST;

これにより、現在のすべてのプロセス、SQLクエリ、および状態のリストが表示されます。さて、通常、単一のクエリが他の多くのクエリをロックさせている場合は、簡単に特定できます。影響を受けるクエリのステータスはLockedになり、問題のあるクエリは単独で待機し、一時テーブルなどの集中的な何かを待機している可能性があります。

それが明らかでない場合は、SQL控除の能力を使用して、問題のあるSQLのどの部分が問題の原因であるかを判別する必要があります。

47
Dan Carley

InnoDBを使用していて、実行中のクエリをチェックする必要がある場合は、

show engine innodb status;

マルコのリンクで述べたように。これにより、ロッキングクエリ、ロックされている行/テーブルの数などがわかります。トランザクションの下を確認します。

SHOW PROCESSLISTを使用する場合の問題は、他のクエリがキューに登録されていない限り、ロックが表示されないことです。

26
Polymorphix

試してみてください SHOW OPEN TABLES

show open tables where In_Use > 0 ;
24
M Sleman

いずれの回答も、現在保持されているすべてのロックを示すことはできません。

これを行います。端末のmysqlで。

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

トランザクションがまだアクティブであるため、上記のトランザクションは明らかにロックを保持しています。しかし、現時点ではクエリは実行されておらず、どこでも(少なくとも)ロックを待機しているユーザーはいません。

INFORMATION_SCHEMA.INNODB_LOCKSは空です。 documentation を指定すると、トランザクションが1つしかなく、現在誰もロックを待機していないため、これは理にかなっています。また、INNODB_LOCKSは非推奨です。

SHOW ENGINE INNODB STATUSは役に立たない:someTableはまったく言及されていない

SHOW FULL PROCESSLISTは空です。これは、犯人が現在実際にクエリを実行していないためです。

INFORMATION_SCHEMA.INNODB_TRXperformance_schema.events_statements_history、およびperformance_schema.threadsを使用して、 my other answer で概説されているように、過去にアクティブなトランザクションが実行したクエリを抽出できますが、上記のシナリオでsomeTableがロックされていることを確認する方法はありません。

これまでの他の回答の提案は、少なくとも役に立ちません。

免責事項:私はinnotopをインストールしておらず、気にしませんでした。たぶんうまくいくかもしれない

11
Peter V. Mørch

このコマンドを使用する

SHOW PROCESSLIST

テーブルのロックを取得したプロセスを含む、現在実行中のすべてのプロセスが表示されます。

7
Arie K

私の知る限り、MYSQLにはまだネイティブな方法はありませんが、私は innotop を使用しています。これは無料で、他にもたくさんの機能があります。

Innotopツールの使用についての詳細は this link も参照してください。

7
Marko Carter

この投稿から引用した参考文献

以下のスクリプトを使用できます。

SELECT 
    pl.id
    ,pl.user
    ,pl.state
    ,it.trx_id 
    ,it.trx_mysql_thread_id 
    ,it.trx_query AS query
    ,it.trx_id AS blocking_trx_id
    ,it.trx_mysql_thread_id AS blocking_thread
    ,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl 
INNER JOIN information_schema.innodb_trx AS it
    ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
    ON it.trx_id = ilw.requesting_trx_id 
        AND it.trx_id = ilw.blocking_trx_id
5
Anvesh