#!/bin/bash
# 실습 #14 ④ — 백업·복원 (pg_dump · pg_restore)
# - 논리 백업: pg_dump (-Fc 포맷 = 압축 + 병렬 복원 가능)
# - 운영은 물리 백업 (pg_basebackup + WAL archive) 권장. 본 실습은 입문용 논리 백업.
set -e

OUT=/tmp/lab_pg_backup
mkdir -p "$OUT"

# 1) 백업 — custom 포맷 (병렬 복원 가능, 압축 내장)
echo "=== pg_dump (custom 포맷) ==="
sudo -u postgres pg_dump -Fc -f "$OUT/bench.dump" bench
ls -lh "$OUT/bench.dump"

# 2) plain SQL 백업도 한 번 (사람이 읽을 수 있게)
sudo -u postgres pg_dump -F p -f "$OUT/bench.sql" bench
echo
echo "=== 백업 파일 ==="
ls -lh "$OUT/"

# 3) 복원 시나리오 — 새 DB 만들어 동일 데이터 복구
sudo -u postgres psql -c "DROP DATABASE IF EXISTS bench_restored;"
sudo -u postgres createdb bench_restored

echo
echo "=== pg_restore (병렬 4) ==="
sudo -u postgres pg_restore -d bench_restored -j 4 "$OUT/bench.dump"

# 4) 행 수 일치 확인 — 핵심 무결성 검증
echo
echo "=== 무결성 검증 (행 수 일치) ==="
ORIG=$(sudo -u postgres psql -tAc "SELECT count(*) FROM pgbench_accounts;" -d bench)
REST=$(sudo -u postgres psql -tAc "SELECT count(*) FROM pgbench_accounts;" -d bench_restored)
echo "원본   bench           : $ORIG 행"
echo "복원   bench_restored  : $REST 행"
if [ "$ORIG" = "$REST" ]; then
    echo "→ OK (일치)"
else
    echo "→ 불일치!"
    exit 1
fi

# 5) 특정 테이블만 백업/복원 (-t 옵션)
echo
echo "=== 부분 백업 (특정 테이블만) ==="
sudo -u postgres pg_dump -Fc -t pgbench_history -f "$OUT/history_only.dump" bench
ls -lh "$OUT/history_only.dump"

cat <<EOF

관전 포인트·다음 단계:
  - pg_dump      : 논리 백업. 다운타임 없이 가능하지만 큰 DB 는 느림.
  - pg_basebackup: 물리 백업. 클러스터 전체. 운영 표준.
  - WAL archive  : Point-In-Time Recovery (PITR) 의 핵심. archive_mode=on + archive_command 설정.
  - 정기 검증   : 백업은 "복원 가능해야" 백업. 분기마다 복원 리허설.

저장 위치: $OUT
EOF
