Como descubro qual transação está causando um estado de “Aguardando bloqueio de metadados da tabela”?

95

Estou tentando executar algum DDL em uma tabela e SHOW PROCESSLISTresulta 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.

Desenhou
fonte

Respostas:

146
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.

Joddy
fonte
17
Informamos que todas as tabelas referenciadas estão no INFORMATION_SCHEMAbanco de dados.
Michael Mior
9
Essas tabelas InnoDB realmente contêm informações sobre bloqueios de metadados? Esta postagem do blog sugere o contrário: mysql.wisborg.dk/2014/01/13/…
Gareth
1
@Gareth: funciona até mysql -mysql-5-7-3-. Obrigado pela atualização.
Joddy de
11
todos esses tinham conjuntos vazios ... ainda há o bloqueio sendo mostrado na lista de processos ...
K2xL
1
Confira o comentário abaixo stackoverflow.com/a/36175882/362574
Joddy
50

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.

Thibault Ketterer
fonte
10

mysql 5.7 expõe informações de bloqueio de metadados por meio da performance_schema.metadata_lockstabela.

Documentação aqui

Hln
fonte
4

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.

jmcgrath207
fonte
3
reiniciar / reiniciar - a solução 100% funcional para quaisquer problemas do computador. No entanto, em Prod, as reinicializações nem sempre são possíveis
asgs
1
Eu tive o mesmo problema e fechar o DataGrip de repente derrubou todos os bloqueios. Isso é muito tempo perdido ..
ScottBurfieldMills