2017-04-21 2 views
0

이것이 이상한 요청이라는 것을 알고 있습니다.하지만 피할 수없는 일부 이유 때문에 한 데이터베이스에서 다른 테이블로 일관되게 동기화 할 수 있기를 바랍니다. 내가 스크립트에서 직접 기능을 작성할 수 있다는 것을 알고 있지만, pg_dumppg_restore은 자신을 알지 못하는 프로세스에 많은 최적화를 적용 할 것입니다.pg_restore를 사용하여 테이블 만들기 또는 덮어 쓰기

pg_restore이 기존 테이블을 덮어 쓰게하는 방법이 있다면 궁금합니다. 기본적으로 의사 코드에서 다음과 같은 코드를 사용합니다.

-- pseudo code 
begin; 
drop table to_restore; 
drop table to_restore2; 
drop table to_restore3; 

-- etc 

restore table to_restore; 
restore table to_restore2; 
restore table to_restore3; 

-- etc 
commit; 

이렇게 대단히 좋지 않은 경우에도 대안을 사용할 수 있습니다. CSV로 제 DB에서

복사 해당 테이블 :

+0

당신은 포스트그레스 거래 –

+0

@ VaoTsun에 bash 명령을 넣을 수 없으므로 내가 왜 그것을 psuedo-code라고 부르는 지 알 수 있습니다. 나는 할 수 없다는 것을 알고 있지만, 동등한 일을하고 싶다. – m0meni

+0

트랜잭션을 사용하고 to (또는 fdw, 또는 dblink)에서'COPY'라고 말하거나, 트랜잭션 –

답변

1

보인다는 pg_restore documentation

-c

--clean

클린 (드롭) 데이터베이스에 지정된 -c 옵션을 원하는처럼 객체를 다시 만들기 전에 (사용 굳이 이렇게이 - 존재하지 않는 물건이 대상 데이터베이스에 존재하지 않는 경우이 일부 무해한 오류 메시지를 생성 할 수 있습니다.) 당신이 하나의 트랜잭션에서 모든 작업을 수행 할 -1 플래그와 함께 사용할 수있는

-1

- 단일 트랜잭션

는 단일 트랜잭션으로 복원 실행 (즉, BEGIN/커밋 방출 명령을 바꿈). 이렇게하면 모든 명령이 성공적으로 완료되거나 변경 사항이 적용되지 않습니다. 이 옵션은 --exit-on-error를 의미합니다.

+0

나는 감사합니다. – m0meni

+0

부분 데이터를 복원 할 때는주의하십시오. 어떤 경우에는 복원 작업이 실패했으며 모든 작업이 롤백 될 것으로 생각했습니다.새로운 행을 삽입 할 때 중복 키 값 오류가 발생하는 이유를 이해하는 데는 시간이 걸렸습니다. 시퀀스 테이블이 복원되었지만 롤백되지 않고 데이터가 복원되지 않았습니다! – DeepButi

1

이 가능한 솔루션의 예이다. 거래에 매우 빠른 복사를 사용

begin; 
truncate table to_restore; 
truncate table to_restore2; 
truncate table to_restore3; 
    set commit_delay to 100000; 
    set synchronous_commit to off; 
copy to_restore from 'to_restore.csv'; 
copy to_restore2 from 'to_restore2.csv'; 
copy to_restore3 from 'to_restore3.csv'; 
commit; 
+0

안타깝게도, ** only **'pg_restore'를 사용하고 내 자신의 SQL을 쓰려고하지 않았기 때문에 이것은 도움이되지 않는다. – m0meni

+0

맞아요. 트랜잭션이거나'pg_restore'입니다. –

+0

'--single-transaction' 옵션으로 pg_restore를 실행할 수 있습니다. – m0meni

관련 문제