Jak porównać dane między dwiema bazami danych w PostgreSQL?

Odpowiedzi:

85

Istnieje kilka narzędzi:

(zauważ, że większość z tych narzędzi może tylko porównywać strukturę, ale nie dane)

Darmowe:

Reklama w telewizji:

koń bez imienia
źródło
17
Wydaje się, że tylko liquibase.org i Aqua Data Studio porównują dane, inne tylko porównują schemat.
Amir Ali Akbari
@AmirAliAkbari Liquibase robi wsparcia schematu dyferencjału
a_horse_with_no_name
2
Wygląda na to, że apgdiffnie obsługuje dobrze dziedziczenia tabel, a wyjątek rzuca się natychmiast, gdy próbuję go użyć. WbSchemaDiffdziała bardzo dobrze, niespodzianka!
smartwjw
1
@AmirAliAkbari liquibase nie porównuje danych, gdy istnieją tabele i mają taką samą strukturę.
aditsu zrezygnowało, ponieważ SE jest ZŁEM
14
-1. OP pytał o porównywanie danych (rekordów / wierszy), a Ty wymieniłeś głównie narzędzia porównujące struktury , które OP wyraźnie określił jako identyczne między docelowymi bazami danych, więc nie ma powodu, aby je porównywać. Proszę wyjaśnić, które z nich faktycznie wykonują żądaną rzecz.
Rzadko `` Gdzie jest Monica '' Needy
39

Spróbuj użyć pg_dumpna obu bazach danych i porównaj pliki.

Julio Santos
źródło
23
+1 za proste i bezpośrednie. Ale czy wiemy na pewno, że pg_dump zrzuci dane z identycznych baz danych w tej samej kolejności, jeśli, powiedzmy, tabele zostały zbudowane w różnych kolejności? (Mam nadzieję, że kolejność jest oparta na zależnościach od ograniczeń, nie dbając wcale o czas tworzenia, ale nadzieja nie jest dobrze skalowana.)
Mike Sherrill „Cat Recall”
10
możesz użyć -a -d i | sortować. Ale tych danych nie można zaimportować, jednak wystarczyłoby do podstawowego sprawdzenia.
Cem Güler
Szczerze mówiąc, powinno to być wyżej w wynikach. Nie należy polegać na różnicach, aby uratować dzień, więc te pełne, ciężkie rozwiązania oparte na Javie wydają się przesadą. Jednak sprawdzanie migracji ma sens i pg_dumpjest do tego w porządku. Jeśli widzisz znaczące różnice pg_dump, prawdopodobnie próbujesz porównać rzeczy, których nie da się porównać. Przynajmniej do porównania PG dbs.
sas
1
Niestety działa to tylko na mniejszych bazach danych, ponieważ diff nie obsługuje niektórych dużych zrzutów, które mam. W przeciwnym razie jest to (nadal!) Jedyne działające rozwiązanie, jakie znalazłem. Chociaż używam psql -c '\x' -c 'SELECT... ORDER BY...'zamiast pg_dump.
nyov
11

Kolejna bezpłatna aplikacja (która może tylko porównywać strukturę, ale nie dane ):

DBeaver - możesz wybrać bazy danych, tabele, itp. Do porównania

iki
źródło
1
Czy mógłbyś lepiej wyjaśnić, jak porównać dane z 2 baz danych z DBeaverem?
nicola
1
O ile wiem, DBeaver umożliwia tylko porównywanie metadanych, a nie porównywanie danych.
nicola,
Bardzo ładne narzędzie. To prawda, że ​​na początku nie jest to zbyt intuicyjne, jak to zrobić. Musisz najpierw wybrać 2 lub więcej obiektów, aby zobaczyć tę opcję.
ihebiheb
8

Oceniłem wiele narzędzi i znalazłem następujące rozwiązanie:

Porównanie schematów :

Najciekawsze były Liquibase, Persyas i PgCodeKeeper:

( problem ) Liquebase konwertuje:

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

