데이타베이스/PostgreSQL

PostgreSQL: 당신의 데이터를 지키는 가장 확실한 방법 – 백업 및 복구 완전 가이드

shimdh 2025. 10. 29. 11:19
728x90

안녕하세요, 데이터베이스 열혈 관리자 여러분! 데이터베이스(DB)를 다루다 보면 "데이터가 사라지면 어떻게 하지?"라는 불안한 생각이 스멀스멀 피어오르곤 합니다. 특히 PostgreSQL처럼 강력하고 안정적인 오픈소스 RDBMS를 사용 중이라면, 그만큼 데이터의 가치가 크죠. 오늘 이 글에서는 PostgreSQL의 백업과 복구 전략을 철저히 파헤쳐보겠습니다. 왜 백업이 필수인지부터 실제 도구 사용법, 복구 실전 팁까지 – 초보자부터 고수까지 유용한 가이드로 완성했습니다. 데이터 손실의 악몽에서 벗어나 보세요!

728x90

왜 백업과 복구가 PostgreSQL 운영의 핵심일까?

데이터베이스 관리의 ABC는 바로 백업(Backup)복구(Recovery) 입니다. PostgreSQL은 뛰어난 안정성과 확장성을 자랑하지만, 아무리 튼튼한 시스템도 하드웨어 고장, 인간 실수, 사이버 공격 같은 '예상치 못한' 위협에 취약할 수 있습니다. 백업 전략 없이 운영하는 건, 우산 없이 비오는 날을 기다리는 꼴이죠. 아래에서 백업의 핵심 역할을 자세히 살펴보겠습니다.

1. 데이터 보호: 최후의 안전장치

백업은 데이터 손실의 '안전벨트'입니다. 디스크 고장으로 테이블이 날아가더라도, 백업 파일 하나로 이전 상태를 복원할 수 있어요. PostgreSQL의 경우, 트랜잭션 로그(WAL)를 활용해 데이터 무결성을 보장하니, 백업이 이를 더 강화합니다. 결과적으로 시스템의 신뢰성이 올라가고, 평온한 밤잠을 보장하죠!

2. 재해 복구: 비즈니스 연속성의 열쇠

자연재해, 랜섬웨어 공격, 또는 서버 다운 – 이런 재해 시 다운타임은 치명적입니다. 잘 짜인 백업 전략이라면 복구 시간을 몇 시간에서 몇 분으로 단축할 수 있어요. 예를 들어, 클라우드 기반 PostgreSQL(AWS RDS나 Google Cloud SQL)이라면 자동 백업으로 RPO(Recovery Point Objective)를 최소화할 수 있습니다. 비즈니스 손실을 막는 '보험' 같은 역할이죠.

3. 버전 관리: 데이터 이력 추적의 마법

백업은 단순 복사가 아닙니다. 정기 백업으로 데이터의 '버전 히스토리'를 쌓아가며, 실수로 지운 레코드나 잘못된 업데이트를 롤백할 수 있어요. Git처럼 DB도 버전 관리가 가능하다는 거예요! 개발팀에서 새 기능 배포 후 버그가 발생하면, 이전 백업으로 되돌려 테스트하는 데 딱입니다.

4. 테스트 환경: 안전한 실험실 구축

프로덕션 DB에 직접 손대기 무섭죠? 백업을 복제해 테스트 서버를 만들면, 쿼리 최적화, 업그레이드 시뮬레이션, 심지어 마이그레이션 연습까지 자유롭게 할 수 있습니다. PostgreSQL의 pg_dumppg_basebackup를 활용하면, 운영 환경을 1:1 미러링하는 게 쉽습니다. "실패해도 괜찮아!"라는 마음으로 혁신하세요.

PostgreSQL 백업의 세 가지 핵심 유형: 선택의 폭을 넓히자

PostgreSQL은 유연한 백업 옵션을 제공합니다. 상황에 따라 물리적, 논리적, 또는 연속 아카이빙을 선택하세요. 아래에서 각 유형의 특징, 도구, 장단점을 정리했어요. (팁: 하이브리드 접근 – 예: 물리적 + WAL – 을 추천합니다.)

1. 물리적 백업: 파일 그대로 복사, 속도 최우선

데이터베이스 클러스터의 물리적 파일(데이터 디렉토리)을 그대로 복사하는 방식입니다. 전체 시스템을 '스냅샷'처럼 저장해 복구가 가장 빠릅니다. 대용량 DB에 적합하죠.

  • 특징: 데이터 파일, WAL 로그, 설정 파일 등을 포함한 완전한 복사본 생성. 다운타임 최소화 위해 온라인 백업 가능.
  • 주요 도구: pg_basebackup
  • 장점: 복구 속도 초고속, 포인트-인-타임 복구 지원.
  • 단점: 다른 DB 버전으로 마이그레이션 어려움, 저장 공간 많이 차지.
  • 예시 명령어 (압축 tar 형식으로 백업):
    pg_basebackup -D /path/to/backup/directory -F tar -z --checkpoint=fast -U postgres
    이 명령은 체크포인트를 빠르게 처리해 중단 없이 백업을 생성합니다. ( -U postgres는 사용자 지정)

