Як порівняти дані між двома базами даних у PostgreSQL?


93

Чи можна порівняти дві бази даних з однаковою структурою? Скажімо, у мене є дві бази даних DB1 і DB2, і я хочу перевірити, чи є різниця в даних між ними.



Порівняння даних dbForge для PostgreSQL вирішує такі проблеми.
Devart

Відповіді:


85

Є кілька інструментів:

(зауважте, що більшість із цих інструментів можуть порівнювати лише структуру, але не дані)

Вільні:

Комерційний:


17
Здається, лише liquibase.org та Aqua Data Studio порівнюють дані, інші лише порівнюють схему.
Амір Алі Акбарі

@AmirAliAkbari LiquiBase робить підтримку схеми подивитися відмінність
a_horse_with_no_name

2
Здається, apgdiffце погано підтримує таблиці успадкування, і виняток видає негайно, коли я намагаюся його використовувати. WbSchemaDiffпрацює дуже добре, сюрприз!
smartwjw

1
@AmirAliAkbari liquibase, схоже, не порівнює дані, коли таблиці існують і мають однакову структуру.
aditsu кинув, бо SE є ЗЛО

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

39

Спробуйте використовувати pg_dumpяк бази даних, так і різні файли.


23
+1 для простого та прямого. Але чи ми точно знаємо, що pg_dump буде скидати дані з однакових баз даних в однаковому порядку, якщо, скажімо, таблиці будувалися в різних порядках? (Я б сподівався, що порядок базується на залежностях обмежень, взагалі не піклуючись про час створення, але надія погано масштабується.)
Майк Шеррілл, "Відкликання кота"

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

11

Ще один безкоштовний додаток (який може порівнювати лише структуру, але не дані ):

DBeaver - ви можете вибрати бази даних, таблиці тощо для порівняння між собою


1
Не могли б ви пояснити, як порівняти дані з 2 баз даних із DBeaver?
Нікола,

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

Дуже хороший інструмент. Це правда, що це не дуже інтуїтивно зрозуміло, як це зробити спочатку. Спочатку потрібно вибрати 2 або більше об’єктів, щоб побачити цю опцію.
ihebiheb 02.03.18

8

Я оцінив багато інструментів і знайшов таке рішення:

Порівняння схеми :

Найцікавішими були 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 лише для відстеження міграції / версії.


6

Я працюю над всебічним інструментом порівняння для Postgres. У бета-версії це буде безкоштовно.

PostgresCompare

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


1
Дані також дуже важливі. Тільки схеми недостатньо.
Гуман,

1
Привіт @Houman. Вибачте за пізній відповідь. Ви праві, дані стануть наступним кроком. Чудова річ у створенні інструменту порівняння схем спочатку полягає в тому, що весь код для виявлення таблиць тощо може бути спільним для них.
Ніл Андерсон,

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

Альфа доступна прямо зараз @AvantikaSaini, і якщо ви спробуєте, дайте мені знати, як це відбувається, щоб я міг вдосконалити її для всіх.
Ніл Андерсон,

Ви повинні зробити освітню версію ліцензії. Ціна занадто висока для навчальних цілей.
reinaldoluckman

2

Найкращий інструмент, який я коли-небудь бачив https://pythonhosted.org/Pyrseas/

  1. Отримати дамп з бази даних А dbtoyaml ...

  2. Сформувати міграцію з A => B yamltodb ... [файл створено на кроці 1]


Здається, це єдиний інструмент для створення різницевих сценаріїв, що порівнює одну базу даних та один файл дампа. Зазвичай інші інструменти порівнюють дві бази даних. Завдяки цій функції розробники можуть працювати, працюючи над локальною базою даних розробників, потім фіксувати та розповсюджувати їх модифікації за допомогою vcs, не створюючи сценарії міграції, просто виконуючи dbtoyaml. Розробники команди Oher можуть оновити свої локальні бази даних за допомогою однієї команди (yamltodb). Цей робочий процес працює трохи як проект бази даних Visual Studio.
andreav

0

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


0

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

https://github.com/dmarkey/pgdatadiff


0

На мій погляд, Dbforge - це найпотужніший інструмент для порівняння даних у postgresql. Це продукт компанії Devart. Ви можете завантажити тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.