Skip to content

Instantly share code, notes, and snippets.

@MatiasFernandez
Last active June 13, 2024 04:20
Show Gist options
  • Save MatiasFernandez/9f5ff5e725766a6b948dc3253f4cda56 to your computer and use it in GitHub Desktop.
Save MatiasFernandez/9f5ff5e725766a6b948dc3253f4cda56 to your computer and use it in GitHub Desktop.
MySQL: Useful queries to debug locks
SHOW ENGINE INNODB STATUS;
-- Transactions waiting for a lock, including blocking transaction details
SELECT
waiting_trx.trx_id AS waiting_trx_id,
waiting_trx.trx_started AS waiting_trx_started,
waiting_trx.trx_state AS waiting_trx_state,
waiting_trx.trx_rows_locked AS waiting_trx_rows_locked,
waiting_trx.trx_rows_modified AS waiting_trx_rows_modified,
waiting_trx.trx_mysql_thread_id AS waiting_thread,
waiting_trx.trx_query AS waiting_query,
requested_lock.lock_type AS req_lock_type,
requested_lock.lock_mode AS req_lock_mode,
requested_lock.lock_table AS req_lock_table,
requested_lock.lock_index AS req_lock_index,
requested_lock.lock_data AS req_lock_data,
blocking_trx.trx_id AS blocking_trx_id,
blocking_trx.trx_started AS blocking_trx_started,
blocking_trx.trx_state AS blocking_trx_state,
blocking_trx.trx_rows_locked AS blocking_trx_rows_locked,
blocking_trx.trx_rows_modified AS blocking_trx_rows_modified,
blocking_trx.trx_mysql_thread_id AS blocking_thread,
blocking_trx.trx_query AS blocking_query,
blocking_lock.lock_type AS blocking_lock_type,
blocking_lock.lock_mode AS blocking_lock_mode,
blocking_lock.lock_table AS blocking_lock_table,
blocking_lock.lock_index AS blocking_lock_index,
blocking_lock.lock_data AS blocking_lock_data
FROM information_schema.innodb_lock_waits AS lock_waits
LEFT JOIN information_schema.innodb_trx AS blocking_trx ON blocking_trx.trx_id = lock_waits.blocking_trx_id
LEFT JOIN information_schema.innodb_trx AS waiting_trx ON waiting_trx.trx_id = lock_waits.requesting_trx_id
LEFT JOIN information_schema.innodb_locks AS blocking_lock ON blocking_lock.lock_id = lock_waits.blocking_lock_id
LEFT JOIN information_schema.innodb_locks AS requested_lock ON requested_lock.lock_id = lock_waits.requested_lock_id
ORDER BY blocking_trx.trx_rows_locked DESC;
-- Transactions waiting for a lock, including blocking transaction details and statement events that were recently executed by the locking transaction thread
-- It requires events_statements_history_long performance schema consumer enabled: UPDATE performance_schema.setup_consumers SET enabled='YES' where name='events_statements_history_long';
SELECT
waiting_trx.trx_id AS waiting_trx_id,
waiting_trx.trx_started AS waiting_trx_started,
waiting_trx.trx_state AS waiting_trx_state,
waiting_trx.trx_rows_locked AS waiting_trx_rows_locked,
waiting_trx.trx_rows_modified AS waiting_trx_rows_modified,
waiting_trx.trx_mysql_thread_id AS waiting_process,
waiting_trx.trx_query AS waiting_query,
locks.lock_mode,
locks.lock_type,
locks.lock_table,
locks.lock_index,
locks.lock_data,
blocking_trx.trx_id AS blocking_trx_id,
blocking_trx.trx_started AS blocking_trx_started,
blocking_trx.trx_state AS blocking_trx_state,
blocking_trx.trx_rows_locked AS blocking_trx_rows_locked,
blocking_trx.trx_rows_modified AS blocking_trx_rows_modified,
blocking_trx.trx_mysql_thread_id AS blocking_process,
blocking_trx.trx_query AS blocking_query,
events_history.thread_id AS event_thread_id,
events_history.event_name AS event_name,
events_history.event_id AS event_id,
events_history.timer_start AS event_timer_start,
events_history.sql_text AS event_query
FROM information_schema.innodb_lock_waits AS lock_waits
LEFT JOIN information_schema.innodb_locks AS locks ON lock_waits.requested_lock_id = locks.lock_id
LEFT JOIN information_schema.innodb_trx AS blocking_trx ON blocking_trx.trx_id = lock_waits.blocking_trx_id
LEFT JOIN information_schema.innodb_trx AS waiting_trx ON waiting_trx.trx_id = lock_waits.requesting_trx_id
LEFT JOIN performance_schema.threads AS threads ON threads.processlist_id = blocking_trx.trx_mysql_thread_id
LEFT JOIN performance_schema.events_statements_history_long AS events_history ON threads.thread_id = events_history.thread_id
ORDER BY waiting_trx_id, blocking_trx_id, event_timer_start;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment