Wenn ein Master-Server keine Anweisung in sein Binärlog schreibt, wird die Anweisung auch nicht repliziert. Schreibt der Server die Anweisung hingegen in das Log, dann wird die Anweisung an alle Slaves geschickt, und jeder Slave bestimmt, ob er sie ausführt oder ignoriert.
Auf der Master-Seite basieren die Entscheidungen darüber, welche
Anweisungen zu loggen sind, auf den Optionen
--binlog-do-db
und
--binlog-ignore-db
, die das binäre Loggen
steuern. Eine Beschreibung der Regeln, die der Server bei der
Auswertung dieser Optionen verwendet, finden Sie in
Abschnitt 5.12.3, „Die binäre Update-Logdatei“.
Auf der Slave-Seite werden die Entscheidungen darüber, ob und
welche vom Master empfangenen Anweisungen ausgeführt oder
ignoriert werden, entsprechend den
--replicate-*
-Optionen getroffen, mit denen der
Slave gestartet wurde. Der Slave wertet diese Optionen
entsprechend der folgenden Vorgehensweise aus.
Sind --replicate-do-db
- oder
--replicate-ignore-db
-Optionen vorhanden?
Ja: Unter Verwendung derselben Regeln
testen wie bei den Optionen
--binlog-do-db
und
--binlog-ignore-db
. Welches Ergebnis hat
der Test?
Anweisung ignorieren: Ignorieren und beenden.
Anweisung zulassen: Anweisung nicht sofort ausführen, sondern die Entscheidung verschieben. Mit nächstem Schritt fortfahren.
Nein: Mit nächstem Schritt fortfahren.
Wird gerade eine gespeicherte Funktion ausgeführt?
Ja: Abfrage ausführen und beenden.
Nein: Mit nächstem Schritt fortfahren.
Sind --replicate-*-table
-Optionen vorhanden?
Nein: Abfrage ausführen und beenden.
Ja: In diesem Fall hängt das Verhalten davon ab, ob die anweisungsbasierte Replikation oder die datensatzbasierte Replikation verwendet wird:
Anweisungsbasierte Replikation:
Mit nächstem Schritt fortfahren und mit der
Auswertung der Tabellenregeln in der angegebenen
Reihenfolge (zuerst die Nicht-„wild“-,
dann die „wild“-Regeln) beginnen. Nur
Tabellen, die aktualisiert werden sollen, werden mit
den Regeln verglichen. Heißt die Anweisung etwa
INSERT INTO sales SELECT * FROM
prices
, dann wird nur
sales
mit den Regeln verglichen.
Wenn mehrere Tabellen durch eine entsprechende
Anweisung aktualisiert werden, gewinnt die erste
Tabelle, die „Do“ oder
„Ignore“ entspricht: Der Server
vergleicht die erste Tabelle also mit den Regeln.
Konnte keine Entscheidung getroffen werden, dann
überprüft er die zweite Tabelle usw.
Datensatzbasierte Replikation:
Alle Änderungen an Tabellendatensätzen werden
einzeln gefiltert. Bei Updates für mehrere Tabellen
wird jede Tabelle entsprechend den Regeln separat
gefiltert. Einige Änderungen werden ausgeführt,
andere unter Umständen nicht – dies hängt jeweils
von den Regeln und den vorgenommenen Änderungen ab.
Die datensatzbasierte Replikation verarbeitet Fälle,
die bei der anweisungsbasierten Replikation nicht
korrekt repliziert würden, ihrerseits korrekt.
Betrachten Sie folgendes Beispiel, welches davon
ausgeht, dass Tabellen in der Datenbank
foo
repliziert werden sollen:
mysql>USE bar;
mysql>INSERT INTO foo.sometable VALUES (1);
Gibt es --replicate-do-table
-Regeln?
Ja: Entspricht die Tabelle einer dieser Regeln?
Ja: Abfrage ausführen und beenden.
Nein: Mit nächstem Schritt fortfahren.
Nein: Mit nächstem Schritt fortfahren.
Gibt es --replicate-ignore-table
-Regeln?
Ja: Entspricht die Tabelle einer dieser Regeln?
Ja: Abfrage ignorieren und beenden.
Nein: Mit nächstem Schritt fortfahren.
Nein: Mit nächstem Schritt fortfahren.
Gibt es --replicate-wild-do-table
-Regeln?
Ja: Entspricht die Tabelle einer dieser Regeln?
Ja: Abfrage ausführen und beenden.
Nein: Mit nächstem Schritt fortfahren.
Nein: Mit nächstem Schritt fortfahren.
Gibt es --replicate-wild-ignore-table
-Regeln?
Ja: Entspricht die Tabelle einer dieser Regeln?
Ja: Abfrage ignorieren und beenden.
Nein: Mit nächstem Schritt fortfahren.
Nein: Mit nächstem Schritt fortfahren.
Es gab keine Entsprechung für eine
--replicate-*-table
-Regel. Gibt es noch eine
weitere Tabelle, die auf diese Regeln geprüft werden kann?
Ja: Schleife wiederholen.
Nein: Wir haben nun alle zu
aktualisierenden Tabellen getestet und konnten keine
Übereinstimmung mit einer Regel finden. Sind
--replicate-do-table
- oder
--replicate-wild-do-table
-Regeln
vorhanden?
Ja: Es gab „Do“-Regeln, aber keine Übereinstimmung. Abfrage ignorieren und beenden.
Nein: Abfrage ausführen und beenden.
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.