pg_dump -s database
을 실행하여 스키마와 저장 프로 시저를 백업하고 있습니다. 이 작동하지만 모든 변경 (내가 뭔가를 바꿀 때마다 ALTER, 시간이 지남에 따라 변경된 저장 프로 시저의 새로운 선언 각각 등)을 보여주는 것처럼 보입니다.PostgreSQL에서 내 스키마를 깨끗하게 백업하십시오.
나는 좋겠다. 그냥 현재의 스키마 그래서 뭔가를 잘못 될 일을 복원 할 수 있습니다. 이것이 가능한가?
pg_dump -s database
을 실행하여 스키마와 저장 프로 시저를 백업하고 있습니다. 이 작동하지만 모든 변경 (내가 뭔가를 바꿀 때마다 ALTER, 시간이 지남에 따라 변경된 저장 프로 시저의 새로운 선언 각각 등)을 보여주는 것처럼 보입니다.PostgreSQL에서 내 스키마를 깨끗하게 백업하십시오.
나는 좋겠다. 그냥 현재의 스키마 그래서 뭔가를 잘못 될 일을 복원 할 수 있습니다. 이것이 가능한가?
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이 이전의 삭제 기능을 기억한다는 것을 의미하지는 않습니다.