백업 복원

데이터 손실로부터 복구하거나, 환경을 마이그레이션하거나, 알려진 정상 상태로 되돌리기 위해 백업에서 IBM Bob PostgreSQL 데이터베이스를 복원합니다.

이 절차를 사용하여 백업 파일에서 IBM Bob 및 관련 PostgreSQL 데이터베이스를 복원합니다. 복원 프로세스에는 백업 무결성 확인, 환경 준비, 대상 데이터베이스 재생성, 백업 내용 복원, 애플리케이션 서비스를 서비스로 복귀하기 전에 복원된 데이터 확인이 포함됩니다.

경고:

데이터베이스를 복원하면 기존 데이터베이스 내용이 선택한 백업 파일의 데이터로 교체됩니다. 활성 데이터베이스 쓰기가 복원 프로세스를 손상시킬 수 있으므로 시작하기 전에 애플리케이션 서비스를 중지해야 합니다. 프로덕션 복구를 수행하기 전에 항상 비프로덕션 환경에서 복원 절차를 테스트하세요.

시작하기 전에

데이터베이스를 복원하기 전에 다음 사항을 확인하세요:

백업 무결성 확인

# 백업 PVC 접근
oc run backup-verify -n <bob-instance-namespace> --image=busybox --rm -it --restart=Never \
  --overrides='{
    "spec": {
      "containers": [{
        "name": "backup-verify",
        "image": "busybox",
        "command": ["sh"],
        "stdin": true,
        "tty": true,
        "volumeMounts": [{
          "name": "backup",
          "mountPath": "/backups"
        }]
      }],
      "volumes": [{
        "name": "backup",
        "persistentVolumeClaim": {
          "claimName": "bob-db-backup-pvc"
        }
      }]
    }
  }'

# 파드 내부:
cd /backups/bob-db
gunzip -t backup_bob_20260902_020000.sql.gz  # gzip 무결성 테스트
cat backup_bob_20260902_020000.sql.gz.meta   # 메타데이터 확인

백업 세부 정보 확인

  • 백업 타임스탬프가 예상 복원 시점과 일치합니다.
  • 데이터베이스 이름이 올바릅니다.
  • 백업 크기가 합리적입니다.
  • 메타데이터 파일이 존재하며 읽을 수 있습니다.

복원 전 백업 생성

복원하기 전에 현재 데이터베이스 상태를 백업합니다:

oc exec -n <bob-instance-namespace> bob-db-1 -- \
  pg_dump -U postgres bob | gzip > pre-restore-backup-$(date +%Y%m%d_%H%M%S).sql.gz

복원 절차

복원 중 데이터베이스 쓰기를 방지하기 위해 모든 IBM Bob 애플리케이션 서비스를 중지합니다.

# Bob 서비스 축소
oc scale deployment bob-admin-service --replicas=0 -n <bob-instance-namespace>
oc scale deployment bob-api-service --replicas=0 -n <bob-instance-namespace>
oc scale deployment bob-ui-service --replicas=0 -n <bob-instance-namespace>

# 파드가 종료되었는지 확인
oc get pods -n <bob-instance-namespace> -l app.kubernetes.io/name=bob

PostgreSQL 데이터베이스와 백업 스토리지 위치에 모두 접근할 수 있는 임시 복원 파드를 생성합니다.

# PostgreSQL 이미지 가져오기
POSTGRES_IMAGE=$(oc get cluster bob-db -n <bob-instance-namespace> -o jsonpath='{.spec.imageName}')

# 복원 파드 생성
oc run postgres-restore -n <bob-instance-namespace> --image=$POSTGRES_IMAGE --rm -it --restart=Never \
  --overrides='{
    "spec": {
      "containers": [{
        "name": "restore",
        "image": "'$POSTGRES_IMAGE'",
        "command": ["bash"],
        "stdin": true,
        "tty": true,
        "env": [
          {"name": "PGHOST", "value": "bob-db-rw"},
          {"name": "PGPORT", "value": "5432"},
          {"name": "PGUSER", "value": "postgres"},
          {"name": "PGPASSWORD", "valueFrom": {"secretKeyRef": {"name": "bob-db-app", "key": "password"}}}
        ],
        "volumeMounts": [{
          "name": "backup",
          "mountPath": "/backups"
        }]
      }],
      "volumes": [{
        "name": "backup",
        "persistentVolumeClaim": {
          "claimName": "bob-db-backup-pvc"
        }
      }]
    }
  }'

