Karl-Franz zu Ferdinand von und bei Dümpelshofen: Daten aus mysql im Netz abholen.

Beitrag lesen

Guten Tag.

Ich möchte nun hin und wieder die neuesten Daten aus der Datenbank im Netz abholen und in meine lokale DB speichern (synchronisieren).

Wie gehe ich am besten vor?

ein lokales Script ruft ein Script im Netz das die Daten ausliest und die Datensätze z.B in CSV darstellt.
Das lokale Script liest die Daten und schiebt sie in die Datenbank.
Klingt einfach, aber irgendwie gefällt mir das nicht.

Warum nicht? Verursacht es dir Blähungen oder was steckt hinter "irgendwie"?

Vor Allem - um nicht jedesmal die ganze DB im Netz lesen zu müssen, müsste ds netzseitige Script in der DB einen Flag setzen.
Was aber, wenn die Übertragung nicht klappt?
Der Flag wäre gesetzt und die Datensätze könnten nicht mehr geholt werden.

Du solltest eine Aktion auch nicht als erfolgreich beendet kennzeichen, wenn noch gar nicht klar ist, dass die Aktion erfolgreich beendet wurde. Übertrage die Daten, prüfe deren Stimmigkeit und melde erst dann dem Server den Erfolg.

Eine bessere Alternative: MySQL bietet (wie auch andere Datenbanken) dir die Möglichkeit, jeden Datensatz mit einem Zeitstempel zu versehen. In dieser Spalte vom Typ timestamp wird von der Datenbank bei Neuanlage und auch jeder Änderung automatisch die aktuelle Zeit eingetragen.
Eine einfache, aufbauende Synchronisation bräuchte lediglich den Zeitpunkt der letzten Änderung in beiden Datenbanken (lokal und Server, letzterer kleiner now(), um in dieser Sekunde noch hinzukommende Änderungen auszuschließen) abfragen und anschließend alle Datensätze zwischen den beiden Zeitpunkten auslesen (… where stamp > lokal and stamp <= Server).

Gravierender Nachteil bei beiden Ansätzen: Gelöschte Datensätze werden übersehen, denn sie existieren ja nicht mehr, haben also auch kein Merkmal, das sich vergleichen ließe und dann wild winkt "Ich muss weg!".
Du wirst entweder das Löschen verbieten und gelöschte Datensätze anderweitig als gelöscht kennzeichnen müssen, damit sie den normalen Betrieb nicht stören, oder eine separate Tabelle führen müssen, in der Hinweise auf gelöschte Datensätze abgelegt werden. Trägst du in letzterer Tabelle sämtliche Änderungen ein, könntest du auch auf die zusätzliche timestamp-Spalte bei den Datensätzen verzichten.

Ob sich dieser Aufwand gegenüber einer simplen Komplettkopie der Datenbank lohnt, musst du selbst abschätzen. Du schriebst davon, dass es keine Riesenmengen wären; ich täte dann zur Komplettkopie tendieren, zumal sowas mit gzip oder bz2 komprimiert bisweilen erstaunlich in sich zusammenschrumpft und entsprechend ratzfatz übertragen ist.

Wie macht man sowas professionell?

Ach, "professionell" … wenn irgendwo "professionell" draufsteht, kannst du davon ausgehen, dass da ganz grausiger Murks drinsteckt :->