Wie vergleiche ich Daten zwischen zwei Datenbanken in PostgreSQL?

Antworten:

85

Es gibt verschiedene Tools:

(Beachten Sie, dass die meisten dieser Tools nur die Struktur vergleichen können, nicht jedoch Daten.)

Freie:

Kommerziell:

ein Pferd ohne Name
quelle
16
Nur liquibase.org und Aqua Data Studio scheinen Daten zu vergleichen, andere vergleichen nur das Schema.
Amir Ali Akbari
@AmirAliAkbari Liquibase hat Unterstützung Schema diffs
a_horse_with_no_name
2
Es scheint, dass apgdiffdas Erben von Tabellen nicht gut unterstützt wird und Ausnahmen sofort ausgelöst werden, wenn ich versuche, sie zu verwenden. WbSchemaDifffunktioniert sehr gut, Überraschung!
Smartwjw
1
@AmirAliAkbari liquibase scheint keine Daten zu vergleichen, wenn die Tabellen existieren und dieselbe Struktur haben.
Aditsu beendet, weil SE
13
-1. OP hat nach dem Vergleich von Daten (Datensätzen / Zeilen) gefragt, und Sie haben meistens Tools aufgelistet, die die Struktur vergleichen. OP hat ausdrücklich angegeben, dass sie zwischen den Zieldatenbanken identisch sind. Daher gibt es keinen Grund, sie zu vergleichen. Bitte klären Sie, welche tatsächlich die angeforderte Sache tun.
Selten Needy
38

Versuchen Sie, pg_dumpbeide Datenbanken zu verwenden und die Dateien zu unterscheiden.

Júlio Santos
quelle
23
+1 für einfach und direkt. Aber wissen wir sicher, dass pg_dump Daten aus identischen Datenbanken in derselben Reihenfolge speichert, wenn beispielsweise die Tabellen in unterschiedlicher Reihenfolge erstellt wurden? (Ich würde hoffen, dass die Reihenfolge auf Abhängigkeiten basiert, die sich überhaupt nicht um den Zeitpunkt der Erstellung kümmern, aber die Hoffnung lässt sich nicht gut skalieren.)
Mike Sherrill 'Cat Recall'
10
Sie können -a -d und | verwenden sortieren. Diese Daten können möglicherweise nicht importiert werden, sind jedoch für die grundlegende Überprüfung in Ordnung.
Cem Güler
Dies sollte in den Ergebnissen höher sein, um ehrlich zu sein. Man sollte sich nicht auf ein Diff verlassen müssen, um den Tag zu retten, so dass diese ausgewachsenen, schweren, auf Java basierenden Lösungen wie ein Overkill wirken. Es ist jedoch sinnvoll, Ihre Migrationen auf ihre Gesundheit zu überprüfen, und das pg_dumpist in Ordnung. Wenn Sie signifikante Unterschiede feststellen, pg_dumpversuchen Sie wahrscheinlich, Dinge zu vergleichen, die nicht vergleichbar sind. Zumindest zum Vergleich von PG dbs.
Sas
1
Leider funktioniert dies nur in kleineren Datenbanken, da diff einige große Dumps, die ich habe, nicht verarbeiten kann. Ansonsten ist es (immer noch!) Wirklich die einzige praktikable Lösung, die ich gefunden habe. Obwohl ich psql -c '\x' -c 'SELECT... ORDER BY...'anstelle von benutze pg_dump.
Nyov
11

Eine weitere kostenlose App (die nur Struktur, aber keine Daten vergleichen kann ):

DBeaver - Sie können Datenbanken, Tabellen usw. auswählen, um sie miteinander zu vergleichen

iki
quelle
1
Könnten Sie bitte besser erklären, wie Daten aus 2 Datenbanken mit DBeaver verglichen werden?
Nicole
1
Soweit ich weiß, erlaubt DBeaver nur den Vergleich von Metadaten, nicht den Vergleich von Daten.
Nicole
Sehr schönes Werkzeug. Es ist wahr, dass es zunächst nicht sehr intuitiv ist, wie man es macht. Sie müssen zuerst 2 oder mehr Objekte auswählen, damit Sie diese Option sehen können.
Ihebiheb
8

Ich habe viele Tools evaluiert und folgende Lösung gefunden:

Schemavergleich :

Am interessantesten waren Liquibase, Persyas und PgCodeKeeper:

( Problem ) Liquebase konvertiert:

 SET DEFAULT nextval('myschema.name_id_seq'::regclass)

in

BIGSERIAL

Daher wurde die Verwendung abgelehnt

( Problem ) Persyas hat einwandfrei funktioniert, bis ich ein zusätzliches Schema hinzugefügt habe und es beginnt Folgendes zu werfen:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

