2014-01-06 8 views
5

Die zwei Datenbanken haben identische Schemas, aber unterschiedliche Daten. Es ist möglich, dass einige Zeilen dupliziert werden, aber es ist ausreichend, wenn die Zusammenführung laut abläuft und die Aktualisierung nicht erfolgt, wenn Duplikate gefunden werden, d. H. Duplikate sollten manuell aufgelöst werden.Zwei verschiedene Postgresql-Datenbanken in einer einzigen Datenbank zusammenführen

Ein Teil des Problems besteht darin, dass in den betreffenden Datenbanken eine Reihe von Fremdschlüsseleinschränkungen bestehen. Außerdem kann es Spalten geben, die auf Fremdschlüssel verweisen, die keine Fremdschlüsselbeschränkungen haben. Letztere sind auf Leistungsprobleme beim Einfügen zurückzuführen. Außerdem müssen wir in der Lage sein, zwischen den IDs der alten Datenbanken und den IDs in der neuen Datenbank zu mappen.

Offensichtlich können wir eine Reihe von Code schreiben zu handhaben, aber wir suchen nach einer Lösung, die:

  1. Weniger Arbeit
  2. weniger Overhead auf den Maschinen die Zusammenführung zu tun.
  3. Zuverlässiger. Wenn wir Code schreiben müssen, müssen sie durch die Prüfung gehen, usw. und ist nicht fehlerfrei gewährleistet sein

Offensichtlich sind wir immer noch im Internet und der PostgreSQL-Dokumentation für die Antwort suchen, aber was wir Bisher ist es nicht hilfreich gewesen.

Update: Eine Sache, die ich deutlich ausgelassen habe, ist, dass "Duplikate" eindeutig durch eindeutige Einschränkungen im Schema definiert sind. Wir erwarten, den Inhalt einer Datenbank wiederherzustellen und dann den Inhalt einer Sekunde wiederherzustellen. Fehler während der zweiten Wiederherstellung sollten als fatal für die zweite Wiederherstellung betrachtet werden. Die Duplikate sollten dann aus der zweiten Datenbank entfernt und ein neuer Dump erstellt werden. Wir wollen, dass die IDs neu nummeriert werden, aber nicht die anderen eindeutigen Einschränkungen. Es ist möglich, dass eine dritte oder sogar eine vierte Datenbank nach der zweiten zusammengeführt wird.

Antwort

3

Es gibt keine Verknüpfung zum Schreiben einer Reihe von Skripts ... Dies kann nicht realistisch automatisiert werden, da die Verwaltung von Konflikten die Anwendung von Regeln erfordert, die spezifisch für Ihre Daten sind.

Das heißt, Sie können die Chancen von Konflikten verringern, indem sie Ersatzschlüssel Entfernen von doppelten ...

Sagen Sie Ihre zwei Datenbanken nur zwei Tabellen: A (id pkey) und B (id pkey, a_id references A(id)). Suchen Sie in der ersten Datenbank nach max_a_id = max(A.id) und max_b_id = max(B.id).

In der zweiten Datenbank:

  1. Alte Tabelle B, falls erforderlich, so dass a_id Kaskade Updates tut.
  2. Disable auslöst, wenn irgendwelche Nebenwirkungen haben, die fälschlicherweise in treten könnten.
  3. Update-A und Satz id = id + max_a_id, und die gleiche Art von Sache für B.
  4. Export der Daten

Als nächstes importieren Sie diese Daten in die erste Datenbank und aktualisieren Sequenzen entsprechend.

Sie müssen immer noch auf Überläufe achten, wenn IDs größer als 2,3 Milliarden und eindeutige Schlüssel sein können, die in beiden Datenbanken vorhanden sein können. Aber zumindest müssen Sie sich keine Gedanken über dup-IDs machen.

+0

Die Update-Kaskade wird helfen, unser Problem zu lösen. Es ist nicht ausreichend (wie Sie hingewiesen haben), aber hilft. ID-Überlauf sollte kein Problem sein, da unsere IDs alle bigints sind. – aikimcr

2

Dies ist die Art von Fall, in dem ich ETL Tools wie CloverETL, Pentaho Kettle oder Talend Studio für suchen würde.

Ich stimme mit Denis überein, dass es keine echten Abkürzungen gibt, um die Komplexität einer Datenzusammenführung zu vermeiden.

Verwandte Themen