Ich 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 sie für andere Tabellen in der zweiten Datenbank neu anordnen.
Das erstmalige Erstellen meiner Produkte ist nicht sehr kompliziert. Ich suche jedoch nach einer Möglichkeit, bestimmte Daten - nicht alle Daten - zu jedem Produkt zu aktualisieren.
Offensichtlich gibt es ein paar Probleme, die dies schwierig machen.
- Abgesehen von ausgewählten Abfragen darf ich in der Quelldatenbank nichts tun.
- In der Zieldatenbank kann ich übliche Abfragen ausführen (auswählen, aktualisieren, einfügen, erstellen), die vorhandene Struktur / die vorhandenen Tabellen können jedoch nicht geändert werden.
- Ziel- und Quelldatenbank haben völlig unterschiedliche Strukturen, Tabellen sind überhaupt nicht gleich, daher müssen die Daten wirklich neu angeordnet werden - das Vergleichen von Tabellen funktioniert nicht.
- Die Zieldatenbank verwendet einen MySQL-Server. Die Quelle ist möglicherweise DB2.
- Es gibt nirgendwo "aktualisierte Zeit" Felder.
Der gesamte Vorgang muss also (im Idealfall) in einem einzigen Python-Skript ausgeführt werden.
Ich denke darüber nach, einen Hash für jedes Produkt zu erstellen, basierend auf den zu aktualisierenden Feldern in der Zieldatenbank: 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 Leistungszwecke speichern. Vergleichen und aktualisieren Sie dann das Produkt, wenn sich der neue Hash vom alten unterscheidet.
Es gibt ungefähr 500 000 Produkte, also mache ich mir ein bisschen Sorgen um die Leistung.
Ist es der richtige Weg?
Antworten:
Dies ist so ziemlich das, was ich in den letzten Jahren gemacht oder gelebt habe, und mein Bauchgefühl ist, dass die Zeit zum Lesen von 500.000 Elementen aus der Quellendatenbank und zum Synchronisieren im Ziel nicht so lange dauern wird, wie man denkt Die Zeit, die zum Lesen der "Schlüsselfelder", zum Berechnen des MD5-Hashs und zum Abgleichen mit Ihrer Tabelle benötigt wird, um zu vermeiden, dass nicht geänderte Elemente synchronisiert werden, spart nicht allzu viel Zeit und kann sogar länger dauern. Ich würde einfach alles lesen und alles aktualisieren. Wenn dies zu einer zu langen Laufzeit führt, würde ich die Laufzeit komprimieren, indem ich die ETL auf mehrere Threads verteile, wobei jeder Thread nur in einem Segment der Tabelle ausgeführt wird, aber parallel arbeitet.
Es wäre wichtig, sicherzustellen, dass Ihre Zieldatenbank einen Primärschlüsselindex oder einen eindeutigen Index hat. Andernfalls kann 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-Threading beibehalten, da Ihr Job die Ziel-DB-Tabelle sperren und die Anwendung beeinträchtigen könnte, die auf dieser DB ausgeführt wird.
Sie sagen, dass die Quellendatenbank "DB2 sein kann". Wenn Sie "kann" sagen, bedeutet dies, dass die Datenbank noch entworfen / geplant wird? DB2 9 oder höher verfügt über eine integrierte Nachverfolgung der letzten Aktualisierung und die Möglichkeit, nur die Elemente abzufragen und zurückzugewinnen, die sich seit einem bestimmten Zeitpunkt geändert haben. Möglicherweise wurde die Datenbank deshalb so konzipiert, dass sie keine Spalte enthält, in der die letzte aktualisierte Zeit angegeben ist. Beispiel:
Der Zeitstempel-Cutoff für die obige Abfrage ist der letzte Zeitstempel, den Ihre Synchronisierung ausgeführt hat.
Wenn dies der Fall ist, sollte das Ihr Problem lösen. Ihre Lösung ist jedoch sehr eng mit DB2 verbunden, und in Zukunft möchten sie möglicherweise auf eine andere DB-Plattform umsteigen und erwarten, dass Ihr Synchronisierungsjob nicht erneut besucht werden muss. Es ist daher wichtig, sicherzustellen, dass alle richtigen Personen wissen, dass Ihr Produkt von der Verfügbarkeit von DB2 abhängig ist, oder dass bei einer geplanten Migration die Datenbank so umstrukturiert wird, dass die Spalte "Zuletzt geänderter Zeitstempel" angezeigt wird Änderungen, die auf App-Ebene erforderlich sind, um dieses Feld auszufüllen.
quelle
Die Datensynchronisation wäre viel besser und schneller, wenn sie auf der Basis einer Delta-Kennung oder eines Delta-Flags erfolgen könnte. Grundsätzlich sollten Sie die Ziel-DB-Datenzeilen nur aktualisieren, wenn sie nicht mit der Quell-DB synchron sind.
In SQL Server DB können Sie mithilfe der Prüfsumme fn auch den Delta-basierten Bezeichner erstellen.
Sie sollten einen SQL-basierten Job entwickeln , der zu einer bestimmten Tages- oder Nachtzeit aufgerufen wird, 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 Ziel-DB-Datensä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 für die datumsbasierte Spalte ausgeführt und nimmt im Vergleich zum Prüfsummenansatz weniger Zeit in Anspruch.
quelle
Die Verwendung eines Hashs ist eine gute Idee. Da in diesem Fall die Sicherheit 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, müssen Sie den aktuellen Hash-Wert nicht wirklich in der Datenbank speichern. Wenn es sich bei Ihrem Prozess um ein einzelnes Skript handelt, wird nur der aktuelle Hash im Speicher abgelegt und nach der Aktualisierung der Daten in der neuen Datenbank als alter Hash in die Datenbank geschrieben.
quelle
Sie sollten einen Windows-Dienst erstellt haben, der zu bestimmten Zeiten ausgeführt wird, wann immer Sie möchten, und der die Änderungen in Ihrer Quellendatenbank findet und diese Änderungen in Ihre Zieldatenbank einfügt.
quelle