回答:
InnoDBテーブルと警告については、Markoのリンクを参照してください。
MyISAMにとって、これは非常に簡単な「これが問題のクエリです」ソリューションはありません。常にプロセスリストから始める必要があります。ただし、印刷されたクエリが切り捨てられないように、完全なキーワードを含めるようにしてください。
SHOW FULL PROCESSLIST;
これにより、現在のすべてのプロセス、それらのSQLクエリおよび状態のリストが表示されます。通常、単一のクエリが他の多くのクエリをロックしている場合は、簡単に識別できるはずです。影響を受けるクエリのステータスはにLocked
なり、問題のクエリは単独で座って、一時テーブルのような集中的なものを待機する可能性があります。
明らかでない場合は、SQL推論の能力を使用して、問題のSQLのどれが問題の原因であるかを判断する必要があります。
試してくださいSHOW OPEN TABLES
:
show open tables where In_Use > 0 ;
現在保持されているすべてのロックを表示できる回答はありません。
たとえば、ターミナルの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_TRX
、performance_schema.events_statements_history
およびperformance_schema.threads
に概説され、アクティブなトランザクションが過去に実行したことをクエリを抽出するために私の他の答えが、私はそれを参照するためにどのような方法に遭遇していないsomeTable
上記のシナリオでロックされています。
これまでの他の回答の提案は、少なくとも助けにはなりません。
免責事項:innotopをインストールしておらず、気にしませんでした。おそらくそれでうまくいくかもしれません。
以下のスクリプトを使用できます。
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