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

아래 순서대로 “Data Guard 기반의 백업 오프로딩(Backup Offloading)” 환경구성 및 모의훈련을 실시할 예정입니다.
- Basic: Oracle DataGuard 아키텍처와 프로세스의 이해
- Part1: Catalog DB → Primary DB → Standby DB 운영환경 구성
- Part2: Catalog DB 및 Standby DB를 활용한 백업환경 구성
- Part3: Primay/Standby/Catalog 서버 중지 및 재기동 절차
- Part4: Primary DB → Standby DB로의 데이터 전송 테스트
- Part5: Primary DB의 복구 모의훈련
- Part6: Standby DB로 Switchover/Switchback/Failover 모의훈련
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 NONE; # default CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11.2.0.4.0/dbhome_1/dbs/snapcf_stbdb.f'; # default
- 추가 설정
-- 복구 가능 기간 설정 (최근 7일간은 언제든 복구 가능하게 유지) ---- "7일이 지난 파일은 다 지워라"가 아니라, "오늘부터 7일 전 이내의 어느 시점으로든 완벽하게 복구할 수 있도록 파일을 유지하라"는 뜻입니다. CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; -- 백업 파일의 중복 생성을 방지하여 공간 절약 CONFIGURE BACKUP OPTIMIZATION ON; -- 제어파일과 SPFILE을 백업 시마다 자동으로 저장 (가장 중요) ---- "/backup_data/autobackup" 디렉토리는 미리 생성해야 합니다. ---- %F(Combined ID for Control File): Control File 자동 백업에만 사용되는 복합 고유값(c-DBID-YYYYMMDD-순번) CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup_data/autobackup/%F'; -- 병렬 처리(PARALLELISM) 설정 CONFIGURE DEVICE TYPE DISK PARALLELISM 2; -- Archivelog 삭제 정책 설정 ---- Archivelog가 모든 Standby DB에 적용(Applied)되고, 최소 1회 백업까지 완료된 경우에만 삭제 가능하도록 강제 CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY BACKED UP 1 TIMES TO DISK; -- Snapshot Controlfile 위치 조정 CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup_data/snapcf_pridb.f';
- 다시
show all;을 입력하여 # default 표시가 사라졌는지 확인합니다.-- 참고로 control_file_record_keep_time 파라미터는 RETENTION POLICY보다 커야 합니다. ---- control_file_record_keep_time = retention period + level 0 backup interval + 1 day. RMAN> show all; RMAN configuration parameters for database with db_unique_name PRIDB are: 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/autobackup/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 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 'PRI_DB'; CONFIGURE DB_UNIQUE_NAME 'STBDB' CONNECT IDENTIFIER 'STB_DB'; CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY BACKED UP 1 TIMES TO DISK; CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup_data/snapcf_pridb.f';
- Standby DB에도 RMAN에 접속한 후 아래와 같이 설정합니다.
— Controlfile 백업은 Primary DB만 필요하므로 “CONFIGURE CONTROLFILE AUTOBACKUP” 관련 설정은 Default를 유지합니다.RMAN> show all; RMAN configuration parameters for database with db_unique_name STBDB are: CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; CONFIGURE BACKUP OPTIMIZATION ON; 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 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 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 'PRI_DB'; CONFIGURE DB_UNIQUE_NAME 'STBDB' CONNECT IDENTIFIER 'STB_DB'; CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY BACKED UP 1 TIMES TO DISK; CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup_data/snapcf_stbdb.f';
- Primary DB에서 RMAN에 접속한 후 현재 설정 사항을 확인해 봅니다. “RMAN으로 백업 및 복구하기” 글을 읽으시면 환경설정에 도움이 될겁니다.
- Standby DB 전용 백업 스크립트 작성 (Full Backup + Incremental Backup + Archivelog + Controlfile + SPfile)
- 데이터파일 & 아카이브 로그: Standby에서 백업 (부하 분산)
- 이유: 백업 작업은 서버의 CPU와 디스크 I/O를 가장 많이 사용하는 작업 중 하나입니다.
- 잇점: 운영 서버(Primary)의 자원을 전혀 건드리지 않고, 놀고 있는 Standby 서버의 자원을 활용하여 백업 본을 만듭니다. 이를 Backup Offloading이라고 합니다.
- 결과: 사용자 서비스 응답 속도에 영향을 주지 않으면서 안정적으로 백업을 수행할 수 있습니다.
- Controlfile& SPfile: Primary에서 백업 (무결성 보장)
- 이유: 컨트롤파일은 데이터베이스의 ‘주민등록등본’과 같습니다. 데이터베이스의 구조(테이블스페이스 추가, 파일 이동 등)가 변경되는 모든 순간은 Primary에서 먼저 일어납니다.
- 잇점: Primary의 컨트롤파일은 가장 최신의 SCN 정보와 메타데이터를 담고 있는 ‘원본’입니다. Standby의 컨트롤파일은 이를 복제받는 형태이므로, 복구 시 가장 확실한 보증 수표는 Primary에서 백업받은 원본 컨트롤파일입니다.
- 결과: 전체 장애(Disaster) 발생 시, Primary의 컨트롤파일 백업본만 있으면 가장 빠르고 정확하게 전체 환경을 재구성할 수 있습니다.
- Standby DB에서 아래 백업 스크립트를 저장하고 crontab을 사용해서 매일 실행합니다. “RMAN으로 백업 및 복구하기” 글을 참고하셔서 백업 스크립트를 보완하시면 좋습니다.
[oracle@standby-db ~]$ vi /home/oracle/scripts/rman_backup.sh #!/bin/bash check_error() { if [ $1 -ne 0 ]; then echo " [ERROR] $2 failed at $(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE echo "Stopping backup process." >> $LOG_FILE exit 1 fi } ############################################# # 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 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ############################################# # Catalog Connection ############################################# PRI_TARGET="sys/orclsys@PRI_DB" STB_TARGET="/" CATALOG_USER=rman_admin CATALOG_PASS=orclsys CATALOG_TNS=CAT_DB CATALOG_CONN="${CATALOG_USER}/${CATALOG_PASS}@${CATALOG_TNS}" ############################################# # 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 before manually executing this script at the first time, and then comment the line below again #DAY_OF_WEEK="7" if [ "${DAY_OF_WEEK}" == "7" ]; then LEVEL=0 TAG_NAME="WEEKLY_FULL_LEVEL0" else LEVEL=1 TAG_NAME="DAILY_INCREMENTAL_LEVEL1" fi #Differential Incremental Backup = "", Cumulative Incremental Backup = "CUMULATIVE" INCREMENTALTYPE="CUMULATIVE" ############################################# # RMAN Execution (With Catalog) ############################################# echo "=========================================================" >> $LOG_FILE echo "--- Primary Archive Log Switch Started at $(date '+%Y-%m-%d %H:%M:%S') ---" >> $LOG_FILE echo "=========================================================" >> $LOG_FILE sqlplus -s ${PRI_TARGET} <<EOF ALTER SYSTEM ARCHIVE LOG CURRENT; EXIT; EOF check_error $? "Primary Archive Log Switch" sleep 30 echo "=========================================================" >> $LOG_FILE echo "--- Standby Offload Backup Started at $(date '+%Y-%m-%d %H:%M:%S') ---" >> $LOG_FILE echo "--- Mode: $TAG_NAME ---" >> $LOG_FILE echo "=========================================================" >> $LOG_FILE rman target ${STB_TARGET} catalog ${CATALOG_CONN} log=${LOG_FILE} append <<EOF1 RUN { BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL ${LEVEL} ${INCREMENTALTYPE} DATABASE FORMAT '${BACKUP_DIR}/datafile_%d_%T_%U.bkp' TAG '${TAG_NAME}'; # FORCE; BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL DELETE INPUT FORMAT '${BACKUP_DIR}/arch_%d_%T_%U.bkp' TAG 'ARCHIVELOG_BACKUP'; # FORCE; } EXIT; EOF1 check_error $? "Standby Database Backup" echo "=========================================================" >> $LOG_FILE echo "--- Primary Synchronize Catalog and Backup Controlfile---" >> ${LOG_FILE} echo "=========================================================" >> $LOG_FILE rman target ${PRI_TARGET} catalog ${CATALOG_CONN} log=${LOG_FILE} append <<EOF2 CATALOG START WITH '${BACKUP_BASE}/' NOPROMPT; RUN { CROSSCHECK BACKUP; CROSSCHECK COPY; CROSSCHECK ARCHIVELOG ALL; DELETE NOPROMPT EXPIRED BACKUP; DELETE NOPROMPT EXPIRED ARCHIVELOG ALL; DELETE NOPROMPT EXPIRED COPY; BACKUP CURRENT CONTROLFILE FORMAT '${BACKUP_DIR}/ctrl_%d_%T_%U.bkp' TAG 'CONTROLFILE_BACKUP'; BACKUP SPFILE FORMAT '${BACKUP_DIR}/spfile_%d_%T_%U' TAG 'SPFILE_BACKUP'; REPORT OBSOLETE; DELETE NOPROMPT OBSOLETE; # DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-14'; RESYNC CATALOG; } EXIT; EOF2 check_error $? "Primary Controlfile Backup & Cleanup" echo "=========================================================" >> $LOG_FILE echo "--- Standby Synchronize Catalog ---" >> ${LOG_FILE} echo "=========================================================" >> $LOG_FILE rman target ${STB_TARGET} catalog ${CATALOG_CONN} log=${LOG_FILE} append <<EOF3 CATALOG START WITH '${BACKUP_BASE}/autobackup/' NOPROMPT; CATALOG START WITH '${BACKUP_DIR}/' NOPROMPT; EXIT; EOF3 check_error $? "Standby Synchronizing" ############################################# # OS Level Clean up ############################################# echo "=========================================================" >> $LOG_FILE echo "--- Cleaning up empty backup directories ---" >> ${LOG_FILE} find ${BACKUP_BASE} -type f -name "init${ORACLE_SID}.ora*" -mtime +7 -exec rm -f {} \; find /backup_data -maxdepth 1 -type d -empty -mmin +60 -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/ |-- 20260317090001 | |-- arch_ORCL11G_20260317_4p4j79sv_1_1.bkp | |-- arch_ORCL11G_20260317_4q4j79sv_1_1.bkp | |-- arch_ORCL11G_20260317_4r4j79t0_1_1.bkp | |-- ctrl_ORCL11G_20260317_094j79ub_1_1.bkp | |-- datafile_ORCL11G_20260317_4l4j79sm_1_1.bkp | |-- datafile_ORCL11G_20260317_4m4j79sm_1_1.bkp | |-- datafile_ORCL11G_20260317_4n4j79sn_1_1.bkp | |-- datafile_ORCL11G_20260317_4o4j79sr_1_1.bkp | `-- spfile_ORCL11G_20260317_0a4j79ug_1_1 |-- autobackup | `-- conf_c-1333016804-20260317-00 |-- snapcf_pridb.f `-- snapcf_stbdb.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 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; DELETE NOPROMPT EXPIRED COPY; 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에서 백업 (부하 분산)
- 백업 유효성 검증
- 백업 정보 일치 여부 검증 (Primary DB vs Standby DB)
RMAN> RUN { CROSSCHECK BACKUP; CROSSCHECK ARCHIVELOG ALL; CROSSCHECK COPY; DELETE NOPROMPT EXPIRED BACKUP; DELETE NOPROMPT EXPIRED ARCHIVELOG ALL; DELETE NOPROMPT EXPIRED COPY; } RMAN> LIST BACKUP SUMMARY; List of Backups =============== Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag ------- -- -- - ----------- --------------- ------- ------- ---------- --- .... - Primary DB 리스트에 누락된 백업이 있다면,
CATALOG START WITH '디렉토리 경로'명령으로 디렉토리 전체를 스캔하거나,CATALOG BACKUPPIECE '파일 경로'명령으로 특정 백업 파일을 개별 등록하여 동기화할 수 있습니다.-- Primary DB에서 디렉토리 내 모든 파일 스캔 및 일괄 등록 RMAN> CATALOG START WITH '/backup_data/경로/' -- Primary DB에서 특정 파일 지정 개별 등록 RMAN> CATALOG BACKUPPIECE '/backup_data/경로/파일명.bkp'
- 백업 파일 유효성 검증 (Physical Validity)
RUN { # 데이터파일 및 필요한 아카이브 로그 유효성을 점검합니다. 백업셋에서 블록을 읽어 체크섬을 대조합니다. RESTORE DATABASE VALIDATE; # 아카이브 로그 백업 파일 검증 RESTORE ARCHIVELOG ALL VALIDATE; # 백업셋 내부에 저장된 제어파일 데이터 블록들이 온전한지, 그리고 현재 DB의 DBID와 일치하는지 확인합니다. RESTORE CONTROLFILE VALIDATE; # 동일한 백업셋 내부에 저장된 SPFILE 바이너리 블록들을 추출하여 구조적 결함이 없는지 확인합니다. RESTORE SPFILE VALIDATE; # 복구에 필요한 파일 목록 미리보기 (실제 복구 전 시뮬레이션) RESTORE DATABASE PREVIEW; }
- 백업 정보 일치 여부 검증 (Primary DB vs Standby DB)
