포스트

PostgreSQL pg_dump, pg_restore 사용법

pg_dump의 plain/custom/directory/tar 포맷 선택 기준, psql로는 plain만 복원되는 이유, pg_restore의 병렬 처리(-j)와 선택적 복원(-n/-t)이 빛나는 지점.

PostgreSQL pg_dump, pg_restore 사용법

데이터베이스 백업이라고 하면 방법이 하나뿐일 것 같지만, PostgreSQL은 크게 두 갈래다. 하나는 pg_dump로 스키마와 데이터를 SQL이나 아카이브 형태로 추출하는 논리 백업, 다른 하나는 데이터 디렉토리 자체를 복사하는 물리 백업이다.

논리 백업은 특정 데이터베이스나 테이블만 골라 뽑을 수 있고 버전·플랫폼을 넘나드는 이식성이 좋다. 개발 DB를 스테이징으로 옮기거나, 실수로 지운 테이블 하나를 되살리거나, 메이저 업그레이드 전에 논리적 스냅샷을 남길 때 제격이다. 반면 “장애 발생 5분 전 시점으로 정확히 되돌린다”거나 수백 GB를 초 단위 손실 없이 복구해야 한다면 물리 백업과 PITR의 영역이다. 이 글은 전자, 즉 pg_dump/pg_restore를 다룬다. 시점 복구가 필요하다면 아래 관련 글의 PITR 편으로 넘어가면 된다.

pg_dump를 사용한 백업

pg_dump는 지정한 데이터베이스를 백업 파일로 추출한다.

1
2
pg_dump -h {host} -p {port} -U {user} -d {database} -f {backup_file}
pg_dump -h {host} -p {port} -U {user} -d {database} > {backup_file} # 표준 출력으로 백업 파일 생성

옵션

  • -h : 호스트
  • -p : 포트
  • -U : 사용자
  • -d : 데이터베이스
  • -f : 백업 파일명
  • -F : 백업 파일 포맷 (p, c, d, t)
  • -v : 상세 로그 출력
  • -n : 스키마 (-n public, -n schema1, -n schema1,schema2, 제외는 -N schema)
  • -t : 테이블 (-t table1, -t table1,table2)
  • -j : 병렬 처리 수 (directory 포맷에서만)
  • --schema-only : 스키마만 백업
  • --data-only : 데이터만 백업

포맷 선택

-F 옵션으로 백업 파일의 형태를 고른다. 어떤 포맷을 쓰느냐에 따라 이후 복원 도구와 복원 시 활용할 수 있는 기능이 달라진다.

포맷플래그특징복원 도구
plain-Fp (기본값)SQL 스크립트. 사람이 읽고 편집 가능psql
custom-Fc단일 바이너리 파일. 자동 압축, 선택적 복원 가능pg_restore
directory-Fd여러 파일로 분할. 병렬 백업/복원(-j) 지원pg_restore
tar-Fttar 아카이브pg_restore

plain은 결과물이 곧 SQL 텍스트라 psql로 밀어 넣으면 그대로 실행된다. 반대로 말하면 psql은 SQL 파일만 복원할 수 있다. custom·directory·tar는 아카이브 구조라서 pg_restore가 있어야 풀 수 있고, 그 대신 압축·병렬·선택적 복원 같은 기능을 얻는다.

백업이 크고 복원 속도가 중요하면 directory 포맷이 유리하다. 여러 파일로 나뉘어 있어 -j로 병렬 복원이 가능하기 때문이다.

pg_restore를 사용한 복원

pg_restore는 아카이브 포맷(custom/directory/tar)으로 만든 백업을 복원한다. plain SQL만 처리하는 psql과 달리 병렬 처리와 선택적 복원을 지원해 백업 파일이 클 때 진가를 발휘한다.

1
2
3
4
pg_restore -h {host} -p {port} -U {user} -d {database} -v {backup_file}        # custom/tar 파일 복원
pg_restore -h {host} -p {port} -U {user} -d {database} -v -Fd {backup_dir}     # directory 복원
pg_restore -h {host} -p {port} -U {user} -d {database} -v -j {num} {backup_dir} # 병렬 복원
pg_restore -h {host} -p {port} -U {user} -d {database} -v -t {table} {backup_file} # 특정 테이블만 복원

plain 포맷으로 백업했다면 pg_restore가 아니라 psql로 복원한다.

1
2
psql -h {host} -p {port} -U {user} -d {database} -f {backup_file}
psql -h {host} -p {port} -U {user} -d {database} < {backup_file} # 표준 입력으로 복원

pg_dump와 pg_restore 비교

기능pg_dumppg_restore
역할데이터베이스 백업 생성pg_dump로 생성된 백업 복원
다루는 형식plain / custom / directory / tarcustom / directory / tar
병렬 처리지원하지 않음directory 형식에서 지원
선택적 복원불가능특정 테이블/스키마만 복원 가능

plain 포맷은 pg_restore가 아니라 psql로 복원한다는 점이 핵심이다. 병렬·선택적 복원이 필요하면 애초에 custom이나 directory로 백업해 둬야 한다.

관련 글

관계
PostgreSQL PITR와 백업 전략시점 복구가 필요하면 — WAL 아카이빙·pg_basebackup
PostgreSQL 복제와 고가용성같은 데이터를 실시간 이중화
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.