Der beste Weg, um Daten zwischen zwei verschiedenen Datenbanken zu synchronisieren
On Januar 1, 2021 by adminIch muss die Datensynchronisation zwischen zwei großen Datenbanken implementieren, die völlig unterschiedliche Strukturen haben. Grundsätzlich muss ich einige Daten zu Produkten in verschiedenen Tabellen in der ersten Datenbank erfassen und für andere Tabellen in der zweiten Datenbank neu anordnen.
Das erstmalige Erstellen meiner Produkte ist nicht sehr kompliziert. Aber ich suche nach einer Möglichkeit, bestimmte Daten – nicht alle Daten – zu jedem Produkt zu aktualisieren.
Offensichtlich gibt es einige Probleme, die dies schwierig machen.
- Ich darf in der Quellendatenbank nichts anderes tun als ausgewählte Abfragen.
- In der Zieldatenbank kann ich übliche Abfragen durchführen (auswählen, aktualisieren, einfügen, erstellen), aber ich kann die nicht ändern vorhandene Struktur / Tabellen.
- Ziel- und Quelldatenbank haben völlig unterschiedliche Strukturen, Tabellen sind überhaupt nicht gleich, daher müssen die Daten wirklich neu angeordnet werden – der Vergleich von Tabellen funktioniert nicht.
- Die Zieldatenbank verwendet einen MySQL-Server. Die Quelle kann DB2 sein.
- Es gibt nirgendwo Felder für „aktualisierte Zeit“.
Der gesamte Prozess muss also in ausgeführt werden ein einzelnes Python-Skript (idealerweise).
Ich denke darüber nach, für jedes Produkt einen Hash zu erstellen, basierend auf den Feldern, die in der Zieldatenbank aktualisiert werden sollen: md5 (Code + Beschreibung + Lieferant + ungefähr 10 andere Felder). Ein neuer Hash, der auf denselben Daten basiert, wird täglich aus der Quellendatenbank erstellt. Ich werde alle Hashes in einer einzigen Tabelle (Artikelcode, current_hash, old_hash) für Aufführungszwecke speichern. Vergleichen und aktualisieren Sie dann das Produkt, wenn sich der neue Hash vom alten unterscheidet.
Es gibt ungefähr 500 000 Produkte, daher mache ich mir ein bisschen Sorgen um die Leistung.
Ist es das Gute? Weg zu gehen?
Kommentare
- Wollen sie, dass Sie es auch mit verbundenen Augen tun? Das ‚ s mein Problem im Moment …
- @Neow, wie ist es gelaufen? Irgendwelche Ratschläge, die Sie jetzt anbieten können?
- @EdwinEvans Im Grunde blieb ich bei meiner ersten Idee, aber vor allem wegen Mein Skript erstellt MD5-Hashes basierend auf Schlüsseldaten für alle Elemente. Dann vergleiche ich sie mit früheren Hashes. Wenn die Hashes unterschiedlich sind, lädt es alle Daten für das Element und aktualisiert alles. Ich bin nicht sicher, ob dies das Beste ist Übrigens, aber es läuft nachts und die Aufführungen sind anständig.
Antwort
Das ist so ziemlich das, was ich habe Ich habe in den letzten Jahren gelebt oder gelebt, und mein Bauchgefühl ist, dass es an der Zeit ist, 500.000 Artikel aus den Quellendatenbanken zu lesen e und die Synchronisierung im Ziel dauern nicht so lange, wie man denkt, und die Zeit, die benötigt wird, um die „Schlüsselfelder“ zu lesen, den MD5-Hash zu berechnen und mit Ihrer Tabelle zu vergleichen, um zu vermeiden, dass Elemente synchronisiert werden, die sich nicht geändert haben. Dies spart zu viel Zeit und kann sogar länger dauern. Ich würde einfach alle lesen und alle aktualisieren. Wenn dies zu einer zu langen Laufzeit führt, würde ich die Laufzeit komprimieren, indem ich die ETL muti-threaded mache, wobei jeder Thread nur auf einem Segment der Tabelle arbeitet, aber arbeitet parallel.
Es ist wichtig sicherzustellen, dass Ihre Zieldatenbank über einen Primärschlüsselindex oder einen eindeutigen Index verfügt. Andernfalls könnte jede Ihrer Aktualisierungen / Einfügungen die gesamte Tabelle sperren. Dies wäre schlecht, wenn Sie den Multithread-Ansatz verwenden, aber wichtig, auch wenn Sie Single-Threaded bleiben, da Ihr Job die Ziel-DB-Tabelle sperren und die Anwendung stören könnte, die über dieser DB ausgeführt wird.
Sie sagen, die Quell-DB „kann DB2 sein“. Wenn Sie „darf“ sagen, bedeutet dies, dass die Datenbank noch entworfen / geplant wird? DB2 9 oder höher verfügt über eine integrierte Nachverfolgung der letzten Aktualisierungszeit und die Möglichkeit, nur die Elemente abzufragen und zurückzugewinnen, die sich seit einem bestimmten Zeitpunkt geändert haben. Vielleicht wurde die DB deshalb so konzipiert, dass sie keine Spalte enthält, die die letzte aktualisierte Zeit angibt, z. B.:
SELECT * FROM T1 WHERE ROW CHANGE TIMESTAMP FOR TAB t1 > current timestamp - 1 hours;
Der Zeitstempel-Cutoff für die obige Abfrage wäre der Letzter Zeitstempel, den Ihre Synchronisierung ausgeführt hat.
Wenn dies der Fall ist, sollte dies Ihr Problem lösen. Ihre Lösung wäre jedoch sehr eng mit DB2 verbunden. In Zukunft möchten sie möglicherweise auf eine andere DB-Plattform wechseln und erwarten, dass Ihr Synchronisierungsjob nicht erneut besucht werden muss. Daher ist es wichtig sicherzustellen, dass alle richtigen Personen wissen, dass Ihr Produkt davon abhängig ist, von DB2 zu bleiben. Wenn sie diese Migration migrieren möchten, müssen Sie die DB so umstrukturieren, dass sie eine Spalte „Zuletzt geänderter Zeitstempel“ enthält, und alle erforderlichen Änderungen vornehmen Änderungen, die auf App-Ebene erforderlich sind, um dieses Feld zu füllen.
Kommentare
- Gibt es auch eine ähnliche Lösung für MySQL?
Antwort
Die Datensynchronisation wäre viel besser und schneller, wenn sie auf der Grundlage einer Art Delta-ID oder Flag durchgeführt werden könnte. Grundsätzlich sollten Sie die Datenzeilen der Zieldatenbank nur aktualisieren, wenn sie nicht mit der Quelldatenbank synchron sind.
In der SQL Server-Datenbank können Sie mithilfe der Prüfsumme fn auch die Delta-basierte Kennung erstellen.
Sie sollten einen SQL-basierten Job , um zu einer bestimmten Tages- oder Nachtzeit aufgerufen zu werden, damit diese SQL-Logik ausgelöst wird. Es ist besser, es als nächtlichen SQL-Job auszuführen, wenn die Datenbankauslastung sehr gering ist. Wenn das Delta der Quell- und Zieldatenbankdatensätze nicht übereinstimmt, ziehen Sie nur diese Datensätze. Der Nachteil wäre jedoch, jedes Mal die Prüfsumme der Quelldatenzeilen zu berechnen und sie dann mit den Zieldaten zu vergleichen.
Wenn Sie eine Spalte wie „LastModifiedDate“ in den Quell-DB-Tabellen haben, können Sie den Prüfsummenansatz überspringen. Auf diese Weise wird Ihre Bewertung in der datumsbasierten Spalte ausgeführt und benötigt im Vergleich zum Prüfsummenansatz weniger Zeit.
Kommentare
- Danke, aber ich ‚ Ich bin nicht sicher, ob Ihre Lösung funktionieren könnte – siehe meine Änderungen in den “ -Problemen “ Teil.
- Da die Quellendatenbank keine aktualisierten Zeitfelder enthält, müssen wir die qualifizierten Datenzeilen basierend auf der Prüfsumme oder dem Hash abrufen.
- Da Ihre Quelle ist db2. Wie wollen Sie die Daten daraus ziehen? über einen Webservice oder eine API.
- Ein dsn wurde mit einem odbc-Treiber eingerichtet. Ich kann mit pyodbc für Python eine Verbindung herstellen und Abfragen durchführen.
- Okay, das ist gut, da Sie die Abfragen mit dem Tool PyODBC in der Remote-Datenbank ausführen können. Sie können noch eine Sache tun. Sie können die Produktdaten direkt im gleichen Format wie sie in die neue “ Staging-Tabelle “ in Ihrer Ziel-DB ziehen, ohne sie zu überprüfen oder Validierungen. Auf diese Weise erhalten Sie die Live-Daten in einem einzigen Schuss in Ihrer Ziel-Datenbank unter den Bühnentabellen. Später im zweiten Schritt können Sie dann die Prüfsummenoperationen ausführen und die Daten der Zieltransaktionstabelle aktualisieren. Dies würde die Hash- oder Prüfsummenauswertung mit den Quelldatenbanken in Echtzeit verhindern.
Antwort
Die Verwendung eines Hash ist eine gute Idee. Da Sicherheit in diesem Fall nicht das Ziel ist, wählen Sie eine schnelle Hash-Funktion (md5 ist in Ordnung).
Sofern Sie nicht vorhaben, die Hash-Berechnung auf mehrere Threads / Prozesse aufzuteilen, benötigen Sie diese nicht wirklich Wenn der Prozess ein einzelnes Skript ist, haben Sie nur den aktuellen Hash im Speicher und schreiben ihn als alten Hash in die Datenbank, nachdem Sie die Daten in der neuen Datenbank aktualisiert haben.
Antwort
Sie sollten einen Windows-Dienst erstellt haben, der zu bestimmten Zeiten ausgeführt wird, wann immer Sie möchten, und der die Änderungen findet in Ihre Quellendatenbank und fügen Sie diese Änderungen in Ihre Zieldatenbank ein.
Kommentare
- -1 (didn ‚ t wirklich downvote, aber;) für Windows nur Vorschlag. Lassen Sie ‚ s nicht auf eine bestimmte Architektur verlassen, wenn Sie Software entwickeln, es bedeutet nur, dass nur wenige Leute Ihre Sachen verwenden können. die einzige consta nt ist eine Änderung und daher ist es ‚ besser, sich nicht auf eine bestimmte Plattform zu verlassen, so dass die Wartung für Sie und die Benutzer
- @manish einfach ist kumar der Teil “ findet die Änderungen in Ihrer Quellendatenbank “ ist der schwierigste!
Schreibe einen Kommentar