w

BIGSERIAL

Więc został odrzucony do użycia

( problem ) Persyas działał dobrze, dopóki nie dodałem dodatkowego schematu i zaczął rzucać następujące:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

Znalazłem więc PgCodeKeeper, który działa idealnie i żyje (możesz sprawdzić wydania). Używam polecenia:

./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

Porównanie danych: Próbowałem użyć Liquebase i po prostu nie działa, możesz zobaczyć kroki, które wypróbowałem w moim pytaniu bez odpowiedzi o różnicy danych dwóch baz danych z Liquebase

Więc znalazłem inny projekt SQL Workbench / J Działa naprawdę dobrze i generuje różnicę w sql. Używam polecenia:

  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 ;'"

Oba narzędzia obsługują filtrację obiektów. To naprawdę wygodne.

Migracje

I wreszcie używam Liquebase tylko do śledzenia migracji / wersji.

i.bondarenko
źródło
6

Pracuję nad wszechstronnym narzędziem porównawczym dla Postgres. Będzie za darmo w wersji beta.

PostgresCompare

Początkowo jest to tylko porównanie schematu (DDL), ale prawdopodobnie rozszerzymy również o dane. Uważam, że jest to narzędzie, którego wiele sklepów wymaga, aby odejść od obecnego systemu RDBMS bez konieczności zmiany sposobu działania ich środowisk programistycznych, operacji itp.

Neil Anderson
źródło
1
Dane są również bardzo ważne. Sam schemat nie wystarczy.
Houman
1
Cześć @Houman. Przepraszam za późną odpowiedź. Masz rację, następnym krokiem będą dane. Wspaniałą rzeczą związaną z budowaniem narzędzia do porównywania schematów jest to, że cały kod do wykrywania tabel itp. Może być współdzielony między nimi.
Neil Anderson
Natknąłem się na tę odpowiedź, samodzielnie budując proste narzędzie do porównywania schematów. Przejrzałem twoją stronę internetową i narzędzie wygląda bardzo obiecująco. Nie mogę się doczekać, aby wypróbować wersję beta
Avantika Saini
Alfa jest już dostępna @AvantikaSaini, a jeśli spróbujesz, daj mi znać, jak to działa, abym mógł ją ulepszyć dla wszystkich.
Neil Anderson
Powinieneś zrobić edukacyjną wersję licencji. Cena jest zbyt wysoka do celów edukacyjnych.
reinaldoluckman
2

Najlepsze narzędzie, jakie kiedykolwiek widziałem https://pythonhosted.org/Pyrseas/

  1. Pobierz zrzut z bazy danych A dbtoyaml ...

  2. Wygeneruj migrację z A => B yamltodb ... [plik wygenerowany w kroku 1]

Oleg Carew
źródło
Wydaje się, że jest to jedyne narzędzie generujące skrypty porównujące porównujące jedną bazę danych i jeden plik zrzutu. Zwykle inne narzędzia porównują dwie bazy danych. Dzięki tej funkcji programiści mogą pracować z lokalną bazą danych deweloperów, a następnie zatwierdzać i rozpowszechniać swoje modyfikacje przez vcs bez tworzenia skryptów migracji, po prostu wykonując dbtoyaml. Programiści innych zespołów mogą aktualizować swoje lokalne bazy danych za pomocą jednego polecenia (yamltodb). Ten przepływ pracy działa trochę jak projekt bazy danych programu Visual Studio.
andreav
0

Stworzyłem narzędzie do porównywania 2 baz danych PostgreSQL na żywo (nie zrzutów), danych tabel i sekwencji. Dość wcześnie, ale osiągnąłem to, co chciałem, może to też pomoże.

https://github.com/dmarkey/pgdatadiff

dmarkey
źródło
0

Moim zdaniem Dbforge to najpotężniejsze narzędzie do porównywania danych w postgresql. Jest to produkt firmy Devart, który można pobrać tutaj .

Mohsen Zahedi
źródło