안녕하세요 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 상태가 되면 이후 추가된 데이터(아카이브 로그)는 반영 불가합니다.