2010-02-05 5 views
1

나는 pg_dumps, DUMP1 및 DUMP2를 (를) 만들고 있습니다.postgresql 데이터베이스 덤프 (pg_dump) 정렬

DUMP1과 DUMP2는 DUMP2가 DUMP1의 역순으로 덤프 된 것을 제외하고는 정확히 동일합니다.

어쨌든 내가 두 DUMPS를 정렬하여 (DUMP를 사용할 때) 두 DUMP 파일이 정확히 동일 할 수 있습니까?

저는 PHP와 리눅스를 사용하고 있습니다. 내가 리눅스에서 "정렬"을 사용했지만, 작동하지 않습니다 ...

고마워!

답변

3

From your previous question 저는 실제로 당신이하려는 것은 데이터베이스를 포함하여 데이터베이스가 동일한 지 확인하기 위해 데이터베이스와 비교하는 것으로 가정합니다.

As we saw there, pg_dump는 결정 론적으로 행동하지 않습니다. 한 파일이 다른 파일의 반대가된다는 사실은 아마도 우연입니다.

스키마 및 데이터를 포함한 전체 비교를 수행 할 수있는 방법은 다음과 같습니다.

먼저 using this method 스키마를 비교하십시오.

두 번째로 일관성있는 순서로 파일을 모두 덤프하여 데이터를 비교하십시오. 순서는 이름으로 테이블을 먼저 정렬 한 다음 기본 키 열로 각 테이블 내의 데이터를 정렬하여 보장됩니다.

아래 쿼리는 COPY 문을 생성합니다.

select 
    'copy (select * from '||r.relname||' order by '|| 
    array_to_string(array_agg(a.attname), ',')|| 
    ') to STDOUT;' 
from 
    pg_class r, 
    pg_constraint c, 
    pg_attribute a 
where 
    r.oid = c.conrelid 
    and r.oid = a.attrelid 
    and a.attnum = ANY(conkey) 
    and contype = 'p' 
    and relkind = 'r' 
group by 
    r.relname 
order by 
    r.relname 

해당 쿼리를 실행하면 당신에게 모든 텍스트 파일들을 넣어 copy (select * from test order by a,b) to STDOUT; 같은 문장의 목록을 제공하고 각 데이터베이스에 대해 psql를 통해 실행하고 출력 파일을 비교합니다. output settings to COPY으로 조정할 필요가 있습니다.

0

아마도 덤프를 분석 할 가치가 없습니다.

DUMP2를 임시 데이터베이스로 복원하고 임시 데이터베이스를 올바른 순서로 덤프하는 것이 훨씬 더 빠릅니다.

+0

당신이 무슨 뜻인지 명확히 할 수 보는가? DUMP 2를 임시 데이터베이스로 복원 하겠지만 "임시 데이터베이스를 올바른 순서로 덤프하십시오." 감사합니다. – littleK

+0

오, DUMP2를 임시 데이터베이스로 복원 한 다음 해당 데이터베이스를 덤프하는 것을 의미합니다 ... – littleK

2

제 해결책은 pg_dump 출력을위한 자체 프로그램을 코딩하는 것이 었습니다. 기본 키로 덤프를 정렬하는 PgDumpSort을 자유롭게 다운로드하십시오. Java 기본 메모리가 512MB 인 경우 레코드 정보 (기본 키 값, 파일 오프셋)가 메모리에 보관되므로 테이블 당 최대 1,000,000 개의 레코드로 작업해야합니다.

당신은이 작은 자바 프로그램을 사용합니다. 그리고

java -cp ./pgdumpsort.jar PgDumpSort db.sql 

당신은 "DB-sorted.sql"라는 이름의 파일을 얻거나 출력 파일 이름을 지정합니다

java -cp ./pgdumpsort.jar PgDumpSort db.sql db-$(date +%F).sql 

을 그리고 정렬 된 데이터는 DB-2013- "같은 파일에 06-06.sql "

지금 당신이 당신이 usuall입니다 증분 백업을 생성 할 수 있습니다

diff --speed-large-files -uN db-2013-06-05.sql db-2013-06-06.sql >db-0506.diff 

DIFF을 사용하여 패치를 만들 수 있습니다 y 방법 작게.당신이

patch -p1 < db-0506.diff 

사용하여 원본 파일에 패치를 적용해야 파일을 복원하려면

+0

우수, QA 목적을 위해 일부 사전 및 사후 남부 스크립트 데이터베이스 덤프를 비교하는 빠른 방법이 필요했습니다. 빠르고 쉽습니다. 고마워요. 두 덤프에서 실행, 고아를위한 낚시, 즉시 보장 우리는 모든 데이터를 캐스케이드거야. –

0

  • 하면 성능을 위해
  • 보다 중요하다 (소스 코드은 JAR 파일의 내부)
  • 데이터 만 신경 쓰고 두 덤프를 다시 만들 수 있습니다 (기존 덤프를 사용할 필요가 없음)

이 같은 결정 위해 CSV 형식의 데이터를 덤프 할 수 있습니다

COPY (select * from your_table order by some_col) to stdout 
     with csv header delimiter ','; 

COPY (9.5)

관련 문제