Oracle 19c BEGIN BACKUP 활용: 운영 DB랑 동일한 환경 구축 

안녕하세요 Surmin입니다.

운영 데이터베이스와 동일한 환경을 빠르고 정확하게 구축하는 것은 늘 중요한 과제입니다. Oracle 19c에서는 BEGIN BACKUP 기능을 활용하여 이러한 목표를 효과적으로 달성할 수 있습니다. 본 포스팅에서는 BEGIN BACKUP을 이용해 운영 DB와 동일한 환경을 구축하는 실질적인 방법을 말씀 드리며, 참고하시면 좋을거 같습니다.

작업방식

sourcedb에서 샘플데이터를 생성→sourcedb에서 targetdb로 hotbackup을 통해 복구에 필요한 파일들을 전송→targetdb에서 이 파일들을 이용해 mount 상태까지만 기동→ sourcedb에서 일어난 변경분에 대한 아카이브로그를 계속 targetdb로 전송→이후 sourcedb를 종료한뒤 마지막 아카이브로그까지 targetdb로 전송시킨 후 recover를 진행


sourcedb :192.168.153.37

targetdb : 192.168.153.38

*참고로 현재 targetdb 서버에는 sourcedb 서버와 동일한 엔진이 설치되어있는 상태임

샘플 유저생성

-- 사용자 imsi를 생성하고 비밀번호를 imsi로 설정, 계정 잠금 해제, 기본 테이블스페이스를 users로 지정, users 테이블스페이스에 무제한 할당량 부여
create user imsi identified by imsi account unlock default tablespace users quota unlimited on users;

-- imsi 사용자에게 resource, connect 롤을 부여
grant resource, connect to imsi;

-- imsits 테이블스페이스와 그 안의 모든 내용 및 데이터파일을 삭제
drop tablespace imsits including contents and datafiles;

-- imsits 테이블스페이스를 생성하고, 데이터파일 경로와 크기를 2GB로 지정, autoextend(자동 확장) 비활성화
create tablespace imsits datafile '/app/oracle/oradata/ORA19C/imsits01.dbf' size 2g autoextend off;

-- imsi 사용자의 기본 테이블스페이스를 imsits로 변경하고, imsits 테이블스페이스에 무제한 할당량 부여
alter user imsi default tablespace imsits quota unlimited on imsits;

-- imsi 사용자에게 v_$session 뷰에 대한 SELECT 권한 부여
GRANT SELECT ON v_$session TO imsi;

-- imsi 사용자에게 v_$sql_plan_statistics_all 뷰에 대한 SELECT 권한 부여
GRANT SELECT ON v_$sql_plan_statistics_all TO imsi;

-- imsi 사용자에게 v_$sql_plan 뷰에 대한 SELECT 권한 부여
GRANT SELECT ON v_$sql_plan TO imsi;

-- imsi 사용자에게 v_$sql 뷰에 대한 SELECT 권한 부여
GRANT SELECT ON v_$sql TO imsi;

sourcedb에 아카이브 로그 설정

SQL> alter system set log_archive_format = 'oracle19_%t_%s_%r.arc' scope=spfile;
SQL> alter system set log_archive_dest_1 = 'location=/app/oracle/arch' scope = spfile; 
SQL> !mkdir -p /app/oracle/arch
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;

sourcedb에 샘플 테이블 생성 및 데이터 삽입

-- imsi 계정으로 접속
conn imsi/imsi

-- sample_t 테이블이 존재하면 삭제(purge 옵션으로 휴지통에도 남기지 않음)
drop table sample_t purge;
-- sample_t 테이블이 존재하면 삭제(중복 명령, 혹시 몰라 두 번 실행)
drop table sample_t purge;
-- sample_t2 테이블이 존재하면 삭제
drop table sample_t2 purge;
-- sample_t3 테이블이 존재하면 삭제
drop table sample_t3 purge;
-- sample_t4 테이블이 존재하면 삭제
drop table sample_t4 purge;

-- sample_t 테이블 생성
create table sample_t 
(
  id1 number,                -- 첫 번째 숫자 컬럼
  id2 number,                -- 두 번째 숫자 컬럼
  name varchar2(10),         -- 이름(최대 10자)
  date1 varchar2(8),         -- 날짜1(문자형, 8자)
  date2 varchar2(8),         -- 날짜2(문자형, 8자)
  date3 date,                -- 날짜3(날짜형)
  phone varchar2(13),        -- 전화번호(문자형, 13자)
  price number,              -- 가격(숫자)
  qty number,                -- 수량(숫자)
  test1 number,              -- 테스트용 숫자 컬럼
  test2 varchar2(5),         -- 테스트용 문자 컬럼(5자)
  test3 varchar2(4)          -- 테스트용 문자 컬럼(4자)
);

