Jedes Binärlogformat hat seine Vor- und Nachteile. Dieser Abschnitt fasst diese zusammen, um Ihnen eine Einschätzung zu erlauben, welches Format in Ihrer speziellen Situation das geeignetere ist.
Vorteile der anweisungsbasierten Replikation:
Bewährte Technologie, seit MySQL 3.23 vorhanden.
Kleinere Logdateien. Wenn Änderungs- oder Löschvorgänge viele Datensätze betreffen, sind die Logdateien wesentlich kleiner. Kleinere Logdateien erfordern weniger Speicherplatz und sind schneller gesichert.
Logdateien enthalten alle Anweisungen, mit denen Änderungen vorgenommen wurden, d. h., sie können zur Überwachung der Datenbank verwendet werden.
Logdateien können nicht nur zu Replikationszwecken, sondern auch zur Point-in-Time-Wiederherstellung verwendet werden. Siehe auch Abschnitt 5.10.3, „Zeitpunktbezogene Wiederherstellung“.
Ein Slave kann eine neuere MySQL-Version mit einer anderen Datensatzstruktur verwenden.
Nachteile der anweisungsbasierten Replikation:
Nicht alle UPDATE
-Anweisungen können
repliziert werden: Jedes nichtdeterministische Verhalten
(z. B. bei der Verwendung von Zufallsfunktionen in einer
SQL-Anweisung) ist bei der anweisungsbasierten Replikation
schwer zu replizieren. Bei Anweisungen, die eine
nichtdeterministische benutzerdefinierte Funktion
(User-Defined Function, UDF) verwenden, ist die Replikation
des Ergebnisses bei der anweisungsbasierten Replikation
überhaupt nicht möglich (dagegen repliziert die
datensatzbasierte Replikation einfach den von der UDF
zurückgegebenen Wert).
Anweisungen können nicht korrekt repliziert werden, wenn sie eine UDF verwenden, die nichtdeterministisch ist (d. h. deren Wert von anderen Aspekten als den übergebenen Parametern abhängt).
Anweisungen können nicht korrekt repliziert werden, wenn sie eine der folgenden Funktionen enthalten:
LOAD_FILE()
UUID()
USER()
FOUND_ROWS()
Alle übrigen Funktionen (einschließlich
RAND()
, NOW()
,
LOAD DATA INFILE
usw.) werden korrekt
repliziert.
INSERT ... SELECT
erfordert eine höhere
Zahl von Sperren auf Datensatzebene als bei der
datensatzbasierten Replikation.
UPDATE
-Anweisungen, die einen Tabellenscan
erfordern (weil in der WHERE
-Klausel kein
Index verwendet wird), müssen eine höhere Anzahl von
Datensätzen sperren als bei der datensatzbasierten
Replikation.
(Nur bei InnoDB
) Eine
INSERT
-Anweisung, die
AUTO_INCREMENT
verwendet, blockiert andere,
nicht kollidierende INSERT
-Anweisungen.
Langsamere Umsetzung von Daten auf dem Slave bei komplexen Abfragen.
Gespeicherte Funktionen (nicht aber gespeicherte Prozeduren)
werden mit demselben NOW()
-Wert wie die
aufrufende Anweisung ausgeführt. (Dies kann abhängig von den
Umständen ein Vor- oder Nachteil sein.)
Deterministische UDFs müssen auf die Slaves angewendet werden.
Wenn am Slave etwas nicht stimmt, nehmen die Unterschiede zwischen Master und Slave im Laufe der Zeit zu.
Tabellen müssen auf dem Master und dem Slave (fast) identisch sein.
Vorteile der datensatzbasierten Replikation:
Alles kann repliziert werden. Dies ist die sicherste Form der
Replikation. Beachten Sie, dass zurzeit DDL-Anweisungen (Data
Definition Language) wie etwa CREATE TABLE
anweisungsbasiert repliziert werden, während bei
DML-Anweisungen (Data Manipulation Language) sowie bei
GRANT
- und
REVOKE
-Anweisungen die Replikation
datensatzbasiert erfolgt. Für Anweisungen wie CREATE
... SELECT
wird eine
CREATE
-Anweisung aus der Tabellendefinition
erstellt, die dann anweisungsbasiert repliziert wird, während
das Einfügen von Datensätzen datensatzbasiert repliziert
wird.
Die Technologie ist dieselbe wie bei den meisten anderen Datenbanksystemen – Kenntnisse anderer Systeme lassen sich einfach auf MySQL übertragen.
In vielen Fällen geht es bei Tabellen mit Primärschlüsseln schneller, wenn man die Daten auf den Slave anwendet.
Bei den folgenden Anweisungstypen werden weniger Sperren auf dem Master benötigt (was die Nebenläufigkeit erhöht):
INSERT ... SELECT
INSERT
-Anweisungen mit
AUTO_INCREMENT
UPDATE
- oder
DELETE
-Anweisungen mit
WHERE
-Klauseln, die keine Schlüssel
verwenden und die meisten der untersuchten Datensätze
unverändert lassen
Weniger Sperren auf dem Slave bei INSERT
-,
UPDATE
- oder
DELETE
-Anweisungen.
Es ist möglich, mehrere Threads hinzuzufügen, um Daten zukünftig auf den Slave anzuwenden (dies funktioniert bei SMP-Systemen besser).
Nachteile der datensatzbasierten Replikation:
Größere Logdateien (in manchen Fällen sogar wesentlich größer).
Das Binärlog enthält Daten für umfangreiche Anweisungen, die per Rollback rückgängig gemacht wurden.
Wenn Sie mit der datensatzbasierten Replikation eine Anweisung
(z. B. eine UPDATE
- oder
DELETE
-Anweisung) replizieren, muss jeder
geänderte Datensatz in das Binärlog geschrieben werden. Im
Gegensatz dazu wird bei Verwendung der anweisungsbasierten
Replikation nur die Anweisung in das Binärlog geschrieben.
Wenn die Anweisung viele Datensätze ändert, schreibt die
datensatzbasierte Replikation deutlich mehr Daten in das
Binärlog. In diesem Fall wird das Binärlog für eine
längere Zeit gesperrt, um die Daten schreiben zu können, was
Probleme mit der Nebenläufigkeit verursachen kann.
Deterministische UDFs, die große
BLOB
-Werte erzeugen, werden merklich
langsamer repliziert.
Sie können die Logs darauf überprüfen, welche Anweisungen ausgeführt wurden.
Sie können auf dem Slave nicht nachprüfen, welche Anweisungen vom Master empfangen und dann ausgeführt wurden.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.