[Oracle 11gR2] Data Guard 기반의 백업 오프로딩(Backup Offloading) 구조 구현하기 – Part2

Data Guard 기반의 백업 오프로딩(Backup Offloading) 구조
아래 순서대로 “Data Guard 기반의 백업 오프로딩(Backup Offloading)” 환경구성 및 모의훈련을 실시할 예정입니다.


Part1에서는 Catalog DB → Primary DB → Standby DB 운영환경을 구성하였습니다. Part2에서는 Catalog DB 및 Standby DB를 활용한 백업환경 구성하고 실제 백업까지하는 절차를 알아보겠습니다.


  1. 백업 파일 외부 저장소 구축
    1. “원격 파일시스템을 마운팅하기(NFS)” 글을 먼저 참고하시면 좋습니다.
    2. Primary DB와 Standby DB의 동일한 경로에 모두 외부 저장소를 마운팅합니다. 동일한 경로로 설정해야 Standby에서 백업한 파일을 Primary가 바로 읽어 Part 5(복구 훈련)를 수행할 수 있기 때문입니다.
      -- 1. Standby DB에서 수행합니다.
      ---- /etc/fstab 파일에도 반영하여 재부팅 시에도 외부저장소가 마운팅될 수 있도록 합니다.
      [root@standby-db ~]# install -o oracle -g oinstall -m 775 -d /backup_data
      [root@standby-db ~]# mount -t nfs xxx.xxx.xxx.xxx:/path/to/dbbackup /backup_data
      [root@standby-db ~]# df -hT | egrep "Filesystem|nfs"
      Filesystem                           Type      Size  Used Avail Use% Mounted on
      /dev/sr0                             iso9660   4.5G  4.5G     0 100% /run/media/root/OL-7.8 Server.x86_64
      xxx.xxx.xxx.xxx:/path/to/dbbackup    nfs        22T  7.9T   14T  36% /backup_data
      
      -- 2. Primary DB에서도 위 절차를 수행합니다.
      [root@primary-db ~]#  df -hT | egrep "Filesystem|nfs"
      Filesystem                           Type      Size  Used Avail Use% Mounted on
      xxx.xxx.xxx.xxx:/path/to/dbbackup    nfs        22T  7.9T   14T  36% /backup_data
      
  2. RMAN 구성 설정 (정책 확정)
    1. Primary DB에서 RMAN에 접속한 후 현재 설정 사항을 확인해 봅니다. “RMAN으로 백업 및 복구하기” 글을 읽으시면 환경설정에 도움이 될겁니다.
      [oracle@primary-db ~]$ rman target / catalog rman_admin/orclsys@CAT_DB
      복구 관리자: Release 11.2.0.4.0 - Production on 목 2월 26 15:13:15 2026
      Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
      대상 데이터베이스에 접속됨: ORCL11G(DBID=1333016804, 열리지 않음)
      복구 카타로그 데이터베이스에 접속
      
      RMAN> show all;
      db_unique_name PRIDB을(를) 가진 데이터베이스에 대한 RMAN 구성 매개변수:
      CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
      CONFIGURE BACKUP OPTIMIZATION OFF; # default
      CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
      CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
      CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
      CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
      CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
      CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
      CONFIGURE MAXSETSIZE TO UNLIMITED; # default
      CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
      CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
      CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
      CONFIGURE DB_UNIQUE_NAME 'pridb' CONNECT IDENTIFIER  'pridb';
      CONFIGURE DB_UNIQUE_NAME 'stbdb' CONNECT IDENTIFIER  'stbdb';
      CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY BACKED UP 1 TIMES TO DISK;
      CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11.2.0.4.0/dbhome_1/dbs/snapcf_stbdb.f'; # default
      
    2. 추가 설정: 필수 보안 및 최적화 설정
      -- 제어파일과 SPFILE을 백업 시마다 자동으로 저장 (가장 중요)
      CONFIGURE CONTROLFILE AUTOBACKUP ON;
      
      -- 백업 파일의 중복 생성을 방지하여 공간 절약
      CONFIGURE BACKUP OPTIMIZATION ON;
      
      -- 복구 가능 기간 설정 (최근 7일간은 언제든 복구 가능하게 유지)
      CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
      
    3. 추가 설정: 외부 저장소(NFS) 경로 고정
      -- 백업 파일 저장 경로 및 이름 형식 지정
      ---- %d(Database Name): 데이터베이스의 DB_NAME이름으로, pridb 또는 stbdb가 들어갑니다.
      ---- %T(날짜포맷): YYYYMMDD 형식의 날짜 데이터가 포함됩니다.
      ---- %U(Unique Identifier): 8글자의 시스템 생성 고유 키값(보통 %u_%p_%c의 조합: 시스템 생성 ID + 백업 셋 번호 + 피스 번호)
      CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup_data/backup_%d_%T_%U';
      
      -- 제어파일 자동 백업 파일도 외부 저장소로 지정
      ---- %F(Combined ID for Control File): Control File 자동 백업에만 사용되는 복합 고유값(c-DBID-YYYYMMDD-순번)
      CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup_data/conf_%F';
      
    4. 추가 설정: Snapshot Controlfile 위치 조정
      CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup_data/snapcf_pridb.f';
      
    5. 추가 설정: 병렬 처리(PARALLELISM) 설정
      CONFIGURE DEVICE TYPE DISK PARALLELISM 2;
      
    6. 다시 show all;을 입력하여 # default 표시가 사라졌는지 확인합니다.
      RMAN> show all;
      db_unique_name PRIDB을(를) 가진 데이터베이스에 대한 RMAN 구성 매개변수:
      CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
      CONFIGURE BACKUP OPTIMIZATION ON;
      CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
      CONFIGURE CONTROLFILE AUTOBACKUP ON;
      CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup_data/conf_%F';
      CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
      CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
      CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
      CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   '/backup_data/backup_%d_%T_%U';
      CONFIGURE MAXSETSIZE TO UNLIMITED; # default
      CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
      CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
      CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
      CONFIGURE DB_UNIQUE_NAME 'pridb' CONNECT IDENTIFIER  'pridb';
      CONFIGURE DB_UNIQUE_NAME 'stbdb' CONNECT IDENTIFIER  'stbdb';
      CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY BACKED UP 1 TIMES TO DISK;
      CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup_data/snapcf_pridb.f';
      
    7. Standby DB에도 RMAN에 접속한 후 동일하게 설정합니다.
      -- 먼저 동기화 이후에 동일하게 설정합니다.(RETENTION POLICY 정책 제외)
      RMAN> RESYNC CATALOG;
      
      -- Primary DB와 환경설정이 동일한지 확인해 봅니다.
      RMAN> show all;
      db_unique_name STBDB을(를) 가진 데이터베이스에 대한 RMAN 구성 매개변수:
      CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
      CONFIGURE BACKUP OPTIMIZATION ON;
      CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
      CONFIGURE CONTROLFILE AUTOBACKUP ON;
      CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup_data/conf_%F';
      CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
      CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
      CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
      CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   '/backup_data/backup_%d_%T_%U';
      CONFIGURE MAXSETSIZE TO UNLIMITED; # default
      CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
      CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
      CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
      CONFIGURE DB_UNIQUE_NAME 'pridb' CONNECT IDENTIFIER  'pridb';
      CONFIGURE DB_UNIQUE_NAME 'stbdb' CONNECT IDENTIFIER  'stbdb';
      CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY BACKED UP 1 TIMES TO DISK;
      CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup_data/snapcf_pridb.f';
      
  3. Standby DB 전용 백업 스크립트 작성 (Full Backup + Incremental Backup + Archivelog)
    1. Standby DB에서 아래 백업 스크립트를 저장하고 crontab을 사용해서 매일 실행합니다.
      [oracle@standby-db ~]$ vi /home/oracle/scripts/rman_backup.sh
      #!/bin/bash
      
      #############################################
      # User Environment
      #############################################
      
      export ORACLE_SID=stbdb
      export ORACLE_BASE="/u01/app/oracle"
      export ORACLE_HOME="/u01/app/oracle/product/11.2.0.4.0/dbhome_1"
      export PATH=$ORACLE_HOME/bin:$PATH
      
      #############################################
      # Catalog Connection
      #############################################
      
      CATALOG_USER=rman_admin
      CATALOG_PASS=orclsys
      CATALOG_TNS=CAT_DB
      
      #############################################
      # Date and Backup Path Variables
      #############################################
      
      BASE_DIR=$(cd "$(dirname "$0")" && pwd)
      SCRIPT_NAME=$(basename "$0" .sh)
      
      DATE=$(date +%Y%m%d%H%M%S)
      DAY_OF_WEEK=$(date +%u)   # 1=Mon ... 7=Sun
      
      BACKUP_BASE="/backup_data"
      BACKUP_DIR="/${BACKUP_BASE}/${DATE}"
      LOG_FILE=${BASE_DIR}/${SCRIPT_NAME}_${DATE}.log
      
      mkdir -p ${BACKUP_DIR}
      
      #############################################
      # Backup Type Decision
      #############################################
      # Uncomment after script test
      #if [ "${DAY_OF_WEEK}" == "7" ]; then
          LEVEL=0
          TAG_NAME="WEEKLY_FULL_LEVEL0"
      #else
      #    LEVEL=1
      #    TAG_NAME="DAILY_INCREMENTAL_LEVEL1"
      #fi
      
      #############################################
      # RMAN Execution (With Catalog)
      #############################################
      
      echo "=========================================================" >> $LOG_FILE
      echo "--- Backup Started at $(date '+%Y-%m-%d %H:%M:%S') ---" >> $LOG_FILE
      echo "--- Mode: $TAG_NAME ---" >> $LOG_FILE
      
      rman target sys/orclsys@stb_db catalog ${CATALOG_USER}/${CATALOG_PASS}@${CATALOG_TNS} log=${LOG_FILE} append <<EOF > /dev/null 2>&1
      
      CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${BACKUP_DIR}/conf_%F';
      RUN {
      # Check backup files received in the past
        CROSSCHECK BACKUP;
      # Check the original archive files that need to be backed up
        CROSSCHECK ARCHIVELOG ALL;
      # Check control file and spfile received in the past
        CROSSCHECK BACKUP OF CONTROLFILE;
        CROSSCHECK BACKUP OF SPFILE;
      
      # Cleaning up records found to be missing by the CROSSCHECK command
        DELETE NOPROMPT EXPIRED BACKUP;
        DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
      
      # Comment FORCE option after script test
        BACKUP AS COMPRESSED BACKUPSET
          INCREMENTAL LEVEL ${LEVEL}
          DATABASE
          FORMAT '${BACKUP_DIR}/datafile_%d_%T_%U.bkp'
          TAG '${TAG_NAME}'
          FORCE;
      
      #  SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
      
      # Comment FORCE option after script test
        BACKUP AS COMPRESSED BACKUPSET
          ARCHIVELOG ALL
          DELETE INPUT
          FORMAT '${BACKUP_DIR}/arch_%d_%T_%U.bkp'
          TAG 'ARCHIVELOG_BACKUP'
          FORCE;
      
        BACKUP CURRENT CONTROLFILE
          FORMAT '${BACKUP_DIR}/ctrl_%d_%T_%U.bkp'
          TAG 'CONTROL_SPFILE_BACKUP';
        SQL "CREATE PFILE=''${BACKUP_DIR}/init${ORACLE_SID}.ora_${DATE}'' FROM SPFILE";
      
        RESYNC CATALOG;
      
        REPORT OBSOLETE;
        DELETE NOPROMPT OBSOLETE;
      }
      
      EXIT;
      EOF
      
      #############################################
      # OS Level Clean up
      #############################################
      
      echo "--- Cleaning up empty old backup directories and files ---" >> ${LOG_FILE}
      find ${BACKUP_BASE} -type f -name "init${ORACLE_SID}.ora*" -mtime +7 -exec rm -f {} \;
      find ${BACKUP_BASE} -maxdepth 1 -type d -empty -exec rmdir {} \;
      
      echo "--- Backup completed at $(date)" >> ${LOG_FILE}
      echo "=========================================================" >> $LOG_FILE
      
    2. /home/oracle/scripts/rman_backup.sh를 실행한 후 /backup_data/yyyymmddHiMMSS 디렉토리에 백업되는지 확인해 봅니다.
      [oracle@standby-db scripts]$ tree /backup_data/
      /backup_data/
      |-- 20260227141857
      |   |-- arch_ORCL11G_20260227_234hggoa_1_1.bkp
      |   |-- arch_ORCL11G_20260227_244hggoa_1_1.bkp
      |   |-- conf_c-1333016804-20260227-0a
      |   |-- ctrl_spfile_ORCL11G_20260227_254hggod_1_1.bkp
      |   |-- datafile_ORCL11G_20260227_214hggmo_1_1.bkp
      |   |-- datafile_ORCL11G_20260227_224hggmo_1_1.bkp
      |   `-- initstbdb.ora_20260227141857
      `-- snapcf_pridb.f
      
    3. RMAN의 모든 백업 데이터 및 백업 이력을 삭제하고 싶다면 아래 스크립트를 실행합니다.
      [oracle@standby-db ~]$ vi /home/oracle/scripts/rman_cleanup_all.sh
      #!/bin/bash
      
      #############################################
      # User Environment
      #############################################
      export ORACLE_SID=stbdb
      export ORACLE_BASE="/u01/app/oracle"
      export ORACLE_HOME="/u01/app/oracle/product/11.2.0.4.0/dbhome_1"
      export PATH=$ORACLE_HOME/bin:$PATH
      
      CATALOG_USER=rman_admin
      CATALOG_PASS=orclsys
      CATALOG_TNS=CAT_DB
      BACKUP_BASE="/backup_data"
      
      echo "!!! WARNING: This will delete ALL backup sets and physical files !!!"
      echo "Are you sure you want to proceed? (yes/no)"
      read -r CONFIRM
      if [ "$CONFIRM" != "yes" ]; then
          echo "Cleanup cancelled."
          exit 1
      fi
      
      #############################################
      # RMAN Cleanup (Catalog + Controlfile)
      #############################################
      
      rman target sys/orclsys@stb_db catalog ${CATALOG_USER}/${CATALOG_PASS}@${CATALOG_TNS} <<EOF
      LIST BACKUP;
      
      CROSSCHECK BACKUP;
      CROSSCHECK ARCHIVELOG ALL;
      CROSSCHECK COPY;
      
      DELETE NOPROMPT BACKUP;
      DELETE NOPROMPT ARCHIVELOG ALL;
      DELETE NOPROMPT COPY;
      
      DELETE NOPROMPT EXPIRED BACKUP;
      DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
      
      RESYNC CATALOG;
      EOF
      
      #############################################
      # OS Level Cleanup (Physical Files & Dirs)
      #############################################
      
      echo "--- Deleting all physical files in ${BACKUP_BASE} ---"
      find ${BACKUP_BASE} -type f -name "init${ORACLE_SID}.ora*" -exec rm -f {} \;
      find ${BACKUP_BASE} -maxdepth 1 -type d -empty -exec rmdir {} \;
      find ${BACKUP_BASE} -name "snapcf_*.f" -exec rm -f {} \;
      
      echo "--- Cleanup Completed ---"
      
  4. 백업 유효성 검증
    RUN {
      # 백업셋 내부에 저장된 제어파일 데이터 블록들이 온전한지, 그리고 현재 DB의 DBID와 일치하는지 확인합니다.
      RESTORE CONTROLFILE VALIDATE;
    
      # 동일한 백업셋 내부에 저장된 SPFILE 바이너리 블록들을 추출하여 구조적 결함이 없는지 확인합니다.
      RESTORE SPFILE VALIDATE;
    
      # 데이터파일 및 필요한 아카이브 로그 유효성을 점검합니다. 백업셋에서 블록을 읽어 체크섬을 대조합니다.
      RESTORE DATABASE VALIDATE;
    
      # 복구에 필요한 파일 목록 미리보기 (실제 복구 전 시뮬레이션)
      RESTORE DATABASE PREVIEW;
    }
    

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다