Errore MySQL: impossibile scrivere nel registro binario


8

Ho un sistema (ereditato da un'altra società di sviluppo) e non ne conosco ancora tutte le funzionalità. Costruzione:
- client / applicazione web (symfony 1.4)
- DB - MySQL.

Il progetto è distribuito su 2 server:
1 °: server nginx + PHP + DB Master;
2 °: DB Slave.

Quando i dati vengono modificati dal client Web su DB Master, DB Slave funziona correttamente e i dati hanno un normale processo di replica. Quando i dati vengono modificati da MySQL Management Client, ricevo una notifica:

Impossibile eseguire l'istruzione: impossibile scrivere nel registro binario poiché BINLOG_FORMAT = STATEMENT e almeno una tabella utilizza un motore di archiviazione limitato alla registrazione basata su righe. InnoDB è limitato al log delle righe quando il livello di isolamento della transazione è LEGGI COMMITTATO o LEGGI NON COMUNITO

Quindi, DB Slave cade e il processo di replica si interrompe (inserimento errore ... voce duplicata ...).

La notifica simile si verifica (in questa situazione - errore) con lo stesso testo, quando provo a inserire dati con l'applicazione / modulo java (viene eseguito all'interno della transazione) e dopo l'eccezione, la transazione viene ripristinata e non si verificano modifiche.

Come posso risolvere questo problema e far funzionare il sistema e rendere possibile la modifica dei dati su DB Master e DB Slaves in modalità normale?

Risposte:


18

Esistono 3 metodi che MySQL può utilizzare per scrivere nei registri binari:

  1. DICHIARAZIONE

    Ciò significa che ogni istruzione SQL sul master viene registrata nel registro ed eseguita sullo slave. Ciò può causare problemi se l'istruzione SQL contiene istruzioni come "NOW ()", "RAND ()" e qualsiasi cosa non deterministica. Ciò richiede anche il supporto del motore di archiviazione in uso.

  2. RIGA

    Ciò significa che ogni riga modificata da un'istruzione viene registrata individualmente nel registro binario. Ciò fornisce registri binari più grandi (in genere) rispetto alla registrazione basata su istruzioni, ma è quasi sempre garantito che fornisca la replica esatta necessaria.

  3. MISTO

    Ciò consente a MySQL di scegliere tra la registrazione binaria e basata su righe come richiesto.

Se ricevi questo errore, un suggerimento è quello di cambiare la variabile BINLOG_FORMAT in MIXED. Ciò consente a MySQL di alternare automaticamente la registrazione basata su ROW e STATEMENT come richiesto.


Giusto! Eccellente!
Chaki_Black,

4
Un suggerimento eccellente, ma come si cambia BINLOG_FORMAT?
Trebor Rude,

2
Potrebbe essere molto tardi, ma può aiutare per tutti coloro che vogliono sapere come cambiare BINLOG_FORMAT dba.stackexchange.com/questions/6150/…
Vivek Dhayalan

Trebor Rude: dovresti leggere la documentazione mysql, che spiega questo in dettaglio! dev.mysql.com/doc/refman/5.6/en/…
Lifeboy

Questa risposta mi aiuta a risolvere il problema. Grazie!
Tung,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.