11.3 pg_basebackup
pg_basebackup은 PostgreSQL의 기본 물리 base 백업 도구입니다. 실행 중인 클러스터의 PGDATA를 통째로 복사합니다. PITR 기준점·standby 초기 구축에 표준입니다. pgBackRest·Barman 같은 상용 도구가 내부적으로 이걸 호출합니다.
가장 단순한 사용
pg_basebackup -h primary.example.com -U repl_user \
-D /var/lib/pgsql/17/data \
-X stream -P| 옵션 | 의미 |
|---|---|
-h <host> | primary 주소 |
-U <user> | replication 권한 있는 역할 |
-D <dir> | 받을 위치 (빈 디렉토리) |
-X stream | WAL을 별 스레드로 받음 (권장) |
-X fetch | base 끝난 뒤 한 번에 받음 (옛 방식) |
-P | 진행률 표시 |
필요한 권한
-- replication 역할
CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'secret';
-- pg_hba.conf에 추가
-- hostssl replication repl_user 10.0.0.0/8 scram-sha-256REPLICATION 속성 또는 pg_read_all_data + 슈퍼유저급. 슈퍼유저는 권장 안 합니다.
출력 형식
pg_basebackup -D backup_dir/ -F plain # 기본: 그대로 복사
pg_basebackup -D backup_dir/ -F tar -z # tar + gzip
pg_basebackup -D backup_dir/ -F tar --compress=lz4 # PG 15+
pg_basebackup -D backup_dir/ -F tar --compress=zstd # PG 15+| 형식 | 메모 |
|---|---|
plain | PGDATA 그대로 복사 — 즉시 시작 가능한 클러스터 |
tar | 압축 가능. 외부 저장소에 보내기 편함 |
-F tar는 tablespace당 1 tar 파일 (base.tar, <oid>.tar).
압축 — server vs client side
PG 15+부터 서버 측 압축 가능합니다.
# 서버 측 (CPU는 primary에서)
pg_basebackup -D out/ -F tar --compress=server-zstd:3
# 클라이언트 측 (CPU는 backup 호스트에서)
pg_basebackup -D out/ -F tar --compress=client-zstd:3primary CPU 여유 있으면 server 측 압축이 네트워크 절약 — 흔한 선택.
checksum 검증
pg_basebackup --verify-checksums 옵션은 체크섬 활성된 클러스터에서 백업 중 페이지 손상을 검출.
pg_basebackup -D backup/ --verify-checksums데이터 disk 부패의 조기 알람을 받습니다.
동시 백업 — pg_start_backup/pg_stop_backup 안 씀
PG 15부터 pg_start_backup / pg_stop_backup API가 비공식 사용 금지(non-exclusive mode만 남고, pg_basebackup 또는 새 SQL 함수 pg_backup_start/pg_backup_stop 사용).
운영자가 직접 호출할 일은 거의 없음 — pg_basebackup 또는 pgBackRest가 알아서.
standby 구축
primary가 살아 있는 상태에서 standby 초기 데이터 만들기:
# standby 호스트에서
sudo -u postgres pg_basebackup \
-h primary.example.com -U repl_user \
-D /var/lib/pgsql/17/data \
-X stream -P -R --slot=standby1| 옵션 | 의미 |
|---|---|
-R | standby.signal + postgresql.auto.conf에 primary_conninfo 자동 추가 |
--slot=<name> | 복제 슬롯 사용 (WAL 보장) |
기동:
sudo systemctl start postgresql-17자동으로 standby 모드로 진입 (standby.signal 존재 → recovery 모드).
진행률·진단
PG 13+의 pg_stat_progress_basebackup:
SELECT pid, phase, backup_streamed, backup_total,
round(100.0 * backup_streamed / nullif(backup_total, 0), 1) AS pct
FROM pg_stat_progress_basebackup;대용량 백업의 진행률 실시간 확인합니다.
PITR base 백업
PITR 시나리오의 출발점은 pg_basebackup (또는 pgBackRest의 풀 백업). 이 base에서부터 archive된 WAL을 재생해 원하는 시점으로.
# base 백업
pg_basebackup -D /backup/base_20260523/ -X stream -F tar -z
# 동시에 archive_mode = on, archive_command가 WAL을 외부 저장소로 보내고 있어야자세한 PITR은 11.4.
한계
| 한계 | 메모 |
|---|---|
| 증분 백업 안 됨 (PG 17까지) | base 백업은 항상 전체 |
| 외부 저장소 직접 업로드 안 됨 | tar로 받아 별도 도구로 보내야 |
| 보존 정책 자체 관리 안 함 | 운영자가 정리 |
| WAL archive와의 통합 제공 안 함 | archive_command 따로 설정 |
이래서 운영 환경에서는 pg_basebackup만 단독으로 쓰지 않고 pgBackRest 또는 Barman으로 감싸는 패턴이 표준입니다.
PG 17의 incremental base backup
PG 17에서 증분 base backup 기능이 들어왔습니다.
# 1. 풀 base 백업
pg_basebackup -D base/ ...
# 2. 일정 시간 후 증분
pg_basebackup -D incr_1/ --incremental=base/backup_manifest
# 복원 시
pg_combinebackup -o full_restored/ base/ incr_1/ incr_2/증분은 이전 백업 대비 변경된 페이지만 받음 → 백업 크기 ↓, 시간 ↓. pgBackRest는 이전부터 자체 증분 지원 — pg_basebackup도 따라잡은 셈.
운영 시 주의
| 주의 | 메모 |
|---|---|
| 큰 클러스터는 수 시간 | 진행 중 pg_replication_slots의 슬롯 만료 위험 |
| primary I/O 부하 | --max-rate 옵션으로 throttle 가능 (예: --max-rate=100M) |
| 백업 디렉토리 디스크 | 풀 백업 한 번이 클러스터 크기 + WAL |
| 같은 host에 백업 저장 금지 | 디스크 사고 시 같이 사라짐 |
| 운영 자동화는 외부 도구 | pgBackRest·Barman 권장 (11.5, 11.6) |
pg_wal이 가득 차 클러스터 정지 사고입니다. 항상 모니터링.정리
- pg_basebackup = 물리 base 백업의 표준 도구
-X stream(WAL 동시 수신) +-R(standby 자동 설정)이 일반적- PG 15+ 서버 측 zstd 압축으로 네트워크·디스크 절약
- PITR base는 pg_basebackup + 외부 archive 결합
- 증분 백업은 PG 17부터, 그 전엔 pgBackRest 사용
- 운영 자동화는 pgBackRest/Barman으로 감싸는 게 표준
다음 절(11.4)에서는 그 시점으로 정확히 되돌아가는 — WAL archive와 PITR을 봅니다.