2016-09-25 4 views
0

pg_dump -s database을 실행하여 스키마와 저장 프로 시저를 백업하고 있습니다. 이 작동하지만 모든 변경 (내가 뭔가를 바꿀 때마다 ALTER, 시간이 지남에 따라 변경된 저장 프로 시저의 새로운 선언 각각 등)을 보여주는 것처럼 보입니다.PostgreSQL에서 내 스키마를 깨끗하게 백업하십시오.

나는 좋겠다. 그냥 현재의 스키마 그래서 뭔가를 잘못 될 일을 복원 할 수 있습니다. 이것이 가능한가?

답변

1

TL/DR : 이것은 발생하지 않습니다. pg_dump은 가져 오기 속도를 높이기 위해 최적화 된 출력을 생성합니다.

정말이에요? postgresql은 스키마 변경 내역을 저장하지 않으므로 pg_dump이 그것을 출력 할 수 없습니다. 혼란을 야기한 몇 가지 이유가 있습니다. 첫째, pg_dump은 일반적으로 create table 문을 여러 문으로 나눕니다. 예를 들어,이 create table 문을 고려해

CREATE TABLE t (
    id integer primary key, 
    q integer not null references q 
); 

pg_dump

CREATE TABLE t (
    id integer NOT NULL, 
    q integer NOT NULL 
); 
ALTER TABLE ONLY t 
    ADD CONSTRAINT t_pkey PRIMARY KEY (id); 
ALTER TABLE ONLY t 
    ADD CONSTRAINT t_q_fkey FOREIGN KEY (q) REFERENCES q(id); 

이 원래 하나에 해당로 변환됩니다. 일반적으로 pg_dump은 (1) 제약 조건/인덱스없이 테이블을 생성하고, (2) 테이블 데이터를 가져오고 마지막으로 alter table/create index으로 제약 조건/인덱스를 생성하는 순서로 테이블 생성 명령문을 만듭니다. 이 순서대로 수행하는 이유는 인덱스가없는 테이블 데이터를 가져 와서 나중에 인덱스를 작성하는 것이 빠르기 때문입니다. 그러나 이것이 postgresql이 테이블 변경의 전체 기록을 기억한다는 것을 의미하지는 않습니다. 다른 열을 추가하고 나중에 pg_dump을 호출하면 그 결과로 열이 표시됩니다 create table. 이제 -s 플래그를 사용하면이 분할은 불필요 할 수 있지만 pg_dump은 테이블을 생성하는 문을 출력하는 방법을 변경하지 않습니다. 위의 단계 (2)를 건너 뛰고 단계 (1) & (3)을 수행합니다.

마지막으로 혼란을 야기 할 수있는 또 다른 문제입니다. postgresql의 함수는 다른 유형의 인수 또는 다른 수의 인수를 갖는 여러 정의를 제공하여 오버로드 할 수 있습니다. 그래서 당신은 당신이 두 가지 기능은 다른 기능으로 처리되기 때문에

CREATE OR REPLACE FUNCTION foo(x text, y boolean) ... 

후 두 번째 문이 처음에 생성 기능을 삭제하지 않습니다 할 나중에 다음

CREATE OR REPLACE FUNCTION foo(x int) ... 

및 작업을 수행합니다. 따라서 pg_dump은 둘 다 출력합니다. 다시 말해, 이것은 postgresql이 이전의 삭제 기능을 기억한다는 것을 의미하지는 않습니다.

관련 문제