-- PL/SQL 블록 시작
DECLARE
  -- sample_t 테이블의 ROWTYPE을 갖는 컬렉션 타입(tbl_ins) 선언, 인덱스는 BINARY_INTEGER
  TYPE tbl_ins IS TABLE OF sample_t%ROWTYPE INDEX BY BINARY_INTEGER;
  w_ins tbl_ins; -- tbl_ins 타입의 변수 선언
BEGIN
  -- 10번 반복(외부 루프)
  FOR d IN 1..10 LOOP
    -- 1부터 100,000까지 반복(내부 루프)
    FOR i IN 1..100000 LOOP 
      -- 각 컬럼에 임의의 값 할당
      w_ins(i).id1   := i;  -- id1에 i값 할당
      w_ins(i).id2   := i||ceil(dbms_random.value(1, 10000000)); -- id2에 i와 랜덤값을 이어붙임
      w_ins(i).name  := dbms_random.string('x',5); -- 이름을 무작위 5글자로 생성
      w_ins(i).date1 := round(dbms_random.value(2010,2021))||to_char(round(dbms_random.value(1,12)), 'FM09')||to_char( round(dbms_random.value(1,28)), 'FM09'); -- 2010~2021년의 임의 날짜 생성(문자)
      w_ins(i).date2 := '2021'||to_char(round(dbms_random.value(1,12)) , 'FM09')||to_char(round(dbms_random.value(1,28)), 'FM09'); -- 2021년의 임의 날짜 생성(문자)
      w_ins(i).date3 := to_date(
        round(dbms_random.value(2019,2021))||'-'||
        round(dbms_random.value(1,12))||'-'||
        round(dbms_random.value(1,28))||' '||
        round(dbms_random.value(1, 23))||':'||
        round(dbms_random.value(0, 59))||':'||
        round(dbms_random.value(0, 59)), 
        'YYYY-MM-DD HH24:MI:SS'
      ); -- 2019~2021년 임의의 날짜/시간 생성(날짜형)
      w_ins(i).phone := '010-'||ceil(dbms_random.value(1000, 9999))||'-'||ceil(dbms_random.value(1000, 9999)); -- 임의의 전화번호 생성
      w_ins(i).price := ceil(dbms_random.value(1, 10))*1000; -- 1~10 중 임의값 * 1000(가격)
      w_ins(i).qty   := ceil(dbms_random.value(1, 10)); -- 1~10 중 임의값(수량)
      w_ins(i).test1 := 1234; -- test1은 1234로 고정
      w_ins(i).test2 := 'SQLP'; -- test2는 'SQLP'로 고정
      w_ins(i).test3 := 'A'||ceil(dbms_random.value(100, 999)); -- test3은 'A'와 100~999 사이의 임의값
    END LOOP;
    -- 컬렉션에 저장된 10만 건을 한 번에 insert
    FORALL i in 1..100000 INSERT INTO sample_t VALUES w_ins(i);
    -- 커밋
    COMMIT;
  END LOOP;
END;
/

테이블 건수 확인

select count(*) from sample_t;
  COUNT(*)
----------
   1000000

sourcedb에서 로그 스위치 수행

SQL> conn / as sysdba
#여러번 수행 (3~4)
SQL> alter system switch logfile;

sourcedb의 데이터파일 목록 확인

conn / as sysdba
set lines 200 pages 1000
col tablespace_name for a20
col file_name for a70
select tablespace_name, file_id, file_name, round(bytes/1024/1024/1024, 2) gb,
round(maxbytes/1024/1024/1024, 2) max_gb, autoextensible, status, online_status from dba_data_files
union all
select tablespace_name, file_id, file_name, round(bytes/1024/1024/1024, 2) gb,
round(maxbytes/1024/1024/1024, 2) max_gb, autoextensible, status, null from dba_temp_files order by 2;

