MySQL find what statement is causing a lock
Tested with MySQL 5.7.22.
Show open tables:
SHOW OPEN TABLES WHERE In_Use > 0;
This can reveal open tables due to lock waits.
Show processes information:
SHOW FULL PROCESSLIST;
This can reveal the lock waiting process's pending statement.
Show transactions information:
SHOW ENGINE INNODB STATUS;
The TRANSACTIONS
section can reveal the lock waiting transaction's pending statement.
Show transactions information:
SELECT * FROM information_schema.innodb_trx;
This can reveal each transaction's information like trx_id
, trx_state
(e.g. RUNNING
, LOCK WAIT
), trx_started
(time), trx_wait_started
(time), trx_mysql_thread_id
(PROCESSLIST ID, not thread ID), trx_query
.
Show InnoDB lock waits:
SELECT * FROM sys.innodb_lock_waits;
This can reveal each lock waiting transaction (waiting_trx_id
, waiting_pid
) and its corresponding lock holding transaction (blocking_trx_id
, blocking_pid
).
Use the blocking_pid
from sys.innodb_lock_waits
, we can find the corresponding thread ID from performance_schema.threads
. Then use the thread ID, we can find the last one and ten statements of the lock holding transaction from performance_schema.events_statements_current
and performance_schema.events_statements_history
:
SELECT
t1.waiting_trx_id,
t1.waiting_pid,
t2.THREAD_ID AS waiting_tid,
t1.wait_started,
t1.wait_age,
t1.waiting_query,
t1.locked_table,
t1.locked_index,
t1.locked_type,
t1.blocking_trx_id,
t1.blocking_trx_started,
t1.blocking_trx_age,
t1.blocking_pid,
t3.THREAD_ID AS blocking_tid,
t1.blocking_query,
t4.SQL_TEXT AS blocking_last_query,
t5.SQL_TEXT AS blocking_last_10_querys
FROM sys.innodb_lock_waits AS t1
LEFT JOIN performance_schema.threads AS t2
ON t1.waiting_pid = t2.PROCESSLIST_ID
LEFT JOIN performance_schema.threads AS t3
ON t1.blocking_pid = t3.PROCESSLIST_ID
LEFT JOIN performance_schema.events_statements_current AS t4
ON t3.THREAD_ID = t4.THREAD_ID
LEFT JOIN performance_schema.events_statements_history AS t5
ON t3.THREAD_ID = t5.THREAD_ID
ORDER BY t1.waiting_trx_id, t1.blocking_trx_id, t5.EVENT_ID;
Comments: