Estou tentando executar algum DDL em uma tabela e SHOW PROCESSLIST
resulta em uma mensagem "Aguardando bloqueio de metadados da tabela".
Como posso saber qual transação ainda não foi fechada?
Estou usando o MySQL v5.5.24.
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.
INFORMATION_SCHEMA
banco de dados.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
no fim
conforme mencionado em um comentário em Clear transaction deadlock?
você pode tentar matar o thread de transação diretamente, aqui com
trabalhou para mim.
fonte
mysql 5.7 expõe informações de bloqueio de metadados por meio da
performance_schema.metadata_locks
tabela.Documentação aqui
fonte
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.
fonte