Hallo!
Nachdem ich jetzt eine gesicherte Datenübertragung hinbekommen habe, habe ich das nächste Problem, mit dem Ablauf der Synchronisation an sich. Das Problem bei der Synchronisation mehrerer(>2) MySQL-Datenbanken besteht darin, das in 2 Datenbanken gleichzeitig neue Datensätze einfügt werden können, und wenn dazwischen keine Synchronisation erfolgt ist habe ich 2 gleiche IDs. Genauer beschrieben habe ich das hier: http://forum.de.selfhtml.org/archiv/2002/9/23871/#m132003
Sven Rautenberg hatte mich auf einen neue Möglichkeit aufmerksam gemacht.
Ich zitiere mal kurz aus dem Archiv (http://forum.de.selfhtml.org/archiv/2002/9/23871/#m132052):
Erkläre eine Datenbank, die dauerhaft erreichbar ist, zur Master-Datenbank. Zu dieser Datenbank werden alle extern eingegebenen Daten hochgeladen, und sie hat im Zweifel die einzig gültigen Daten.
Um das Gehampel mit zwei ID-Feldern zu vermeiden, könntest du auch ein ID-Feld und ein Herkunftsfeld definieren. Das Herkunftsfeld definiert, welche dezentrale Datenbank zur Eingabe verwendet wurde. Wenn der Datensatz zur zentralen Datenbank hochgeladen wird, wird das Herkunftsfeld geändert und eine neue ID vergeben. Die Änderung wird dann zurückgesendet, bzw. generell komplett verteilt.
Mit diesem System kannst du anhand der Herkunfts-ID sehen, ob der Datensatz schon zentral gespeichert wurde.
soweit so gut. Das war auch wirklich praktisch, hat nur einen kleinen Haken:
Wenn ich eine Client-DB mit der Master-DB synchronisiere, mache ich das wie folgt:
1. Ermittlung des letzten Synchronisations-Zeitpunktes(wird geloggt)
2. Ermittlung aller neuen Datensätze anhand der HerkunftsID (alle Inserts nach der letzten Synchronisation haben noch die ursprüngliche vom Client vergeben HerkunftsID)
3. entsprechend Generierung von INSERT-Statements
4. Ermittlung alle Aktualisierungen(Updates), Ermittlung anhand der HerkunftsID(Wenn Datensatz schon älter aber geändert wurde hat er bereits eine HerkunftsID vom Master) _und_ des Timstamps
5. entsprechend Generierung von UPDATE-Statements
6. Übertragung der Daten auf den Master
7. generierte SQL-Statements ausführen
8. ?
-- hier komme ich nicht weiter. --
Das Problem besteht darin, die auf dem Client nicht vorhandenen Datensätze herauszufinden. OK, man kann auch hier den Zeitpunkt der letzten Synchronisation ermitteln (da komme ich wohl nicht drum herum wegen der Updates), aber wie unterscheide ich zwischen Insert und Update? Woher weiß ich ob der Datensatz jetzt neu angelegt wurde und noch nicht auf dem Client vorhanden ist, oder ob er lediglich geändert wurde? Ich kann ja leider nicht mit einem Insert einen vorhandenen Datensatz mit gleicher ID überschreiben!
Hat jemand ne Idee wie ich das Problem lösen kann? Ich möchte hierbei nicht in die eigentliche Anwendung(d.h. die Anwendung die synchronisiert werden soll) eingreifen, d.h. deren INSERT-Statements verändern. Gibt es eine Möglichkeit in MySQL einen automatischen Timestamp für die Erstellung des Datensatzes einzufügen? Sowas der Art den Standardwert vom 2. Timestamp auf NOW() setzen(geht leider nicht)?
Sonst fiele mit nur ein _noch ein weiteres_ Feld in jede Tabelle einzufügen, und zwar mit einem Synchronisations-Status, standardmäßig auf 0, nach der Synchronisation auf 1 gesetzt.
Dafür behält das HerkunftID Feld für immer seine ID. Jetzt kann ich auf dem Client anhand des Statusfeldes sehen, ob der Datensatz bereits synchronisiert wurde, und auf dem Master kann ich an dem HerkunftsID Feld sehen, ob der Datensatz schon auf dem Client vorhanden ist.
Aber dann hätte ich schon 2 extra Felder, hat vielleicht jemand ne bessere Idee?
Viele Grüße und danke fürs Lesen ;-)
Andreas