2. 논리적 백업: SQL 스크립트로 재구성, 유연성 만점

DB의 스키마(테이블 구조)와 데이터를 SQL INSERT/ CREATE 문으로 추출합니다. 부분 백업이나 이식에 최적화됐어요.

  • 특징: 인간이 읽을 수 있는 SQL 파일 생성. 선택적 백업(특정 테이블만) 가능.
  • 주요 도구: pg_dump (전체 DB) 또는 pg_dumpall (모든 DB)
  • 장점: 버전 호환성 좋음, 다른 DBMS로 이전 쉬움. 압축/암호화 옵션 풍부.
  • 단점: 대용량 DB에서 백업/복구 시간 길음.
  • 예시 명령어 (전체 DB 백업):
    pg_dump -U postgres -d mydatabase -F c -f mydatabase_backup.dump
    -F c는 커스텀 형식(압축+이진)으로 저장합니다. 복구 시 pg_restore 사용!

3. 연속 아카이빙 (WAL 아카이빙): 실시간 보호, 정밀 복구

PostgreSQL의 WAL(Write-Ahead Logging) 파일을 지속적으로 아카이브합니다. '포인트-인-타임 복구(PITR)'로 초 단위 복구가 가능해요. 백업의 '보험' 역할.

  • 특징: 모든 트랜잭션 변경을 로그로 기록. base 백업 + WAL로 완벽한 체인 구성.
  • 설정 방법: postgresql.conf 수정 후 재시작.
    wal_level = replica  # WAL 상세도 높임
    archive_mode = on
    archive_command = 'test ! -f /path/to/archive/%f && cp %p /path/to/archive/%f'
    %p는 WAL 파일 경로, %f는 파일명. 스크립트로 rsync나 S3 업로드도 가능.
  • 장점: 거의 실시간 보호, RPO 최소화.
  • 단점: 저장 공간과 관리 부담 증가.
  • : cron job으로 WAL 정리 스크립트 추가해 공간 관리하세요.

백업에서 복구로: 실전 가이드, 실패 없는 단계별 실행

백업은 '준비'일 뿐, 진짜 힘은 복구에 있습니다. 정기적으로 복구 테스트를 해보세요 – "테스트되지 않은 백업은 백업이 아니다!"라는 격언을 잊지 마세요. 아래는 주요 유형별 복구 방법입니다. (추가: WAL 복구도 간단히 다뤄봤어요.)

1. 논리적 백업 복구: 간단하고 직관적

pg_dump 파일을 SQL로 실행해 복원합니다. 빈 DB부터 시작하세요.

  • 단계:
    1. 빈 DB 생성: createdb -U postgres newdatabase
    2. 복구 실행:
      psql -U postgres -d newdatabase -f mydatabase_backup.sql
      또는 커스텀 형식: pg_restore -U postgres -d newdatabase mydatabase_backup.dump
  • : --clean 옵션으로 기존 객체 삭제 후 복원.

2. 물리적 백업 복구: 체계적 접근으로 안정성 UP

파일 교체 방식이니, 프로덕션 환경에서는 반드시 테스트 서버에서 연습하세요.

  • 단계:
    1. PostgreSQL 중지: sudo systemctl stop postgresql
    2. 데이터 디렉토리 백업/교체:
      sudo rsync -av /path/to/backup/ /var/lib/postgresql/data/ --delete
      ( --delete로 불필요 파일 제거)
    3. 소유권/권한 설정: sudo chown -R postgres:postgres /var/lib/postgresql/data
    4. 재시작: sudo systemctl start postgresql
  • : pg_ctl로 수동 시작 시 --single 모드로 복구 검증.

3. WAL 아카이빙 복구: PITR로 정밀 제어 (보너스 팁)

base 백업 + WAL로 복구. recovery.conf (또는 12+ 버전의 postgresql.conf 내) 설정.

  • 단계 요약:
    1. base 백업 복원 (물리적처럼).
    2. recovery.conf 생성:
      restore_command = 'cp /path/to/archive/%f %p'
      recovery_target_time = '2023-10-01 12:00:00'  # 목표 시점
    3. 서버 시작: 자동으로 WAL 적용하며 복구.
  • 장점: "어제 오후 3시 15분 상태로!"처럼 세밀함.
728x90