Ver os últimos deadlocks do innodb

12

Vejo que consigo visualizar o último impasse no mysql / innodb, mas existe uma maneira de visualizar os impasses anteriores? Temos dois problemas de impasse, um sendo importante e o outro não. O impasse menos importante acontece várias vezes ao dia, tornando-se o impasse "mais recente".

gwgeller
fonte

Respostas:

15

Há uma configuração que foi introduzida no MySQL 5.5.30: innodb_print_all_deadlocks

Quando essa opção está ativada, as informações sobre todos os conflitos nas transações do usuário do InnoDB são registradas no log de erros do mysqld. Caso contrário, você verá informações apenas sobre o último impasse, usando o comando SHOW ENGINE INNODB STATUS. Um impasse ocasional do InnoDB não é necessariamente um problema, porque o InnoDB detecta a condição imediatamente e reverte uma das transações automaticamente. Você pode usar esta opção para solucionar os problemas dos bloqueios, se um aplicativo não tiver uma lógica de tratamento de erros apropriada para detectar a reversão e tentar novamente sua operação. Um grande número de deadlocks pode indicar a necessidade de reestruturar transações que emitem instruções DML ou SELECT ... FOR UPDATE para várias tabelas, para que cada transação acesse as tabelas na mesma ordem, evitando a condição de deadlock.

Basta adicionar essa configuração a my.cnf

[mysqld]
innodb_print_all_deadlocks = 1

ou

[mysqld]
innodb_print_all_deadlocks = on

Você não precisa reiniciar o mysql. Apenas entre no mysql e execute

mysql> SET GLOBAL innodb_print_all_deadlocks = 1;

or

mysql> SET GLOBAL innodb_print_all_deadlocks = 'ON';

Essa configuração também é nova para mim.

Experimente e nos diz tudo o que você pensa !!!

RolandoMySQLDBA
fonte
Estamos executando o 5.5.34. Existem opções para a nossa versão?
gwgeller
Meu erro. Está em 5.5 dev.mysql.com/doc/refman/5.5/en/… . Vou atualizar minha resposta.
RolandoMySQLDBA
Funciona como anunciado, obrigado! Alterei a configuração usando o sql para não precisar reiniciar. Coincidentemente, alguns dos impasses menos graves ocorreram e apareceram no log de erros.
gwgeller
Definir o valor em tempo de execução não funciona para mim, ele não grava nada no log de erros.
Lapo
11
@ Jordan AWS nunca fornece SUPER e mencionei isso há 6 anos: dba.stackexchange.com/questions/34525/… . Eles usam gatilhos para garantir que você não possa invadir mysql.usere executar FLUSH PRIVILEGES;.
RolandoMySQLDBA 18/09/19