MySQL-Fehler: Es ist unmöglich, in das Binärprotokoll zu schreiben


8

Ich habe ein System (von einer anderen Entwicklungsfirma geerbt) und kenne noch nicht alle Funktionen. Aufbau:
- Web Client / Anwendung (Symfony 1.4)
- DB - MySQL.

Das Projekt wird auf 2 Servern bereitgestellt:
1. Nginx-Server + PHP + DB-Master;
2. DB-Slave.

Wenn Daten vom Webclient am DB Master geändert werden, funktioniert DB Slave einwandfrei und die Daten haben einen normalen Replikationsprozess. Wenn Daten vom MySQL Management Client geändert werden, erhalte ich eine Benachrichtigung:

Anweisung kann nicht ausgeführt werden: Schreiben in das Binärprotokoll nicht möglich, da BINLOG_FORMAT = STATEMENT und mindestens eine Tabelle eine Speicher-Engine verwendet, die auf die zeilenbasierte Protokollierung beschränkt ist. InnoDB ist auf die Zeilenprotokollierung beschränkt, wenn die Transaktionsisolationsstufe READ COMMITTED oder READ UNCOMMITTED ist

Und dann fällt DB Slave aus und der Replikationsprozess bricht ab (Fehler einfügen ... doppelter Eintrag ...).

Die ähnliche Benachrichtigung erfolgt (in dieser Situation - Fehler) mit demselben Text, wenn ich versuche, Daten mit einer Java-Anwendung / einem Java-Modul einzufügen (es wird innerhalb der Transaktion ausgeführt), und nach einer Ausnahme wird die Transaktion zurückgesetzt und es werden keine Änderungen vorgenommen.

Wie kann ich dieses Problem lösen und das System funktionsfähig machen und es ermöglichen, dass Modifikatendaten auf DB Master und DB Slaves im normalen Modus funktionieren?

Antworten:


18

Es gibt 3 Methoden, mit denen MySQL in die Binärprotokolle schreiben kann:

  1. AUSSAGE

    Dies bedeutet, dass jede SQL-Anweisung auf dem Master im Protokoll aufgezeichnet und auf dem Slave ausgeführt wird. Dies kann zu Problemen führen, wenn die SQL-Anweisung Anweisungen wie "NOW ()", "RAND ()" und nicht deterministische Elemente enthält. Dies erfordert auch die Unterstützung der verwendeten Speicher-Engine.

  2. REIHE

    Dies bedeutet, dass jede Zeile, die durch eine Anweisung geändert wird, einzeln im Binärprotokoll aufgezeichnet wird. Dies führt (im Allgemeinen) zu größeren binären Protokollen als die anweisungsbasierte Protokollierung, es wird jedoch fast immer garantiert, dass genau die erforderliche Replikation erfolgt.

  3. GEMISCHT

    Dadurch kann MySQL je nach Bedarf zwischen binärer und zeilenbasierter Protokollierung wählen.

Wenn Sie diesen Fehler erhalten, besteht ein Vorschlag darin, die Variable BINLOG_FORMAT in MIXED zu ändern. Dadurch kann MySQL bei Bedarf automatisch zwischen ROW- und STATEMENT-basierter Protokollierung wechseln.


Recht! Ausgezeichnet!
Chaki_Black

4
Ein ausgezeichneter Vorschlag, aber WIE ändern Sie BINLOG_FORMAT?
Trebor Rude

2
Es kann sehr spät sein, aber es kann allen helfen, die wissen wollen, wie man BINLOG_FORMAT ändert. Dba.stackexchange.com/questions/6150/…
Vivek Dhayalan

Trebor Rude: Sie sollten die MySQL-Dokumentation lesen, in der dies ausführlich erklärt wird! dev.mysql.com/doc/refman/5.6/en/…
Lifeboy

Diese Antwort hilft mir, das Problem zu lösen. Vielen Dank!
Tung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.