PostgreSQL에서 두 데이터베이스 간의 데이터를 비교하는 방법은 무엇입니까?


93

동일한 구조의 두 데이터베이스를 비교할 수 있습니까? 두 개의 데이터베이스 DB1과 DB2가 있고 두 데이터베이스 사이에 데이터 차이가 있는지 확인하고 싶다고 가정 해 보겠습니다.



dbForge Data Compare for PostgreSQL은 이러한 문제를 해결합니다.
Devart

postgrescompare.com/downloads 는 지금도 데이터를 비교합니다
Neil Anderson

답변:


85

몇 가지 도구가 있습니다.

(대부분의 이러한 도구는 구조 만 비교할 수 있지만 데이터는 비교할 수 없습니다.)

무료 :

상업용 :


17
liquibase.org와 Aqua Data Studio만이 데이터를 비교하는 것 같고 다른 하나는 스키마를 비교하는 것 같습니다.
Amir Ali Akbari

@AmirAliAkbari Liquibase는 않는 지원 스키마 차이점
a_horse_with_no_name

2
apgdiff상속 테이블을 잘 지원하지 않는 것 같고 사용하려고 할 때 예외가 즉시 발생합니다. WbSchemaDiff아주 잘 작동합니다, 놀랍습니다!
smartwjw

1
@AmirAliAkbari liquibase는 테이블이 존재하고 동일한 구조를 가질 때 데이터를 비교하지 않는 것 같습니다.
SE가 EVIL이기 때문에 aditsu 종료 됨

14
-1. OP는 데이터 (레코드 / 행) 비교에 대해 묻고 있었으며 대부분 구조 를 비교하는 도구를 나열했습니다. OP는 명시 적으로 대상 데이터베이스간에 동일하다고 명시했으며 비교할 이유가 없습니다. 어떤 것이 실제로 요청한 일을하는지 명확히하십시오.
드물게 '모니카가 어디 있니?'궁핍 한 사람

39

pg_dump두 데이터베이스에서 사용 하고 파일을 비교해 보십시오 .


23
간단하고 직접적인 +1. 그러나 테이블이 다른 순서로 빌드 된 경우 pg_dump가 동일한 데이터베이스의 데이터를 동일한 순서로 덤프한다는 것을 확실히 알고 있습니까? (나는 주문이 제약 의존성에 기반하고 있기를 바랍니다. 창조의 시간을 전혀 신경 쓰지 않지만 희망은 잘 확장되지 않습니다.)
Mike Sherrill 'Cat Recall'Jan

10
-a -d 및 | 정렬. 그러나이 데이터는 가져올 수 없지만 기본 확인에는 괜찮습니다.
Cem Güler

솔직히 말해서 이것은 결과에서 더 높아야합니다. 하루를 절약하기 위해 diff에 의존 할 필요가 없으므로 이러한 완전하고 무거운 Java 기반 솔루션은 과잉처럼 보입니다. 그러나 마이그레이션을 온전하게 확인하는 것이 합리적 pg_dump이며 괜찮습니다. 당신과 상당한 차이 pg_dump가 보인다면 비교할 수없는 것들을 비교하려고 할 것입니다. 적어도 PG dbs를 비교하기 위해.
sas

1
슬프게도 이것은 diff가 내가 가진 큰 덤프를 처리 할 수 ​​없기 때문에 더 작은 데이터베이스에서만 작동합니다. 그렇지 않으면 (여전히!) 내가 찾은 유일한 실행 가능한 솔루션입니다. 비록 내가 사용하고 psql -c '\x' -c 'SELECT... ORDER BY...'대신 pg_dump.
nyov

11

다른 무료 앱 ( 구조 만 비교할 수 있지만 데이터는 비교할 수 없음 ) :

DBeaver- 데이터베이스, 테이블 등을 선택하여 서로 비교할 수 있습니다.


1
DBeaver와 두 데이터베이스의 데이터를 비교하는 방법을 더 잘 설명해 주시겠습니까?
nicola

1
내가 아는 한 DBeaver는 데이터 비교가 아닌 메타 데이터 비교 만 허용합니다.
nicola

아주 좋은 도구입니다. 처음에 그것을 수행하는 방법이 매우 직관적이지 않다는 것은 사실입니다. 이 옵션을 보려면 먼저 2 개 이상의 개체를 선택해야합니다.
ihebiheb

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를 사용하려고했지만 작동하지 않습니다. 답이없는 질문에서 시도한 단계를 볼 수 있습니다. 하는 두 데이터베이스의 데이터 차이에 대한

그래서 다른 프로젝트 SQL Workbench / J를 찾았습니다. 정말 잘 작동하고 SQL에서 reall diff를 생성합니다. 다음 명령을 사용합니다.

  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에 대한 포괄적 인 비교 도구를 개발 중입니다. 베타 버전에서는 무료입니다.

Postgres 비교

처음에는 이것은 스키마 (DDL) 비교 일 뿐이지 만 데이터도 확장 할 것입니다. 나는 이것이 개발 환경, 운영 등의 작동 방식을 변경하지 않고도 현재 RDBMS에서 이동하기 위해 많은 상점에서 필요한 도구라고 생각합니다.


1
데이터도 매우 중요합니다. 스키마만으로는 충분하지 않습니다.
Houman

1
안녕하세요 @Houman. 늦은 답변 죄송합니다. 당신 말이 맞습니다. 데이터는 다음 단계가 될 것입니다. 스키마 비교 도구를 먼저 구축 할 때 가장 좋은 점은 테이블 등을 검색하기위한 모든 코드를 이들간에 공유 할 수 있다는 것입니다.
Neil Anderson

간단한 스키마 비교 도구를 직접 작성하는 동안이 대답을 보았습니다. 귀하의 웹 사이트를 살펴본 결과 도구가 매우 유망 해 보입니다. 베타 버전 시험을 기다릴 수 없어
Avantika Saini

알파는 지금 @AvantikaSaini에서 구할 수 있습니다. 시도해 주시면 어떻게 진행되는지 알려 주시면 모두를 위해 개선 할 수 있습니다.
Neil Anderson

교육용 라이선스를 만들어야합니다. 교육용으로 가격이 너무 높습니다.
reinaldoluckman

2

내가 본 최고의 도구 https://pythonhosted.org/Pyrseas/

  1. 데이터베이스 A dbtoyaml에서 덤프 가져 오기 ...

  2. A => B yamltodb에서 마이그레이션 생성 ... [1 단계에서 생성 된 파일]


이것은 하나의 데이터베이스와 하나의 덤프 파일을 비교하는 diff 스크립트를 생성하는 유일한 도구 인 것 같습니다. 일반적으로 다른 도구는 두 데이터베이스를 비교합니다. 이 기능 덕분에 개발자는 로컬 dev 데이터베이스를 작업 한 다음 마이그레이션 스크립트를 만들지 않고 dbtoyaml 만 실행하여 vcs로 수정 사항을 커밋하고 배포 할 수 있습니다. Oher 팀 개발자는 단일 명령 (yamltodb)으로 로컬 데이터베이스를 업데이트 할 수 있습니다. 이 워크 플로는 Visual Studio 데이터베이스 프로젝트와 약간 유사합니다.
andreav


0

2 개의 라이브 PostgreSQL 데이터베이스 (덤프가 아님), 테이블 데이터 및 시퀀스를 비교하는 도구를 만들었습니다. 꽤 초기에는 내가 원하는 것을 달성했습니다. 어쩌면 당신에게도 도움이 될 수 있습니다.

https://github.com/dmarkey/pgdatadiff


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.