복원 파드 내에서 백업 파일을 확인하고 데이터베이스 연결을 테스트합니다:

# 사용 가능한 백업 목록 확인
ls -lh /backups/bob-db/

# 백업 파일 확인
BACKUP_FILE="/backups/bob-db/backup_bob_20260902_020000.sql.gz"
gunzip -t $BACKUP_FILE
echo "Backup file is valid"

# 메타데이터 확인
cat ${BACKUP_FILE}.meta

# 데이터베이스 연결 테스트
psql -c "SELECT version();"

대부분의 복구 시나리오에서는 오래되거나 충돌하는 데이터가 제거되도록 빈 데이터베이스로 복원합니다.

경고:

이 단계는 현재 데이터베이스 내용을 영구적으로 삭제합니다.

psql -c "DROP DATABASE IF EXISTS bob;"
psql -c "CREATE DATABASE bob;"

백업 내용을 PostgreSQL로 로드하여 데이터베이스를 복원합니다:

# 백업 추출 및 복원
gunzip -c $BACKUP_FILE | psql -d bob

# 백업 크기에 따라 몇 분 정도 걸릴 수 있습니다

애플리케이션을 서비스로 복귀하기 전에 복원이 성공적으로 완료되었는지 확인합니다:

# 복원된 데이터베이스에 연결
psql -d bob

# 테이블 존재 여부 확인
\dt

# 주요 테이블의 행 수 확인
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM projects;
SELECT COUNT(*) FROM conversations;

# 최근 데이터 확인
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;

# psql 종료
\q

데이터베이스 유효성 검사가 성공적으로 완료되면 IBM Bob 서비스를 재시작하여 복원된 데이터베이스에 다시 연결하도록 합니다. 오류나 마이그레이션 실패가 있는지 애플리케이션 시작 로그를 모니터링합니다.

# 복원 파드 종료
exit

# Bob 서비스 확장
oc scale deployment bob-admin-service --replicas=1 -n <bob-instance-namespace>
oc scale deployment bob-api-service --replicas=3 -n <bob-instance-namespace>
oc scale deployment bob-ui-service --replicas=2 -n <bob-instance-namespace>

# 파드가 실행 중인지 확인
oc get pods -n <bob-instance-namespace> -l app.kubernetes.io/name=bob

# 애플리케이션 로그 확인
oc logs -n <bob-instance-namespace> -l app.kubernetes.io/name=bob --tail=50

사용자가 재연결하기 전에 엔드투엔드 애플리케이션 유효성 검사를 완료합니다:

# 애플리케이션 엔드포인트 테스트
curl -k https://bob.example.com/health

# 사용자 로그인 작동 여부 확인
# 데이터 접근 작동 여부 확인
# 주요 기능 작동 여부 확인

유효성 검사가 성공적으로 완료되면 복원 프로세스가 완료된 것입니다.

모범 사례

  • 항상 먼저 비프로덕션 환경에서 테스트합니다.
  • 시작하기 전에 현재 데이터베이스 상태의 복원 전 백업을 생성합니다.
  • 시작하기 전에 백업 무결성을 확인합니다.
  • 다운타임을 계획하고 사용자에게 알립니다.
  • 복원 프로세스와 결과를 문서화합니다.
  • 복원 후 데이터 무결성을 확인합니다.
  • 복원 후 애플리케이션을 면밀히 모니터링합니다.

일반적인 복원 문제

문제원인해결 방법
공간 부족복원 작업을 위한 디스크 공간이 부족합니다복원하기 전에 PVC를 확장하거나 스토리지 공간을 확보하세요.
연결 타임아웃네트워크 연결 문제 또는 데이터베이스 가용성 문제데이터베이스 연결을 확인하고 필요한 경우 타임아웃 값을 늘리세요.
권한 오류복원 사용자에게 필요한 데이터베이스 권한이 없습니다복원 작업을 실행하기 전에 복원 사용자에게 필요한 권한을 부여하세요.
이 주제는 어떤가요?