TABLESPACE_NAME         FILE_ID FILE_NAME                                                                      GB     MAX_GB AUTOEX STATUS             ONLINE_STATUS
-------------------- ---------- ---------------------------------------------------------------------- ---------- ---------- ------ ------------------ --------------
SYSTEM                        1 /app/oracle/oradata/ORA19C/system01.dbf                                       .89         32 YES    AVAILABLE          SYSTEM
TEMP                          1 /app/oracle/oradata/ORA19C/temp01.dbf                                         .03         32 YES    ONLINE
SYSAUX                        3 /app/oracle/oradata/ORA19C/sysaux01.dbf                                       .58         32 YES    AVAILABLE          ONLINE
UNDOTBS1                      4 /app/oracle/oradata/ORA19C/undotbs01.dbf                                      .33         32 YES    AVAILABLE          ONLINE
IMSITS                        5 /app/oracle/oradata/ORA19C/imsits01.dbf                                         2          0 NO     AVAILABLE          ONLINE
USERS                         7 /app/oracle/oradata/ORA19C/users01.dbf                                          0         32 YES    AVAILABLE          ONLINE

6 rows selected.

sourcedb의 리두로그파일 목록 확인

   THREAD#     GROUP# MEMBER                                                       ARCHIV STATUS                                   MB  SEQUENCE#
---------- ---------- ------------------------------------------------------------ ------ -------------------------------- ---------- ----------
         1          1 /app/oracle/oradata/ORA19C/redo01.log                        NO     CURRENT                                 200         40
         1          2 /app/oracle/oradata/ORA19C/redo02.log                        YES    INACTIVE                                200         38
         1          3 /app/oracle/oradata/ORA19C/redo03.log                        YES    INACTIVE                                200         39

sourcedb의 컨트롤파일 목록 확인

set lines 200 pages 1000
col name for a50
select name from v$controlfile;

NAME
--------------------------------------------------
/app/oracle/oradata/ORA19C/control01.ctl
/app/oracle/oradata/ORA19C/control02.ctl

sourcedb의 아카이브로그 경로 확인

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /app/oracle/arch
Oldest online log sequence     38
Next log sequence to archive   40
Current log sequence           40

sourcedb의 파라미터파일 경로 확인

SQL>  show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string                 /app/oracle/product/19c/dbs/sp
                                                            fileORA19C.ora

audit 경로 확인

show parameter audit

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
audit_file_dest                      string                 /app/oracle/admin/ORA19C/adump
audit_sys_operations                 boolean                TRUE
audit_syslog_level                   string
audit_trail                          string                 DB, EXTENDED
unified_audit_common_systemlog       string
unified_audit_sga_queue_size         integer                1048576
unified_audit_systemlog              string

sourcedb에서 begin backup

alter database begin backup;

===

targetdb 서버에 오라클용 디렉토리 생성

mkdir -p /app/oracle/oradata/ORA19C/
mkdir -p /app/oracle/admin/ORA19C/adump
mkdir -p /app/oracle/arch

===

targetdb로 컨트롤파일, 데이터파일, 리두로그파일 전송

