출처 : 데이터베이스 사랑넷(http://database.sarang.net)

원본 위치 : http://database.sarang.net/?inc=read&aid=5870&criteria=pgsql&subcrit=&id=&limit=20&page=1

질답란에 pg_restore 이야기 있어 잠깐 살펴보았는데,

이 멋진 프로그램이 7.1 버전부터 있었다는 것에 놀랐습니다.

늘 pg_dump mydb > mydb.sql ; psql -f mydb.sql mydb

이런식으로 백업과 복구를 했었는데,

pg_restore 놈이 이렇게 참한 놈이였음을 누군가가 이야기 해주었다면, :(

이야기 시작합니다.

pg_restore 명령은 pg_dump -F{c|t} 명령에 의해서 만들어진 덤프 파일을 사용합니다.

이 명령으로 거의 모든 객체를 개별적으로 복구시킬 수 있습니다.

테이블(-t), 인덱스(-I), 함수(-P), 트리거(-T)는 기본적으로 명령행 옵션으로 지정할 수 있으며, -L 명령을 이용해서 개별적으로 지정한 하나하나씩 섬세하게 복구할 수도 있습니다.

(하나 아쉬운 것은 특정 스키마(namespace) 전체를 쉽게 복구할 방법은 없네요.)

스키마(namespace)단위로 관리된다면, pg_dump 를 사용할 때, -n 옵션으로 개별적으로 덤프받으시길 바랍니다.

pg_dump로 백업하기

pg_dump -h localhost -U postgres -Fc -f mydb.backup mydb

(mydb 데이터베이스 전체를 백업 받습니다)

pg_dump -h localhost -U postgres -Ft -f mydb.backup mydb

(윗 명령과 동일한데, mydb.backup 파일의 사이즈가 커집니다. 대신 복구할 때 압축을 풀지 않으니 좀 더 빠르겠지요)

pg_dump -h localhost -U postgres -Ft -f mydb.backup -n ioseph mydb

(mydb 데이터베이스에서 ioseph schema 영역의 자료만 백업받습니다)

pg_dump -h localhost -U postgres -Ft -f mydb.backup -t zipcode mydb

(mydb 데이터베이스에서 zipcode 테이블만 백업 받습니다)

다음 pg_restore 로 복구하기.

먼저 덤프 받은 backup 파일의 내용을 보려면, -l 옵션을 이용합니다.

pg_restore -l mydb.backup

나중에 이 내용을 기반으로 특정 부분만 따로 복구해야할 상황이면, 이 출력되는 내용을 파일로 저장해두어야합니다.

pg_restore -l mydb.backup > mydb.toc

또는

pg_restore -l -f mydb.toc mydb.backup

다음,

일단 데이터베이스가 없다면, 데이터베이스부터 만들어야합니다.

데이터베이스를 만드려면, 일단 접속할 수 있는 기본 데이터베이스를 지정해야합니다.

pg_restore -h localhost -U postgres -Ft -C -d template1 mydb.backup

(mydb 데이터베이스를 일단 만들고 mydb.backup 안에 있는 내용을 복구합니다.)

기본적으로 -d 옵션을 지정하지 않으면, 표준 출력으로 쿼리를 보냅니다.

pg_restore -Ft mydb.backup > mydb.sql

즉, mydb.sql 의 내용은 pg_dump mydb > mysql.sql 명령에 의해서 만들어지는 내용과 동일합니다.

즉, 이 backup 파일의 내용을 복구시키려면, -d 옵션으로 해당 데이터베이스를 지정해 주어야합니다.

pg_restore -h localhost -U postgres -Ft -d mydb mydb.backup

다음은 toc 파일을 이용한 부분 복구

윗 부분에서 pg_restore -l -f mydb.toc mydb.backup 명령으로 만들어진 mydb.toc 파일을 열어서

복구하지 않아도 되는 부분의 자료 맨 앞에 ; 표시를 해 두거나 그 줄을 삭제 하면 됩니다.

그리고,

pg_restore -h localhost -U postgres -L mydb.toc -d mydb mydb.backup

이런식으로 복구합니다.

마무리하며,

pg_restore 명령을 사용해보면서, 이 명령어를 내부적으로 사용하는 gui 툴을 하나 만들어도 참할 것 같다는 생각이 들더군요.

, .