pg_dump와 pg_restore를 사용하여 데이터베이스 백업 및 복원하는 방법

`pg_dump`와 `pg_restore`에 대한 이 종합 가이드를 통해 PostgreSQL 데이터 보호를 마스터하세요. 일반 텍스트, 사용자 지정, 디렉터리 등 다양한 형식을 사용하여 안정적인 데이터베이스 백업을 생성하는 방법을 배우세요. 효율적인 덤핑을 위한 필수 옵션을 알아보고 데이터를 복원하기 위한 단계별 지침을 살펴보세요. 이 튜토리얼은 데이터 무결성 및 복구 기능을 보장하기 위해 PostgreSQL 백업의 스케줄링, 테스트, 안전한 관리를 위한 모범 사례를 다룹니다.

pg_dump와 pg_restore를 사용한 데이터베이스 백업 및 복원 방법

복원 가능한 PostgreSQL 백업이 필요합니다. 단순히 백업처럼 보이는 파일이 아니라 말이죠. pg_dumppg_restore는 논리적 백업을 위한 표준 도구입니다. 데이터베이스 객체와 데이터를 휴대용 덤프로 복사한 후, 동일한 서버, 테스트 서버 또는 새 PostgreSQL 인스턴스에서 다시 빌드합니다.

이 가이드는 단일 데이터베이스 논리적 백업에 중점을 둡니다. 전체 클러스터 재해 복구, 특정 시점 복구 또는 매우 큰 설치의 경우 물리적 백업 및 WAL 보관과 함께 사용하세요.

pg_dump 이해하기

pg_dump는 하나의 데이터베이스에 연결하여 스키마와 데이터를 내보냅니다. 역할, 테이블스페이스 또는 글로벌 클러스터 객체는 덤프하지 않습니다. 이러한 항목이 필요하면 pg_dumpall --globals-only를 사용하세요.

출력 형식

pg_dump는 여러 출력 형식을 지원합니다.

  • 일반 텍스트 (-Fp, 기본값): psql로 복원하는 SQL을 작성합니다. 검사 및 편집이 쉽지만, 대규모 복원은 느리고 덜 유연할 수 있습니다.
  • 사용자 정의 아카이브 (-Fc): pg_restore용 압축 아카이브를 작성합니다. 선택적 복원 및 병렬 복원을 지원합니다.
  • 디렉터리 형식 (-Fd): 파일 디렉터리를 작성합니다. 병렬 덤프 및 병렬 복원을 지원하여 대규모 데이터베이스에 유용합니다.
  • Tar 형식 (-Ft): pg_restore용 tar 아카이브를 작성합니다. 단일 파일이지만 사용자 정의 아카이브처럼 형식 내에서 압축을 지원하지 않습니다.

일반적인 pg_dump 옵션

다음은 pg_dump에서 가장 자주 사용되는 옵션 중 일부입니다.

  • -h <호스트명>: 호스트에 연결합니다.
  • -p <포트>: 포트에 연결합니다.
  • -U <사용자명>: 사용자로 연결합니다.
  • -W: 연결 전에 암호를 묻습니다.
  • -f <파일명>: 표준 출력 대신 파일이나 디렉터리에 씁니다.
  • -F <형식>: p, c, d 또는 t를 선택합니다.
  • -Z <수준>: 압축을 지원하는 형식의 압축 수준을 설정합니다.
  • --exclude-table=<패턴>: 일치하는 테이블을 제외합니다.
  • -j <숫자> 또는 --jobs=<숫자>: 디렉터리 형식으로 덤프할 때 병렬 작업을 사용합니다.
  • --clean: 일반 SQL 출력에서 생성 명령 앞에 삭제 명령을 포함합니다.
  • --create: 데이터베이스 자체를 생성하는 명령을 포함합니다.

예시: 기본 일반 텍스트 백업

사용자 myuser가 소유한 mydatabase 데이터베이스의 일반 텍스트 백업을 생성하여 mydatabase_backup.sql에 저장하려면:

pg_dump -U myuser -f mydatabase_backup.sql mydatabase

호스트와 포트를 지정해야 하는 경우:

pg_dump -h localhost -p 5432 -U myuser -f mydatabase_backup.sql mydatabase

인증 방법에 따라 myuser의 암호를 묻는 메시지가 표시될 수 있습니다.

예시: 사용자 정의 형식 백업 (권장)

사용자 정의 형식은 pg_restore와 함께 작동하고 선택적 복원을 지원하므로 많은 프로덕션 백업에 좋은 기본값입니다.

pg_dump -U myuser -Fc -f mydatabase_backup.dump mydatabase

이 명령은 pg_restore에 적합한 형식으로 mydatabase_backup.dump를 생성합니다.

예시: 병렬 작업을 사용한 디렉터리 형식 백업

대규모 데이터베이스의 경우 병렬 덤프를 사용하면 백업 시간을 줄일 수 있습니다. 디렉터리 형식이 필요합니다.

pg_dump -U myuser -Fd -j 4 -f mydatabase_backup_dir mydatabase

이 명령은 4개의 병렬 작업을 사용하여 여러 파일이 포함된 mydatabase_backup_dir 디렉터리를 생성합니다.

