Respostas:
SHOW ENGINE INNODB STATUS \G
Procure a seção -
TRANSACTIONS
Podemos usar tabelas INFORMATION_SCHEMA .
Consultas Úteis
Para verificar todas as transações de bloqueios que estão esperando:
USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;
Uma lista de transações de bloqueio:
SELECT *
FROM INNODB_LOCKS
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);
OU
SELECT INNODB_LOCKS.*
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);
Uma lista de bloqueios em uma mesa específica:
SELECT * FROM INNODB_LOCKS
WHERE LOCK_TABLE = db_name.table_name;
Uma lista de transações à espera de bloqueios:
SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';
Referência - Solução de problemas do MySQL: O que fazer quando as consultas não funcionam , Capítulo 6 - Página 96.
Se você não conseguir encontrar o processo bloqueando a tabela (porque ela já está morta), pode ser um thread ainda limpando assim
seção TRANSAÇÃO de
show engine innodb status;
no fim
---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up
conforme mencionado em um comentário em Clear transaction deadlock?
você pode tentar matar o thread de transação diretamente, aqui com
KILL 5208136;
trabalhou para mim.
Tive um problema semelhante com o Datagrip e nenhuma dessas soluções funcionou.
Assim que reiniciei o Datagrip Client, não era mais um problema e eu poderia descartar tabelas novamente.
INFORMATION_SCHEMA
banco de dados.