Mysqlデータベースでアクティブなすべてのロックを表示する方法はありますか?
InnoDBテーブルと警告については、Markoのリンクを参照してください。
MyISAMの場合、「これは問題のあるクエリです」という簡単な解決策はありません。常にプロセスリストから始める必要があります。ただし、表示されるクエリが切り捨てられないように、完全なキーワードを必ず含めてください。
SHOW FULL PROCESSLIST;
これにより、現在のすべてのプロセス、SQLクエリ、および状態のリストが表示されます。さて、通常、単一のクエリが他の多くのクエリをロックさせている場合は、簡単に特定できます。影響を受けるクエリのステータスはLocked
になり、問題のあるクエリは単独で待機し、一時テーブルなどの集中的な何かを待機している可能性があります。
それが明らかでない場合は、SQL控除の能力を使用して、問題のあるSQLのどの部分が問題の原因であるかを判別する必要があります。
InnoDBを使用していて、実行中のクエリをチェックする必要がある場合は、
show engine innodb status;
マルコのリンクで述べたように。これにより、ロッキングクエリ、ロックされている行/テーブルの数などがわかります。トランザクションの下を確認します。
SHOW PROCESSLIST
を使用する場合の問題は、他のクエリがキューに登録されていない限り、ロックが表示されないことです。
試してみてください 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
は空です。 documentation を指定すると、トランザクションが1つしかなく、現在誰もロックを待機していないため、これは理にかなっています。また、INNODB_LOCKS
は非推奨です。
SHOW ENGINE INNODB STATUS
は役に立たない:someTable
はまったく言及されていない
SHOW FULL PROCESSLIST
は空です。これは、犯人が現在実際にクエリを実行していないためです。
INFORMATION_SCHEMA.INNODB_TRX
、performance_schema.events_statements_history
、およびperformance_schema.threads
を使用して、 my other answer で概説されているように、過去にアクティブなトランザクションが実行したクエリを抽出できますが、上記のシナリオでsomeTable
がロックされていることを確認する方法はありません。
これまでの他の回答の提案は、少なくとも役に立ちません。
免責事項:私はinnotopをインストールしておらず、気にしませんでした。たぶんうまくいくかもしれない。
このコマンドを使用する
SHOW PROCESSLIST
テーブルのロックを取得したプロセスを含む、現在実行中のすべてのプロセスが表示されます。
以下のスクリプトを使用できます。
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