Como posso mostrar os bloqueios do mysql?

28

Existe alguma maneira de mostrar todos os bloqueios que estão ativos em um banco de dados mysql?

    
por Rory 06.07.2009 / 12:13

7 respostas

29

Veja o link de Marko para tabelas InnoDB e as advertências.

Para o MyISAM, não há uma solução fácil "esta é a consulta incorreta". Você deve sempre começar com uma lista de processos. Mas não se esqueça de incluir a palavra-chave completa para que as consultas impressas não sejam truncadas:

SHOW FULL PROCESSLIST;

Isso mostrará uma lista de todos os processos atuais, sua consulta e estado SQL. Agora, normalmente, se uma única consulta estiver causando o bloqueio de muitas outras, ela deverá ser fácil de identificar. As consultas afetadas terão um status de Locked e a consulta incorreta ficará sozinha, possivelmente esperando por algo intensivo, como uma tabela temporária.

Se não for óbvio, você terá que usar seus poderes de dedução de SQL para determinar qual parte do SQL incorreto pode ser a causa de seus problemas.

    
por 06.07.2009 / 12:47
11

Se você usa o InnoDB e precisa verificar as consultas em execução, recomendo

show engine innodb status;

como mencionado no link de Marko. Isso lhe dará a consulta de bloqueio, quantas linhas / tabelas estão bloqueadas por ele etc. Procure em TRANSACTIONS.

O problema com o uso de SHOW PROCESSLIST é que você não verá os bloqueios a menos que outras consultas estejam enfileiradas.

    
por 05.06.2014 / 09:42
9

Experimente SHOW OPEN TABLES :

show open tables where In_Use > 0 ;
    
por 09.05.2013 / 06:55
6

Usando este comando

SHOW PROCESSLIST

mostrará todo o processo atualmente em execução, incluindo o processo que adquiriu bloqueio nas tabelas.

    
por 06.07.2009 / 12:15
6

AFAIK ainda não existe uma maneira nativa no MYSQL, mas eu uso innotop . É grátis e tem muitas outras funcionalidades também.

Veja também este link para obter mais informações ao usar a ferramenta innotop.

    
por 06.07.2009 / 12:39
3

Referência retirada deste post

Você pode usar o script abaixo:

SELECT 
    pl.id
    ,pl.user
    ,pl.state
    ,it.trx_id 
    ,it.trx_mysql_thread_id 
    ,it.trx_query AS query
    ,it.trx_id AS blocking_trx_id
    ,it.trx_mysql_thread_id AS blocking_thread
    ,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl 
INNER JOIN information_schema.innodb_trx AS it
    ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
    ON it.trx_id = ilw.requesting_trx_id 
        AND it.trx_id = ilw.blocking_trx_id
    
por 20.06.2016 / 11:10
0

Nenhuma das respostas pode mostrar todos os bloqueios atualmente retidos.

Faça isso, por exemplo no mysql em um terminal.

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

É evidente que a transação acima contém um bloqueio, porque a transação ainda está ativa. Mas nenhuma consulta está acontecendo agora e ninguém está esperando por um bloqueio em qualquer lugar (ainda pelo menos).

INFORMATION_SCHEMA.INNODB_LOCKS está vazio, o que faz sentido, dada a documentação , porque há apenas uma transação e atualmente ninguém espera por nenhum bloqueio. Além disso, INNODB_LOCKS está obsoleto.

SHOW ENGINE INNODB STATUS é inútil: someTable não é mencionado em tudo

SHOW FULL PROCESSLIST está vazio, porque o culpado não está executando uma consulta agora.

Você pode usar INFORMATION_SCHEMA.INNODB_TRX , performance_schema.events_statements_history e performance_schema.threads para extrair as consultas que qualquer transação ativa executou no passado, conforme descrito em someTable está bloqueado no cenário acima.

As sugestões nas outras respostas até agora não ajudam pelo menos.

Disclaimer: Eu não tenho innotop instalado e não me incomodei. Talvez isso possa funcionar.

    
por 30.11.2018 / 01:05