Чи можна порівняти дві бази даних з однаковою структурою? Скажімо, у мене є дві бази даних DB1 і DB2, і я хочу перевірити, чи є різниця в даних між ними.
Чи можна порівняти дві бази даних з однаковою структурою? Скажімо, у мене є дві бази даних DB1 і DB2, і я хочу перевірити, чи є різниця в даних між ними.
Відповіді:
(зауважте, що більшість із цих інструментів можуть порівнювати лише структуру, але не дані)
Вільні:
Комерційний:
apgdiff
це погано підтримує таблиці успадкування, і виняток видає негайно, коли я намагаюся його використовувати. WbSchemaDiff
працює дуже добре, сюрприз!
Спробуйте використовувати pg_dump
як бази даних, так і різні файли.
pg_dump
це добре. Якщо ви бачите суттєві відмінності, pg_dump
ви, мабуть, намагаєтеся порівняти речі, які неможливо порівняти. Принаймні для порівняння PG dbs.
psql -c '\x' -c 'SELECT... ORDER BY...'
замість pg_dump
.
Ще один безкоштовний додаток (який може порівнювати лише структуру, але не дані ):
DBeaver - ви можете вибрати бази даних, таблиці тощо для порівняння між собою
Я оцінив багато інструментів і знайшов таке рішення:
Порівняння схеми :
Найцікавішими були Liquibase, Persyas та PgCodeKeeper:
( випуск ) Liquebase перетворює:
SET DEFAULT nextval('myschema.name_id_seq'::regclass)
в
BIGSERIAL
Тож його було відхилено до використання
( випуск ) Персія працював нормально, доки я не додав додаткову схему, і вона починає кидати наступне:
pyrseas_1 | TypeError: 'NoneType' object is not iterable
Отже, я знайшов PgCodeKeeper, який працює ідеально, і він живий (ви можете перевірити випуски). Я використовую таку команду:
./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
Порівняння даних: Я намагався використовувати Liquebase, але це просто не працює. Ви можете побачити кроки, які я спробував у своєму запитанні без відповіді про різницю даних двох баз даних із Liquebase
Тож я знайшов інший проект SQL Workbench / J Він працює дуже добре і генерує reall diff в sql. Я використовую таку команду:
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 ;'"
Обидва інструменти підтримують фільтрацію об'єктів. Це справді зручно.
Міграції
І нарешті, я використовую Liquebase лише для відстеження міграції / версії.
Я працюю над всебічним інструментом порівняння для Postgres. У бета-версії це буде безкоштовно.
Спочатку це просто порівняння схеми (DDL), але ми, ймовірно, також розширимося до даних. Я вважаю, що це інструмент, який потрібен багатьом магазинам, щоб перейти від своїх поточних СУБД без необхідності також змінювати спосіб роботи середовищ розробки, операцій тощо.
Найкращий інструмент, який я коли-небудь бачив https://pythonhosted.org/Pyrseas/
Отримати дамп з бази даних А dbtoyaml ...
Сформувати міграцію з A => B yamltodb ... [файл створено на кроці 1]
Я також шукаю інструмент для порівняння даних у базах даних (зокрема, мені було цікаво порівняти БД Redshift). Поки що найкраще, що я знайшов, це https://www.dbbest.com/products/database-compare-suite/#close . На жаль, безкоштовна пробна версія закінчується через один день.
Я створив інструмент для порівняння 2 реальних баз даних PostgreSQL (не дампів), табличних даних та послідовностей. Досить перші дні, але досягли того, що я хотів, щоб це зробило, можливо, це може допомогти і вам.
На мій погляд, Dbforge - це найпотужніший інструмент для порівняння даних у postgresql. Це продукт компанії Devart. Ви можете завантажити тут .