A partir de um script, enviei uma consulta como essa milhares de vezes ao meu banco de dados local:
update some_table set some_column = some_value
Esqueci de adicionar a parte where, de modo que a mesma coluna foi definida com o mesmo valor para todas as linhas da tabela e isso foi feito milhares de vezes e a coluna foi indexada; portanto, o índice correspondente provavelmente foi atualizado muitas vezes .
Percebi que algo estava errado, porque demorou muito, então matei o script. Até reinicializei meu computador desde então, mas algo ficou preso na tabela, porque consultas simples demoram muito tempo para serem executadas e quando tento soltar o índice relevante, ele falha com esta mensagem:
Lock wait timeout exceeded; try restarting transaction
É uma tabela innodb, então a transação está presa provavelmente está implícita. Como posso corrigir esta tabela e remover a transação bloqueada?
fonte
SHOW FULL PROCESSLIST
?Respostas:
Eu tive um problema semelhante e resolvi-o verificando os threads em execução. Para ver os threads em execução, use o seguinte comando na interface da linha de comandos do mysql:
Também pode ser enviado a partir do phpMyAdmin se você não tiver acesso à interface da linha de comandos do mysql.
Isso exibirá uma lista de threads com os IDs correspondentes e o tempo de execução, para que você possa MATAR os threads que estão demorando muito para serem executados. No phpMyAdmin, você terá um botão para interromper os threads usando o KILL, se estiver usando a interface da linha de comandos, use o comando KILL seguido pelo ID do thread, como no exemplo a seguir:
Isso encerrará a conexão para o encadeamento correspondente.
fonte
Você pode verificar as transações atualmente em execução com
Sua transação deve ser uma das primeiras, porque é a mais antiga da lista. Agora pegue o valor
trx_mysql_thread_id
e envie oKILL
comando:Se não tiver certeza de qual transação é sua, repita a primeira consulta com muita frequência e veja quais transações persistem.
fonte
Verifique o status do InnoDB para bloqueios
Verifique as tabelas abertas do MySQL
Verificar transações pendentes do InnoDB
Verificar dependência de bloqueio - o que bloqueia o que
Após investigar os resultados acima, você poderá ver o que está bloqueando o que.
A causa raiz do problema também pode estar no seu código - verifique as funções relacionadas, especialmente para anotações, se você usar JPA como o Hibernate.
Por exemplo, conforme descrito aqui , o uso incorreto da seguinte anotação pode causar bloqueios no banco de dados:
fonte
SELECT * FROM information_schema.innodb_trx t JOIN information_schema.processlist p ON t.trx_mysql_thread_id = p.id
revelou o culpado: O thread bloqueio veio do meu no endereço IP ... eu tinha esquecido de fechar um console de depuração que eu tinha deixado no meio de uma transação ...Isso começou a acontecer comigo quando o tamanho do meu banco de dados aumentou e eu estava fazendo muitas transações nele.
A verdade é que provavelmente existe uma maneira de otimizar suas consultas ou seu banco de dados, mas tente essas 2 consultas para solucionar o problema.
Rode isto:
E então isso:
fonte
Ao estabelecer uma conexão para uma transação, você adquire um bloqueio antes de executar a transação. Se não conseguir adquirir o bloqueio, tente por algum tempo. Se o bloqueio ainda não puder ser obtido, o erro de tempo de espera excedido será acionado. Por que você não poderá adquirir um bloqueio é que não está fechando a conexão. Portanto, quando estiver tentando obter um bloqueio pela segunda vez, não será possível adquiri-lo, pois sua conexão anterior ainda está fechada e mantendo o bloqueio.
Solução: feche a conexão ou
setAutoCommit(true)
(de acordo com o seu design) para liberar a trava.fonte
Reinicie o MySQL, ele funciona bem.
Mas cuidado, se essa consulta estiver emperrada, há um problema em algum lugar:
LIKE %...%
, etc.)Como o @syedrakib disse, funciona, mas essa não é uma solução duradoura para a produção.
Cuidado: reiniciar pode afetar seus dados com um estado inconsistente.
Além disso, você pode verificar como o MySQL manipula sua consulta com a palavra-chave EXPLAIN e ver se há algo possível para acelerar a consulta (índices, testes complexos, ...).
fonte
Ir para processos no mysql.
Então, pode ver que ainda há tarefas funcionando.
Mate o processo específico ou aguarde até que o processo seja concluído.
fonte
Encontrei o mesmo problema com uma declaração de "atualização". Minha solução foi simplesmente executar as operações disponíveis no phpMyAdmin para a tabela. Otimizei, lavei e desfragmentei a tabela (não nessa ordem). Não há necessidade de descartar a tabela e restaurá-la do backup para mim. :)
fonte
Eu tive o mesmo problema. Eu acho que foi um problema de impasse com o SQL. Você pode apenas forçar o fechamento do processo SQL no Gerenciador de tarefas. Se isso não corrigir, basta reiniciar o computador. Você não precisa soltar a tabela e recarregar os dados.
fonte
Eu tive esse problema ao tentar excluir um determinado grupo de registros (usando o MS Access 2007 com uma conexão ODBC com o MySQL em um servidor web). Normalmente, eu excluiria certos registros do MySQL e depois os substituiria por registros atualizados (excluir em cascata vários registros relacionados, isso simplifica a exclusão de todos os registros relacionados para uma única exclusão de registro).
Tentei executar as operações disponíveis no phpMyAdmin para a tabela (otimizar, liberar, etc), mas estava recebendo uma permissão necessária para RELOAD o erro quando tentei liberar. Como meu banco de dados está em um servidor web, não foi possível reiniciar o banco de dados. Restaurar a partir de um backup não era uma opção.
Tentei executar a consulta de exclusão desse grupo de registros no acesso do cPanel mySQL na web. Recebeu a mesma mensagem de erro.
Minha solução: usei o MySQL Query Browser da Sun (Oracle) gratuito (que eu instalei anteriormente no meu computador) e executei a consulta de exclusão lá. Funcionou imediatamente, problema resolvido. Pude executar novamente a função usando o script Access usando a conexão ODBC Access to MySQL.
fonte
Corrigido.
Verifique se você não possui inserção de tipo de dados incompatível na consulta. Eu tive um problema em que estava tentando "dados do agente do navegador do usuário"
VARCHAR(255)
e tendo problemas com esse bloqueio, no entanto, quando eu o alterei paraTEXT(255)
corrigi-lo.Portanto, provavelmente é uma incompatibilidade de tipo de dados.
fonte
Resolvi o problema descartando a tabela e restaurando-a do backup.
fonte