Frage

Ich bin ein paar Datenbanken auf MySQL 5.0.45 laufen und ich versuche, mein Vermächtnis Datenbank zu bekommen mit einem überarbeiteten Schema zu synchronisieren, so dass ich beide nebeneinander laufen. Ich tue dies durch Trigger in die neuen Datenbank hinzugefügt, aber ich bin mit Problemen mit der Replikation. Meine Einrichtung ist wie folgt.

Server "Master"

  • Datenbank "legacydb", repliziert auf Server "Slave".
  • Datenbank "newdb", hat Auslöser, die update "legacydb" und keine Replikation.

Server "Slave"

  • Datenbank "legacydb"

Mein Updates zu „newdb“ läuft gut, und meine Auslöser los. Sie aktualisieren „legacydb“ auf „Master“ -Server. Allerdings sind die Änderungen nicht an die Slaves repliziert nach unten. Der MySQL-docs sagt, dass zur Vereinfachung der Replikation in dem aktuellen Datenbank-Kontext sieht (z "SELECT DATABASE();") bei der Entscheidung, welche eher zu replizieren abfragt als bei dem Produkt der Abfrage suchen. Meine Trigger wird aus dem Kontext der Datenbank „newdb“ laufen, also Replikation ignoriert die Updates.

Ich habe versucht, die Update-Anweisung auf eine gespeicherte Prozedur in „legacydb“ bewegt. Dies funktioniert gut (das heißt Daten repliziert an Slave), wenn ich auf „Master“ verbinden und manuell ausführen "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);". Wenn jedoch dieses Verfahren von einem Trigger aufgerufen wird es nicht repliziert werden.

Bisher mein Denken, wie dies zu beheben ist eine der folgenden Aktionen gewesen.

  • Zwingen Sie den Auslöser eine neue aktuelle Datenbank einzustellen. Dies wäre am einfachsten, aber ich glaube nicht, das ist möglich. Dies ist, was ich mit der gespeicherten Prozedur zu erreichen hoffte.

  • Replizieren beide Datenbanken und haben Trigger sowohl in Master und Slave. Dies wäre möglich, aber ein Schmerz einzurichten.

  • , um die Replikation erzwingen, um alle Änderungen zu holen "legacydb", unabhängig von dem aktuellen Datenbankkontext.

  • Wenn die Replikation auf einem zu hohen Niveau läuft, wird es nie irgendwelche Updates sehen auch durch meine Trigger laufen, wobei in diesem Fall kein Betrag von Hacking wird erreichen, was ich will.

Jede Hilfe, wie dies zu erreichen, würde sehr geschätzt werden.

War es hilfreich?

Lösung

Das mag damit zu tun:

Eine gespeicherte Funktion übernimmt Tabellensperren vor der Ausführung, Inkonsistenz im Binärlog zu vermeiden wegen Nichtübereinstimmung der Reihenfolge, in den Anweisungen ausführen und wenn sie im Protokoll erscheinen. Aussagen, die eine Funktion aufgezeichnet werden, anstatt die Anweisungen innerhalb der Funktion ausgeführt aufrufen. Folglich gespeicherte Funktionen, die die gleichen zugrunde liegenden Tabellen aktualisieren nicht ausführen parallel.

Im Gegensatz dazu gespeicherten Prozeduren nicht Sperren auf Tabellenebene erwerben. Alle Aussagen in gespeicherten Prozeduren ausgeführt werden, in das Binärlog geschrieben.

Darüber hinaus gibt es eine ganze Liste von Fragen mit Trigger: http://dev.mysql.com/doc/refman/ 5.0 / de / Routine-restrictions.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top