질답란에 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_restore에서 사용할 파일 만들기 예제:
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 툴을 하나 만들어도 참할 것 같다는 생각이 들더군요.
|