Was ist der sicherste Weg, um das Binlog-Format zur Laufzeit zu wechseln?

25

Wegen der folgenden Warnung in mysqld.log:

[Warnung] Unsichere Anweisung, die seit BINLOG_FORMAT = STATEMENT im Anweisungsformat in das Binärprotokoll geschrieben wurde. Die Anweisung ist nicht sicher, da sie eine LIMIT-Klausel verwendet. Dies ist nicht sicher, da die Anzahl der enthaltenen Zeilen nicht vorhergesagt werden kann.

Ich möchte das Replikationsformat ändern MIXED.

Aber laut dem MySQL-Dokument:

Das Umschalten des Replikationsformats zur Laufzeit wird nicht empfohlen, wenn temporäre Tabellen vorhanden sind, da temporäre Tabellen nur bei anweisungsbasierter Replikation protokolliert werden, während sie bei zeilenbasierter Replikation nicht protokolliert werden.

Die Frage ist also, wie ich feststellen kann, ob temporäre Tabellen vorhanden sind, um das Binärprotokollformat sicher umzuschalten.

Quanten
quelle
1
Schnelle Warnung. Beachten Sie dies, wenn Sie RBR-> SBR verwenden und read- commit ausführen
Morgan Tocker,

Antworten:

35

Da ein Binlog in dem Moment, in dem Sie dies tun, ein bestimmtes Format hat, können Sie sich dafür entscheiden, nicht mit den beiden Formaten zusammen zu spielen, obwohl MySQL (eh Oracle [kann mir immer noch nicht die Zunge abreißen]) diese Funktion erstellt hat.

Versuchen Sie Folgendes, um völlig sicher zu gehen, ohne dass ein Neustart von MySQL erforderlich ist:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Dies wird das letzte Binlog im 'MIXED'-Format belassen. Das vorletzte (vorletzte) Binlog existiert nur, um das letzte Binlog zu schließen, das im vorherigen Format war.

Alle vorhandenen Sitzungen vor der ersten FLUSH LOGS;werden ausgeführt und beginnen damit, in das letzte Binlog zu schreiben UNLOCK TABLES;.

Versuche es !!!

VORBEHALT

Wenn ich Kredit gebe, wo Kredit fällig ist, ist meine Antwort wirklich huckepack von @ Jonathans Antwort . Ich schließe und öffne darüber hinaus Binlogs. Er bekommt eine +1 dafür, dass er dies zuerst herausholt.

UPDATE 2011-10-12 13:58 EDT

Wenn Sie dies mit einem aktiven Master tun und es gibt einen oder mehrere Slaves, die von diesem Master repliziert werden, müssen Sie sich Sorgen machen, dass die Relay-Protokolle auch im neuen Format vorliegen. Folgendes können Sie tun:

Laufen Sie auf dem Slave STOP SLAVE;

Auf dem Master laufen diese:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Laufen Sie auf dem Slave START SLAVE;

Durch Ausführen STOP SLAVE;und START SLAVE;Drehen der Relay-Protokolle werden die neuen Einträge unabhängig vom Format repliziert. Möglicherweise möchten Sie die binlog_format-Änderung auch im Slave anwenden.

RolandoMySQLDBA
quelle
3
Beachten Sie, dass die Einstellungen für die MySQL-Replikation tatsächlich auf Client-Sitzungsbasis festgelegt werden. Durch Festlegen des globalen binlog_formats wird lediglich der Wert für NEUE Sitzungen geändert. Wenn Sie es also auf einem System ausführen, auf dem Clients dauerhaft verbunden sind, werden alle Änderungen, die Sie an den Einstellungen vornehmen, nicht sofort wirksam, selbst wenn Sie die hier angegebenen Lösch- und Sperrvorgänge ausführen. Sie werden erst wirksam, wenn die Clients verbunden sind Verbinden Sie sich erneut (oder stellen Sie den Wert in ihrer eigenen Sitzung ein, aber meiner Erfahrung nach ist die erste Sitzung wahrscheinlicher).
Austin Mills
Für die Neugierigen können Sie auch dieses "binlog_format = 'MIXED';" in deine my.cnf.
Christian
2
Zu Ihrer
Information
Im Handbuch heißt es : Das Ändern des Protokollierungsformats auf einem Replikationsmaster bewirkt nicht, dass ein Slave das Protokollierungsformat anpasst. (..snip ..) Das Ändern des Binärprotokollierungsformats auf dem Master während der Replikation oder ohne Änderung auch auf dem Slave kann daher zu unerwarteten Ergebnissen führen oder sogar dazu, dass die Replikation insgesamt fehlschlägt.
Halfgaar
@Halfgaar Erst in der vergangenen Woche habe ich drei Mal einen Sklaven von MIXED auf STATEMENT umgestellt, ohne negative Auswirkungen. Ich habe das gemacht, weil die Replikation aufgrund einer Racebedingung unterbrochen wurde. Die Tabelle war auf einem Slave vor der Ausführung der Abfrage nicht mehr vorhanden. Also bin ich zu STATEMENT gewechselt, um so eine Situation zu stabilisieren. Natürlich wurden alle Schreibvorgänge gestoppt, während ich dies tat. Übrigens habe ich auch den Meister gemacht.
RolandoMySQLDBA
6

Um binlog_format zur Laufzeit zu wechseln, können Sie Folgendes tun:

set global binlog_format = 'MIXED';

Dadurch werden alle NEUEN Sitzungen auf das gemischte Binlog-Format eingestellt. Alle vorhandenen Sitzungen bleiben bis zu ihrem Ende unverändert.

Sie können auch set session binlog_format = 'MIXED';manuell vorgehen, um Probleme mit der Sitzung spezifisch zu lösen.

Jonathan
quelle
Ich frage nicht nach dem Weg, ich frage nach dem sichersten Weg und wie kann ich prüfen, ob temporäre Tabellen vorhanden sind.
Quanten
3
Am sichersten ist es, wenn Sie zuerst die globale Variable festlegen und warten, bis die verbleibenden Sitzungen abgeschlossen sind.
Jonathan