Как сравнить данные между двумя базами данных в PostgreSQL?


93

Можно ли сравнить две базы данных с одинаковой структурой? Допустим, у меня есть две базы данных DB1 и DB2, и я хочу проверить, есть ли между ними разница в данных.



dbForge Data Compare for PostgreSQL решает такие проблемы.
Devart

postgrescompare.com/downloads теперь тоже сравнивает данные
Нил Андерсон,

Ответы:


85

Есть несколько инструментов:

(обратите внимание, что большинство этих инструментов могут сравнивать только структуру, но не данные)

Бесплатные:

Коммерческий:


17
Похоже, что только liquibase.org и Aqua Data Studio сравнивают данные, другие просто сравнивают схемы.
Амир Али Акбари

@AmirAliAkbari LiquiBase делает поддержку схемы посмотреть различие
a_horse_with_no_name

2
Кажется, что apgdiffон плохо поддерживает наследование таблиц, и сразу же выдается исключение, когда я пытаюсь его использовать. WbSchemaDiffработает очень хорошо, сюрприз!
smartwjw

1
@AmirAliAkbari Liquibase, похоже, не сравнивает данные, когда таблицы существуют и имеют одинаковую структуру.
aditsu ушел, потому что SE is EVIL

14
-1. OP спрашивал о сравнении данных (записей / строк), и вы в основном перечисляли инструменты, которые сравнивают структуру , которая, как явно указала OP, идентична между целевыми базами данных, поэтому нет причин для их сравнения. Пожалуйста, поясните, какие из них действительно выполняют запрошенную вещь.
Редко нуждающийся 'Где Моника'

39

Попробуйте использовать pg_dumpобе базы данных и сравнить файлы.


23
+1 за простой и прямой. Но знаем ли мы наверняка, что pg_dump будет выгружать данные из идентичных баз данных в одном и том же порядке, если, скажем, таблицы были построены в разном порядке? (Я надеюсь, что порядок основан на зависимостях ограничений, совершенно не заботясь о времени создания, но надежда плохо масштабируется.)
Майк Шерилл «Cat Recall»

10
вы можете использовать -a -d и | Сортировать . Но эти данные могут быть недоступны для импорта, однако их можно использовать для базовой проверки.
Cem Güler

Если честно, это должно быть выше в результатах. Не нужно полагаться на различие, чтобы спасти положение, поэтому эти полномасштабные, тяжелые, основанные на java решения кажутся излишними. Тем не менее, имеет смысл проверять ваши миграции на работоспособность, и pg_dumpэто нормально. Если вы видите существенные различия, pg_dumpвы, вероятно, пытаетесь сравнить несопоставимые вещи. Хотя бы для сравнения PG dbs.
sas

1
К сожалению, это работает только с небольшими базами данных, так как diff не может обрабатывать некоторые большие дампы, которые у меня есть. В противном случае это (все еще!) Действительно единственное работоспособное решение, которое я нашел. Хотя использую psql -c '\x' -c 'SELECT... ORDER BY...'вместо pg_dump.
nyov 01

11

Еще одно бесплатное приложение (которое может сравнивать только структуру, но не данные ):

DBeaver - вы можете выбирать базы данных, таблицы и т. Д. Для сравнения друг с другом


1
Не могли бы вы лучше объяснить, как сравнивать данные из двух баз данных с помощью DBeaver?
Nicola

1
Насколько мне известно, DBeaver позволяет сравнивать только метаданные, но не данные.
Никола

Очень красивый инструмент. Это правда, что сначала не очень понятно, как это делать. Вы должны сначала выбрать 2 или более объекта, чтобы вы могли видеть эту опцию.
ihebiheb 02

8

Я оценил множество инструментов и нашел следующее решение:

Сравнение схем :

Самыми интересными оказались Liquibase, Persyas и PgCodeKeeper:

( проблема ) Liquebase конвертирует:

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

в

BIGSERIAL

Поэтому было отказано в использовании

( проблема ) Persyas работал нормально, пока я не добавил дополнительную схему, и она начинает бросать следующее:

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. Он отлично работает и генерирует реальный 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 только для отслеживания миграции / версий.


6

Я работаю над комплексным инструментом сравнения для Postgres. Пока он находится в бета-версии, он будет бесплатным.

PostgresCompare

Изначально это просто сравнение схем (DDL), но мы, вероятно, также расширим его до данных. Я считаю, что это инструмент, который требуется многим магазинам, чтобы перейти от их текущей СУБД, не меняя при этом то, как работают их среды разработки, операции и т. Д.


1
Данные тоже очень важны. Одной схемы недостаточно.
Houman

1
Привет @Houman. Извините за задержку с ответом. Вы правы, следующим шагом будут данные. Самое замечательное в создании инструмента сравнения схем в первую очередь заключается в том, что весь код для обнаружения таблиц и т. Д. Может совместно использоваться ими.
Нил Андерсон

Я наткнулся на этот ответ, когда сам создавал простой инструмент сравнения схем. Я просмотрел ваш веб-сайт, и инструмент выглядит очень многообещающим. Не могу дождаться, чтобы опробовать бета-версию
Avantika Saini

Альфа-версия доступна прямо сейчас @AvantikaSaini, и если вы попробуете, пожалуйста, дайте мне знать, как это происходит, чтобы я мог улучшить ее для всех.
Нил Андерсон

Вы должны сделать образовательную версию лицензии. Цена слишком высока для образовательных целей.
reinaldoluckman 01

2

Лучший инструмент, который я когда-либо видел https://pythonhosted.org/Pyrseas/

  1. Получить дамп из базы данных A dbtoyaml ...

  2. Создать миграцию из A => B yamltodb ... [файл, созданный на шаге 1]


Кажется, это единственный инструмент, создающий скрипты сравнения, сравнивающие одну базу данных и один файл дампа. Обычно другие инструменты сравнивают две базы данных. Благодаря этой функции разработчики могут работать с локальной базой данных разработчиков, а затем фиксировать и распространять свои модификации с помощью vcs без создания сценариев миграции, просто выполняя dbtoyaml. Другая команда разработчиков может обновлять свои локальные базы данных с помощью одной команды (yamltodb). Этот рабочий процесс немного похож на проект базы данных Visual Studio.
andreav

0

Я также ищу инструмент для сравнения данных в базах данных (в частности, меня интересовало сравнение Redshift DB). Пока лучшее, что я нашел, - это https://www.dbbest.com/products/database-compare-suite/#close . К сожалению, срок действия бесплатной пробной версии истекает через день.


0

Я создал инструмент для сравнения двух живых баз данных PostgreSQL (не дампов), табличных данных и последовательностей. Довольно рано, но я добился того, чего хотел, может быть, это поможет и вам.

https://github.com/dmarkey/pgdatadiff


0

На мой взгляд, Dbforge - самый мощный инструмент для сравнения данных в postgresql. Это продукт компании Devart. Вы можете скачать здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.