Czy można porównać dwie bazy danych o identycznej strukturze? Powiedzmy, że mam dwie bazy danych DB1 i DB2 i chcę sprawdzić, czy są między nimi różnice w danych.
Czy można porównać dwie bazy danych o identycznej strukturze? Powiedzmy, że mam dwie bazy danych DB1 i DB2 i chcę sprawdzić, czy są między nimi różnice w danych.
Odpowiedzi:
(zauważ, że większość z tych narzędzi może tylko porównywać strukturę, ale nie dane)
Darmowe:
Reklama w telewizji:
apgdiff
nie obsługuje dobrze dziedziczenia tabel, a wyjątek rzuca się natychmiast, gdy próbuję go użyć. WbSchemaDiff
działa bardzo dobrze, niespodzianka!
Spróbuj użyć pg_dump
na obu bazach danych i porównaj pliki.
pg_dump
jest 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.
psql -c '\x' -c 'SELECT... ORDER BY...'
zamiast pg_dump
.
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
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.
Pracuję nad wszechstronnym narzędziem porównawczym dla Postgres. Będzie za darmo w wersji beta.
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.
Najlepsze narzędzie, jakie kiedykolwiek widziałem https://pythonhosted.org/Pyrseas/
Pobierz zrzut z bazy danych A dbtoyaml ...
Wygeneruj migrację z A => B yamltodb ... [plik wygenerowany w kroku 1]
Poszukuję też narzędzia do porównywania danych w bazach danych (w szczególności interesowało mnie porównanie Redshift DB). Jak dotąd najlepsze, jakie znalazłem, to https://www.dbbest.com/products/database-compare-suite/#close . Niestety bezpłatny okres próbny wygasa po jednym dniu.
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.
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 .