pg_restore 이해하기

pg_restorepg_dump로 생성된 사용자 정의, 디렉터리 또는 tar 아카이브를 복원합니다. 일반 SQL 파일은 pg_restore가 아닌 psql로 복원합니다.

일반적인 pg_restore 옵션

  • -h <호스트명>: 호스트에 연결합니다.
  • -p <포트>: 포트에 연결합니다.
  • -U <사용자명>: 사용자로 연결합니다.
  • -W: 연결 전에 암호를 묻습니다.
  • -d <데이터베이스>: 복원을 위해 이 데이터베이스에 연결합니다.
  • -v: 자세한 복원 출력을 표시합니다.
  • -c 또는 --clean: 데이터베이스 객체를 다시 생성하기 전에 삭제합니다.
  • --create: 복원하기 전에 덤프된 데이터베이스를 생성합니다. -d와 함께 기존 유지 관리 데이터베이스(일반적으로 postgres)에 연결합니다.
  • -j <숫자>: 지원되는 경우 복원에 병렬 작업을 사용합니다.
  • -F <형식>: 자동 감지가 충분하지 않은 경우 아카이브 형식을 지정합니다.

일반 텍스트 SQL 백업에서 복원

pg_dump(예: mydatabase_backup.sql)를 사용하여 일반 텍스트 SQL 백업을 생성한 경우 psql을 사용하여 복원합니다.

psql -U myuser -d mydatabase -f mydatabase_backup.sql

백업 파일에 pg_dump --createCREATE DATABASE\connect 명령이 포함된 경우 postgres와 같은 유지 관리 데이터베이스에 연결합니다.

psql -U myuser -f mydatabase_backup.sql postgres

예시: 사용자 정의 형식 백업에서 복원

사용자 정의 형식 백업 mydatabase_backup.dumprestored_db 데이터베이스로 복원하려면:

pg_restore -U myuser -d restored_db mydatabase_backup.dump

아카이브가 pg_dump --create로 생성된 경우 pg_restore에 덤프된 데이터베이스를 생성하도록 요청할 수 있습니다. -d 값은 새로 생성되는 데이터베이스가 아닌 초기 연결에 사용되는 기존 데이터베이스여야 합니다.

pg_restore -U myuser --create -d postgres mydatabase_backup.dump

이 명령은 덤프 내부에 지정된 데이터베이스를 생성하고 그 안으로 복원합니다. 다른 이름의 데이터베이스로 복원하려면 먼저 해당 데이터베이스를 생성한 다음 --create 없이 복원하세요.

createdb -U myuser restored_db
pg_restore -U myuser -d restored_db mydatabase_backup.dump

예시: 병렬 복원

특히 대규모 데이터 세트의 경우 더 빠른 복원을 위해 -j 옵션을 사용하세요.

pg_restore -U myuser -d restored_db -j 4 mydatabase_backup.dump

이 명령은 4개의 작업자 작업으로 복원합니다. 병렬 복원은 덤프에 로드 및 인덱싱할 여러 독립 객체가 있을 때 가장 유용합니다.

예시: 디렉터리 형식 백업에서 복원

디렉터리 형식(예: mydatabase_backup_dir)으로 생성된 백업을 복원하려면:

pg_restore -U myuser -d restored_db -j 4 mydatabase_backup_dir

마지막 인수는 디렉터리 경로입니다.

백업 모범 사례

  • 백업 예약: cron, systemd 타이머 또는 오케스트레이션 플랫폼을 사용하세요. 손실을 감당할 수 있는 데이터 양에 따라 일정을 선택합니다.
  • 올바른 형식 사용: 사용자 정의 형식은 강력한 기본값입니다. 디렉터리 형식은 대규모 데이터베이스에 병렬 덤프가 필요할 때 더 좋습니다.
  • 복원 테스트: 정기적으로 스테이징 데이터베이스에 복원하세요. 테스트하지 않은 백업은 추측에 불과합니다.
  • 전역 객체 캡처: 서버를 처음부터 다시 빌드할 때 pg_dumpall --globals-only로 역할과 테이블스페이스를 별도로 덤프합니다.
  • 오프사이트 사본 저장: 기본 서버에서 멀리 떨어진 곳에 백업을 보관하고 암호화 및 액세스 제어로 보호합니다.
  • 작업 모니터링: 실패한 덤프, 비정상적으로 작은 백업 파일, 오래된 백업 타임스탬프에 대해 알림을 설정합니다.
  • 보존 계획: 유지할 시간별, 일별, 주별, 월별 백업 수를 결정한 다음 정리를 자동화합니다.
  • --clean 사용 시 주의: 대상 데이터베이스의 객체를 삭제합니다. 기존 객체를 교체하려는 경우에만 사용하세요.

핵심 요점

유연한 단일 파일 백업에는 pg_dump -Fc, 병렬 덤프가 필요할 때는 pg_dump -Fd -j, 일반 SQL 복원에는 psql, 아카이브 복원에는 pg_restore를 사용하세요. 그런 다음 비상 상황에 필요하기 전에 테스트 데이터베이스에 복원하여 프로세스를 검증하세요.