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

아래 순서대로 “Data Guard 기반의 백업 오프로딩(Backup Offloading)” 환경구성 및 모의훈련을 실시할 예정입니다.
- Part1: Catalog DB → Primary DB → Standby DB 운영환경 구성
- Part2: Catalog DB 및 Standby DB를 활용한 백업환경 구성
- Part3: 서버 중지 및 재기동 절차
- Part4: Primary DB → Standby DB로의 데이터 전송 테스트
- Part5: Primary DB의 복구 모의훈련
- Part6: Standby DB로 Failover 모의훈련
- Part7: Primary DB로 Switchback 모의훈련
- Part8: 모니터링 및 트러블슈팅 가이드
Part1에서는 Catalog DB → Primary DB → Standby DB 운영환경을 구성하였습니다. Part2에서는 Catalog DB 및 Standby DB를 활용한 백업환경 구성하고 실제 백업까지하는 절차를 알아보겠습니다.
- 백업 파일 외부 저장소 구축
- “원격 파일시스템을 마운팅하기(NFS)” 글을 먼저 참고하시면 좋습니다.
- 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
- RMAN 구성 설정 (정책 확정)
- 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
- 추가 설정: 필수 보안 및 최적화 설정
-- 제어파일과 SPFILE을 백업 시마다 자동으로 저장 (가장 중요) CONFIGURE CONTROLFILE AUTOBACKUP ON; -- 백업 파일의 중복 생성을 방지하여 공간 절약 CONFIGURE BACKUP OPTIMIZATION ON; -- 복구 가능 기간 설정 (최근 7일간은 언제든 복구 가능하게 유지) CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
- 추가 설정: 외부 저장소(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';
- 추가 설정: Snapshot Controlfile 위치 조정
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup_data/snapcf_pridb.f';
- 추가 설정: 병렬 처리(PARALLELISM) 설정
CONFIGURE DEVICE TYPE DISK PARALLELISM 2;
- 다시
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';
- 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';
- Primary DB에서 RMAN에 접속한 후 현재 설정 사항을 확인해 봅니다. “RMAN으로 백업 및 복구하기” 글을 읽으시면 환경설정에 도움이 될겁니다.
- Standby DB 전용 백업 스크립트 작성 (Full Backup + Incremental Backup + Archivelog)
- 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 /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
- 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 ---"
- Standby DB에서 아래 백업 스크립트를 저장하고 crontab을 사용해서 매일 실행합니다.
- 백업 유효성 검증
RUN { # 백업셋 내부에 저장된 제어파일 데이터 블록들이 온전한지, 그리고 현재 DB의 DBID와 일치하는지 확인합니다. RESTORE CONTROLFILE VALIDATE; # 동일한 백업셋 내부에 저장된 SPFILE 바이너리 블록들을 추출하여 구조적 결함이 없는지 확인합니다. RESTORE SPFILE VALIDATE; # 데이터파일 및 필요한 아카이브 로그 유효성을 점검합니다. 백업셋에서 블록을 읽어 체크섬을 대조합니다. RESTORE DATABASE VALIDATE; # 복구에 필요한 파일 목록 미리보기 (실제 복구 전 시뮬레이션) RESTORE DATABASE PREVIEW; }
