Por que meus deadlocks não são mostrados por SHOW ENGINE INNODB STATUS ;?

1

Eu tenho um cluster MariaDB ( 5.5.41 ) feito de 2 nós configurados como mestre-escravo. Todas as leituras e gravações são enviadas para o mesmo nó.

Eu tenho investigado alguns problemas de deadlock por algumas semanas.

Em uma base regular, meu aplicativo PHP retorna Message: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction.

Eu costumava executar SHOW ENGINE INNODB STATUS; e veria o último impasse, mas por algum motivo, após uma pequena alteração de configuração irrelevante (alterando innodb_buffer_pool_instances de 1 para 19) e uma reinicialização de ambos os nós, fazendo um SHOW ENGINE INNODB STATUS; não mostrará nenhum impasse.

No entanto, se eu me conectar com meu cliente mysql e criar manualmente transações resultando em um deadlock, o comando de status mostrará o deadlock.

Eu tentei tocar innodb_print_all_deadlocks ON e OFF. Nada é mostrado no mysql-error.log , exceto pelo meu deadlock acionado manualmente.

Por que os deadlocks criados pelo meu aplicativo PHP não estão mais sendo exibidos?

    
por liquidity 20.04.2017 / 20:47

3 respostas

1

Eu não acho que posso responder sua pergunta diretamente, dada a minha falta de acesso aos seus sistemas e as informações fornecidas. No entanto, aqui estão algumas ferramentas AWESOME que usei para lidar melhor com todas as variedades de bancos de dados derivados do MySQL que me foram cobrados pela administração.

InnoTop : link

Confira o comando "D" na página do manual innotop:

       D: InnoDB Deadlocks
           This mode shows the transactions involved in the last InnoDB
           deadlock.  A second table shows the locks each transaction held and
           waited for.  A deadlock is caused by a cycle in the waits-for
           graph, so there should be two locks held and one waited for unless
           the deadlock information is truncated. [...]

Os comandos "K" e "L" também são potencialmente relevantes para você.

OBSERVAÇÃO: o innotop, para ser totalmente útil, pode precisar alterar as informações e configurações do esquema e incluir um banco de dados de 'teste' para coletar informações. LER TODA A PÁGINA DO HOMEM para saber em que você está se metendo antes de mudar cegamente seu banco de dados. (Pessoalmente, eu amo a informação extra que as mudanças no notnot revelam ...)

Menos diretamente relevante para o seu problema de bloqueio, mas muito útil, no entanto:

O Percona Toolkit (antigo MAATKIT): link

Boa sorte!

    
por 04.06.2017 / 22:14
0

É bastante intrigante que show engine innodb status não esteja fornecendo as informações de impasse necessárias. No entanto, você pode verificar os deadlocks executando mysqladmin debug , que registra todos os bloqueios e também os bloqueios LOCK TABLE, que não são mostrados por show engine innodb status neste caso.

Esses problemas às vezes aparecem em momentos errados e gasta muito tempo. Eu pessoalmente uso Monyog para monitorar o que também faz isso. Você pode tentar usar o teste se nada funcionar.

    
por 09.05.2017 / 08:15
-1

Coisas para fazer na seção [mysqld] do my.cnf / ini

innodb_print_all_deadlocks=ON  # for error log documentation & be proactive in correcting.
log_error=(a valid filename)  # to write to  RTM
innodb_buffer_pool_instances=8  # from 19 would be adequate RAM overhead
    
por 08.02.2018 / 23:06