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


44

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


1
INNODB_LOCK_WAITSおよびINNODB_LOCKSテーブルを照会できます。

回答:


39

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

MyISAMにとって、これは非常に簡単な「これが問題のクエリです」ソリューションはありません。常にプロセスリストから始める必要があります。ただし、印刷されたクエリが切り捨てられないように、完全なキーワードを含めるようにしてください。

SHOW FULL PROCESSLIST;

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

明らかでない場合は、SQL推論の能力を使用して、問題のSQLのどれが問題の原因であるかを判断する必要があります。


20

InnoDBを使用していて、実行中のクエリを確認する必要がある場合

show engine innodb status;

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

使用に関する問題SHOW PROCESSLISTは、他のクエリがキューに入れられない限り、ロックが表示されないことです。


20

試してくださいSHOW OPEN TABLES

show open tables where In_Use > 0 ;

これは、特に複数のデータベースと数百の接続がある場合に、使用中のロックをすぐに識別する最適な方法だと思います。
-nelaaro

7

このコマンドを使用する

SHOW PROCESSLIST

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


7

現在保持されているすべてのロックを表示できる回答はありません。

たとえば、ターミナルの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は空であり、ドキュメントを考えると意味があります。これは、トランザクションが1つしかなく、現在ロックを待機しているユーザーがいないためです。また、INNODB_LOCKSとにかく推奨されていません。

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

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

あなたは使用することができINFORMATION_SCHEMA.INNODB_TRXperformance_schema.events_statements_historyおよびperformance_schema.threadsに概説され、アクティブなトランザクションが過去に実行したことをクエリを抽出するために私の他の答えが、私はそれを参照するためにどのような方法に遭遇していないsomeTable上記のシナリオでロックされています。

これまでの他の回答の提案は、少なくとも助けにはなりません。

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


6

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

また、innotopツールの使用に関する詳細については、このリンクを参照してください。


4

この投稿からの参照。

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.