Erro no MySQL: impossível gravar no log binário

8

Eu tenho um sistema (herdado de outra empresa de desenvolvimento) e ainda não conheço todos os seus recursos. Construção:
- cliente / aplicação web (symfony 1.4)
- DB - MySQL.

O projeto é implantado em 2 servidores:
1-st: servidor nginx + PHP + DB Master;
2º st: DB Slave.

Quando os dados são modificados pelo cliente da Web no DB Master, o DB Slave funciona bem e os dados têm um processo de replicação normal. Quando os dados são modificados pelo MySQL Management Client, tenho uma notificação:

Não é possível executar a instrução: impossível gravar no log binário, pois BINLOG_FORMAT = STATEMENT e pelo menos uma tabela usa um mecanismo de armazenamento limitado ao log baseado em linha. O InnoDB é limitado ao registro de linhas quando o nível de isolamento da transação é READ COMMITTED ou READ UNCOMMITTED

E então, o DB Slave cai e o processo de replicação é interrompido (inserção de erro ... entrada duplicada ...).

A notificação semelhante ocorre (nesta situação - erro) com o mesmo texto, quando tento inserir dados com o aplicativo / módulo java (ele roda dentro da transação) e, após a exceção, a transação é revertida e nenhuma modificação acontece.

Como posso resolver esse problema e fazer o sistema funcionar e possibilitar que dados modificados no DB Master e no DB Slaves funcionem no modo normal?

Chaki_Black
fonte

Respostas:

18

Existem 3 métodos que o MySQL pode usar para gravar nos logs binários:

  1. DECLARAÇÃO

    Isso significa que todas as instruções SQL no mestre são registradas no log e executadas no escravo. Isso pode causar problemas se a instrução SQL contiver instruções como "NOW ()", "RAND ()" e qualquer coisa não determinística. Isso também requer suporte do mecanismo de armazenamento em uso.

  2. LINHA

    Isso significa que todas as linhas que são alteradas por uma instrução são registradas individualmente no log binário. Isso fornece logs binários maiores (geralmente) do que o log baseado em instruções, mas quase sempre é garantido para fornecer a replicação exata necessária.

  3. MISTURADO

    Isso permite que o MySQL escolha entre o registro binário e baseado em linha, conforme necessário.

Se você estiver recebendo esse erro, uma sugestão é alterar a variável BINLOG_FORMAT para MIXED. Isso permite que o MySQL alterne automaticamente entre os logs baseados em ROW e STATEMENT, conforme necessário.

Phil Sumner
fonte
Direita! Excelente!
Chaki_Black
4
Uma excelente sugestão, mas como você muda BINLOG_FORMAT?
Trebor rude
2
Pode ser muito tarde, mas, ele pode ajudar para todos aqueles que querem saber como mudar BINLOG_FORMAT dba.stackexchange.com/questions/6150/...
Vivek Dhayalan
Trebor Rude: Você deve ler a documentação do mysql, que explica isso em detalhes! dev.mysql.com/doc/refman/5.6/en/…
Lifeboy
Esta resposta me ajuda a resolver o problema. Obrigado!
Tung