PostgreSQL 백업 및 복구

PostgreSQL을 이용해서 웹페이지를 만들고 있는데, 계속 소스 볼륨이 커지다보니 git branch 를 추가하면서 개발을 하고 있다. git 브랜치 생성 및 병합방법 관련 포스팅은 여기를 클릭하여 참고한다. 소스는 잘 나누어 개발하고 있는데, DB는 실제 운영중인 DB에다 계속 테스트거래를 해볼 수는 없어서, 하나의 테스트DB 환경을 하나 더 만들어 보고자 했다.

Backup and Restore

PostgreSQL 백업방법은 공식문서를 보면 3가지 방법이 있는데, 여기 포스팅에서는 SQL dump 방법만 작성해본다. pg_dump 명령어를 사용하면 되며, 백업하고자 하는 데이터베이스(여기서는 mydb)를 기술하고, 백업파일의 이름(여기서는 dumpfile)을 넣어주면 된다. 간단하다.

$ pg_dump mydb > dumpfile

새로 만들 테스트환경의 데이터베이스를 하나 만든다. 이름은 test 로 정했다.

$ createdb test

아까 만들어놓은 dumpfile 백업파일을 새로만든 데이터베이스 test 에다가 복원한다.

$ psql test < dumpfile

SET
SET
 set_config
------------

(1 row)

CREATE SCHEMA
ALTER SCHEMA
CREATE SCHEMA
ALTER SCHEMA
CREATE EXTENSION
COMMENT
CREATE FUNCTION
ALTER FUNCTION
CREATE SEQUENCE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
CREATE TABLE

COPY 32
COPY 18
COPY 6
COPY 8
COPY 267
COPY 34
COPY 84

 setval
--------
  10034
(1 row)

 setval
--------
     47
(1 row)

...(생략)...

데이터베이스 삭제와 복원

dropdb 명령어로 데이터베이스를 삭제할 수 있다. 다만, 커넥션이 있는 경우 아래와 같은 에러메시지를 볼 수 있다.

$ dropdb test
dropdb: error: database removal failed: ERROR:  database "test" is being accessed by other users
DETAIL:  There are 13 other sessions using the database.

was 를 중지하고, sql 툴도 종료하고 하면 삭제할 수 있지만, 그건 너무 귀찮고 강제삭제처리 옵션이 있으니 그걸 사용하면 된다. dropdb 문서에 따르면, -f 옵션을 줘서 커넥션이 있더라도 강제 drop 처리를 할 수 있다.

* dropdb — remove a PostgreSQL database

-f
--force
Attempt to terminate all existing connections to the target database before dropping it. See DROP DATABASE for more information on this option.

혼자 막 사용하는 테스트계 DB 라서 아래처럼 막 지우고 다시 백업하는 것이니, 본인의 환경에 맞춰 잘 사용하면 된다.

$ pg_dump mydb > dumpfile

$ dropdb -f test

$ createdb test 

$ psql test < dumpfile

더 보면 좋을 글들