cd /app/oracle/oradata/ORA19C/
scp ./* 192.168.153.38:/app/oracle/oradata/ORA19C/

The authenticity of host '192.168.153.38 (192.168.153.38)' can't be established.
ECDSA key fingerprint is SHA256:Vk8Yw+Bjfp+8dqZQLYjrRhCIgM7IwuKTXiG4TtjwJgI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.153.38' (ECDSA) to the list of known hosts.
oracle@192.168.153.38's password:
control01.ctl                                                                                                                                          100%   10MB  50.4MB/s   00:00
control02.ctl                                                                                                                                          100%   10MB  41.3MB/s   00:00
imsits01.dbf                                                                                                                                           100% 2048MB  55.6MB/s   00:36
redo01.log                                                                                                                                             100%  200MB  41.8MB/s   00:04
redo02.log                                                                                                                                             100%  200MB  33.7MB/s   00:05
redo03.log                                                                                                                                             100%  200MB  24.4MB/s   00:08
sysaux01.dbf                                                                                                                                           100%  590MB  34.8MB/s   00:16
system01.dbf                                                                                                                                           100%  910MB  38.1MB/s   00:23
temp01.dbf                                                                                                                                             100%   32MB  39.8MB/s   00:00
undotbs01.dbf                                                                                                                                          100%  340MB  42.1MB/s   00:08
users01.dbf  

파라미터파일 복제

cd $ORACLE_HOME/dbs
scp spfileORA19C.ora 192.168.153.38:$ORACLE_BASE/product/19c/dbs/

sourcedb에서 로그 스위치 수행

conn / as sysdba
#3~4번 실행
alter system switch logfile;

sourcedb에서 end backup

alter database end backup;

아카이브로그 확인

cd /app/oracle/arch
[oracle@ORA19C arch]$ ll
total 139780
-rw-r----- 1 oracle dba 132442112 Jul  6 23:44 oracle19_1_34_1196893894.arc
-rw-r----- 1 oracle dba      1024 Jul  6 23:44 oracle19_1_35_1196893894.arc
-rw-r----- 1 oracle dba    285696 Jul  6 23:44 oracle19_1_36_1196893894.arc
-rw-r----- 1 oracle dba      1024 Jul  6 23:44 oracle19_1_37_1196893894.arc
-rw-r----- 1 oracle dba      1024 Jul  6 23:44 oracle19_1_38_1196893894.arc
-rw-r----- 1 oracle dba      1024 Jul  6 23:44 oracle19_1_39_1196893894.arc
-rw-r----- 1 oracle dba  10371072 Jul  7 00:33 oracle19_1_40_1196893894.arc
-rw-r----- 1 oracle dba      1024 Jul  7 00:33 oracle19_1_41_1196893894.arc
-rw-r----- 1 oracle dba      1536 Jul  7 00:33 oracle19_1_42_1196893894.arc
-rw-r----- 1 oracle dba      1024 Jul  7 00:33 oracle19_1_43_1196893894.arc
-rw-r----- 1 oracle dba      1024 Jul  7 00:33 oracle19_1_44_1196893894.arc
  • 핫백업 시점 + 신규 아카이브로그까지 scp로 전송
    • 스크립트를 이용합니다.
#!/bin/bash

SHOME="/app/oracle"
SDIR="${SHOME}/arch"
RHOST="192.168.153.38"
RDIR="/app/oracle/arch"
RUSER="oracle"
PW="oracle"
ORACLE_HOME="/app/oracle/product/19c"

DATE=`date "+%Y-%m-%d %H:%M:%S:"`

echo "=============================================="
echo "Archive Transfer Script Started"
echo "Time: ${DATE}"
echo "=============================================="

touch "${SHOME}/scp_arc1.log"
touch "${SHOME}/scp_archive_arc.log"

ssh-keyscan -H ${RHOST} >> ~/.ssh/known_hosts 2>/dev/null

echo "Ensuring remote directory exists..."
expect -c "
spawn ssh ${RUSER}@${RHOST} \"mkdir -p ${RDIR}\"
expect \"password:\" { send \"${PW}\\n\" }
expect eof
" >/dev/null 2>&1

echo "Getting remote file list..."
expect -c "
spawn ssh ${RUSER}@${RHOST} \"cd ${RDIR}; ls -1 *.arc 2>/dev/null\"
expect \"password:\" { send \"${PW}\\n\" }
expect eof
" > ${SHOME}/temp1.txt 2>/dev/null

cat -v ${SHOME}/temp1.txt | tr -d "^M" | grep -v spawn | grep -v password | grep "\.arc$" | sort > ${SHOME}/rfile1.lst

echo "Getting local file list..."
ls -1 $SDIR/*.arc 2>/dev/null | xargs -n1 basename | sort > ${SHOME}/sfile1.lst

LOCAL_COUNT=$(cat ${SHOME}/sfile1.lst | wc -l)
REMOTE_COUNT=$(cat ${SHOME}/rfile1.lst | wc -l)
TRANSFER_COUNT=$(comm -23 ${SHOME}/sfile1.lst ${SHOME}/rfile1.lst | wc -l)

echo "Local files: ${LOCAL_COUNT}"
echo "Remote files: ${REMOTE_COUNT}"
echo "Files to transfer: ${TRANSFER_COUNT}"

if [ ${TRANSFER_COUNT} -gt 0 ]; then
    echo "Starting file transfer..."
    TRANSFERRED=0
    FAILED=0
    
    for TFILE in $(comm -23 ${SHOME}/sfile1.lst ${SHOME}/rfile1.lst 2>/dev/null);
    do
      if [ -n "${TFILE}" ]; then
        echo "Transferring: ${TFILE} ($(($TRANSFERRED + $FAILED + 1))/${TRANSFER_COUNT})"
        
        FILE_SIZE=$(ls -lh ${SDIR}/${TFILE} 2>/dev/null | awk '{print $5}')
        echo "File size: ${FILE_SIZE}"
        
        expect -c "
        set timeout 300
        spawn scp ${SDIR}/${TFILE} ${RUSER}@${RHOST}:${RDIR}/
        expect \"password:\" { send \"${PW}\\n\" }
        expect {
            \"100%\" { 
                puts \"Transfer SUCCESS: ${TFILE}\"
                exit 0
            }
            timeout { 
                puts \"Transfer TIMEOUT: ${TFILE}\"
                exit 1
            }
            eof { exit 0 }
        }
        " > ${SHOME}/transfer_result.tmp 2>&1
        
        if [ $? -eq 0 ] && grep -q "SUCCESS\|100%" ${SHOME}/transfer_result.tmp; then
            echo "${DATE} Transfer successful: ${TFILE}" >> ${SHOME}/scp_arc1.log
            TRANSFERRED=$((TRANSFERRED + 1))
            echo "✓ SUCCESS"
        else
            echo "${DATE} Transfer failed: ${TFILE}" >> ${SHOME}/scp_arc1.log
            FAILED=$((FAILED + 1))
            echo "✗ FAILED"
        fi
        
        echo "Progress: Success=${TRANSFERRED}, Failed=${FAILED}"
        echo "---"
      fi
    done
    
    echo "Transfer completed!"
    echo "Successful transfers: ${TRANSFERRED}"
    echo "Failed transfers: ${FAILED}"
else
    echo "No files to transfer - all files are already present on remote server"
fi

echo ""
echo "Checking file integrity..."
expect -c "
spawn ssh ${RUSER}@${RHOST} \"cd ${RDIR}; ${ORACLE_HOME}/bin/dbfsize *.arc 2>&1 | grep 'bad' | wc -l\"
expect \"password:\" { send \"${PW}\\n\" }
expect eof
" > ${SHOME}/tcnt1.txt 2>/dev/null

DBF_ERR_CNT=$(cat -v ${SHOME}/tcnt1.txt | grep -v spawn | grep -v password | tr -d "^M" | grep -o '[0-9]*' | head -1)
DBF_ERR_CNT=${DBF_ERR_CNT:-0}

echo "Bad files count: ${DBF_ERR_CNT}"

if [ "${DBF_ERR_CNT}" = "0" ]; then
    echo ""
    echo "------------------------------------------"
    echo "${DATE} : Files --> OK"
    echo "Transfer Summary: ${TRANSFERRED:-0} successful, ${FAILED:-0} failed"
    echo ""
else
    echo ""
    echo "------------------------------------------"
    echo "${DATE} : Files --> Have to be checked (${DBF_ERR_CNT} bad files)"
    echo "Transfer Summary: ${TRANSFERRED:-0} successful, ${FAILED:-0} failed"
    echo ""
fi >> ${SHOME}/scp_arc1.log

echo "=============================================="
echo "Script completed!"
echo "Check ${SHOME}/scp_arc1.log for detailed logs"
echo "=============================================="

targetdb에서 db mount로 기동

#환경변수 맞춰준 상태
[oracle@ORA19C ~]$ cat .bash_profile
# Oracle 환경 설정 - 2025-03-27
stty erase ^H
umask 022
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/19c
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_INVENTORY=$ORACLE_BASE/oraInventory
export ORACLE_SID=ORA19C
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME/lib32:/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64
export NLS_LANG=American_America.KO16KSC5601
# export DISPLAY=192.168.1.11:0.0
export PATH=$PATH:/usr/ccs/bin:/usr/sbin:/sbin:/usr/bin:/bin:/usr/X11R6/bin:$ORACLE_HOME/bin
export EDITOR=vi
export LANG=C
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export CV_ASSUME_DISTID=OL7
=========

#기동확인
SQL> startup mount
ORACLE instance started.

Total System Global Area 1224736224 bytes
Fixed Size                  8895968 bytes
Variable Size             402653184 bytes
Database Buffers          805306368 bytes
Redo Buffers                7880704 bytes
Database mounted.

targetdb에서 rman 접속 후 아카이브로그 등록

rman target /

#핫백업중에 생성된 아카이브(40~44)들이 정상적으로 targetdb에서 인식됨
catalog start with '/app/oracle/arch/';

List of Files Unknown to the Database
=====================================
File Name: /app/oracle/arch/oracle19_1_40_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_41_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_42_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_43_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_44_1196893894.arc

Do you really want to catalog the above files (enter YES or NO)? yes
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /app/oracle/arch/oracle19_1_40_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_41_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_42_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_43_1196893894.arc
File Name: /app/oracle/arch/oracle19_1_44_1196893894.arc

#인식한 아카이브 확인
list archivelog all;

targetdb에서 아카이브로그 파일을 이용해 recover (sequence는 아카이브로그보다 1많게 줌)

RMAN> recover database until sequence 45;

Starting recover at 07-JUL-25
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=44 device type=DISK

starting media recovery

archived log for thread 1 with sequence 40 is already on disk as file /app/oracle/arch/oracle19_1_40_1196893894.arc
archived log for thread 1 with sequence 41 is already on disk as file /app/oracle/arch/oracle19_1_41_1196893894.arc
archived log for thread 1 with sequence 42 is already on disk as file /app/oracle/arch/oracle19_1_42_1196893894.arc
archived log for thread 1 with sequence 43 is already on disk as file /app/oracle/arch/oracle19_1_43_1196893894.arc
archived log for thread 1 with sequence 44 is already on disk as file /app/oracle/arch/oracle19_1_44_1196893894.arc
archived log file name=/app/oracle/arch/oracle19_1_40_1196893894.arc thread=1 sequence=40
archived log file name=/app/oracle/arch/oracle19_1_41_1196893894.arc thread=1 sequence=41
archived log file name=/app/oracle/arch/oracle19_1_42_1196893894.arc thread=1 sequence=42
archived log file name=/app/oracle/arch/oracle19_1_43_1196893894.arc thread=1 sequence=43
archived log file name=/app/oracle/arch/oracle19_1_44_1196893894.arc thread=1 sequence=44
Oracle Error:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01195: online backup of file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/app/oracle/oradata/ORA19C/system01.dbf'

media recovery complete, elapsed time: 00:00:00
Finished recover at 07-JUL-25

##에러발생함, 현재 44 아카이브로그 기준으로 보면 db가 begin backup 상태이기 때문

여기까지만 복구하고 open 기동시키고 싶은경우 아래와 같이 end backup을 실행해준뒤 noresetlogs로 open 해주면됨

SQL>alter database end backup;
SQL>alter database open noresetlogs;

데이터확인

SQL> conn imsi/imsi
Connected.
SQL> select count(*) from sample_t;

  COUNT(*)
----------
   1000000

ETC

sourcedb에서 샘플 테이블3 추가 생성 및 데이터 삽입 그런데

targetdb에서 open한 이후부터는 더이상 sourcedb의 아카이브로그를 targetdb에 적용시킬 수 없음만약 sourcedb에서 추가로 생성한 데이터를 targetdb에 적용하면 아래와 같이 아카이브가 적용되지않음

conn imsi/imsi
create table sample_t3 as select * from sample_t where rownum <= 100000;
#6번 실행
alter system switch logfile;

=>아카이브로그 확인 및 신규 아카이브로그 scp로 전송

targetdb 종료 후 mount 기동

SQL> shutdown immediate
SQL> startup mount
rman target /
RMAN> catalog start with '/app/oracle/arch/';


RMAN> recover database until sequence 59;

Starting recover at 07-JUL-25
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=45 device type=DISK

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 07-JUL-25

=>초기와는 다르게 아카이브가 적용되었다는 메세지가 나오지 않음


RMAN> alter database open noresetlogs;

#원본
SQL> select * from tab;

TNAME                          TABTYPE    CLUSTERID
------------------------------ ---------- ---------
SAMPLE_T                       TABLE
SAMPLE_T3                      TABLE


#타겟
TNAME                          TABTYPE    CLUSTERID
------------------------------ ---------- ---------
SAMPLE_T                       TABLE

=>위와과 같이 ADG , 동기화 솔루션을 사용하지 않고 핫백업 + 아카이브로그만을 활용하여 다운타임을 최소화하면서 db를 이관할 수 있음targetdb는 sourcedb의 데이터변경이 더 일어나지 않는다는 확정을 받기 전까지는 계속 mount 상태로 있어야함, 이후 open 하면됨하지만 한 번 open 상태가 되면 이후 추가된 데이터(아카이브 로그)는 반영 불가합니다.

참고
https://positivemh.tistory.com/1209

위로 스크롤