Also habe ich festgestellt, dass PgCodeKeeper perfekt funktioniert und lebt (Sie können Releases überprüfen). Ich benutze folgenden Befehl:

./pgcodekeeper-cli.sh -E -I ./ignore.txt \
-s "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-t "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-o /result/schema-diff-$(date +'%m%d%y_%H%M%S').sql

Datenvergleich: Ich habe versucht, Liquebase zu verwenden, und es funktioniert einfach nicht. Sie können die Schritte sehen, die ich in meiner unbeantworteten Frage zum Datenunterschied zweier Datenbanken mit Liquebase versucht habe

Also habe ich ein anderes Projekt gefunden SQL Workbench / J Es funktioniert wirklich gut und generiert Reall Diff in SQL. Ich benutze folgenden Befehl:

  java -jar /sqlworkbench.jar -command="'WbDataDiff -excludeTables=$EXCLUDE_TABLES \
-referenceConnection=$REFERENCE_CONNECTION \ 
-targetConnection=$TARGET_CONNECTION -referenceSchema=$1 \
-targetSchema=$1  -file=$DIFF_RESULT_FILE -singleFile=true \
-includeDelete=true -ignoreMissingTarget=true ;'"

Beide Tools unterstützen die Objektfilterung. Es ist wirklich praktisch.

Migrationen

Und schließlich benutze ich Liquebase nur für die Migration / Versionsverfolgung.

i.bondarenko
quelle
5

Ich arbeite an einem umfassenden Vergleichstool für Postgres. Es wird kostenlos sein, während in der Beta.

PostgresCompare

Anfangs ist dies nur ein Schema (DDL) -Vergleich, aber wir werden wahrscheinlich auch auf Daten erweitern. Ich glaube, dies ist ein Tool, das viele Shops benötigen, um von ihrem aktuellen RDBMS zu wechseln, ohne auch die Funktionsweise ihrer Entwicklungsumgebungen, Vorgänge usw. ändern zu müssen.

Neil Anderson
quelle
1
Daten sind auch sehr wichtig. Schema allein reicht nicht aus.
Houman
1
Hallo @Houman. Entschuldigung für die späte Antwort. Sie haben Recht, Daten werden der nächste Schritt sein. Das Tolle am Erstellen des Schema-Vergleichstools ist, dass der gesamte Code zum Erkennen von Tabellen usw. zwischen ihnen geteilt werden kann.
Neil Anderson
Ich bin auf diese Antwort gestoßen, als ich selbst ein einfaches Schema-Vergleichstool erstellt habe. Ich habe Ihre Website durchgesehen und das Tool sieht sehr vielversprechend aus. Ich kann es kaum erwarten, die Beta-Version auszuprobieren
Avantika Saini
Das Alpha ist ab sofort bei @AvantikaSaini verfügbar. Wenn Sie es ausprobieren, lassen Sie mich bitte wissen, wie es funktioniert, damit ich es für alle verbessern kann.
Neil Anderson
Sie sollten eine Lernversion der Lizenz erstellen. Der Preis ist für Bildungszwecke zu hoch.
Reinaldoluckman
2

Das beste Tool, das ich je gesehen habe https://pythonhosted.org/Pyrseas/

  1. Holen Sie sich Dump aus der Datenbank A dbtoyaml ...

  2. Migration von A => B yamltodb generieren ... [Datei in Schritt 1 generiert]

Oleg Tsarev
quelle
Dies scheint das einzige Tool zu sein, das Diff-Skripte generiert, die eine Datenbank und eine Dump-Datei vergleichen. Normalerweise vergleichen andere Tools zwei Datenbanken. Dank dieser Funktion können Entwickler eine lokale Entwicklerdatenbank bearbeiten und dann ihre Änderungen durch vcs festschreiben und verteilen, ohne Migrationsskripte zu erstellen, indem sie nur dbtoyaml ausführen. Andere Teamentwickler können ihre lokalen Datenbanken mit einem einzigen Befehl (yamltodb) aktualisieren. Dieser Workflow funktioniert ein bisschen wie ein Visual Studio-Datenbankprojekt.
andreav
0

Ich habe ein Tool erstellt, um 2 Live-PostgreSQL-Datenbanken (keine Dumps), Tabellendaten und Sequenzen zu vergleichen. Ziemlich früh, aber erreicht, was ich wollte, vielleicht kann es Ihnen auch helfen.

https://github.com/dmarkey/pgdatadiff

Dmarkey
quelle
0

Meiner Meinung nach ist Dbforge das leistungsstärkste Tool zum Komprimieren von Daten in Postgresql. Es ist ein Produkt der Firma Devart. Sie können es hier herunterladen .

Mohsen Zahedi
quelle