Как сравнить данные между двумя базами данных в 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.