프린트 하기

OS 환경 : Oracle Linux 8.1 (64bit)

 

DB 환경 : Oracle Database 19.24.0.0

 

방법 : 오라클 19c 핫백업을 이용한 다운타임 최소화 이관

본문에서는 핫백업을 이용해 다운타임을 최소화 할수 있는 이관 방법을 설명함
(실시간 동기화나 adg 등 추가 라이센스 없이 가능한 방식)
핫백업 : 데이터베이스가 운영 중인 상태에서 진행하는 백업

 

 

작업방식을 간단하게 설명하면
sourcedb에서 샘플데이터를 생성한 뒤
sourcedb에서 targetdb로 hotbackup을 통해 복구에 필요한 파일들을 전송하고
targetdb에서 이 파일들을 이용해 mount 상태까지만 기동 시켜놓고
sourcedb에서 일어난 변경분에 대한 아카이브로그를 계속 targetdb로 전송해주고
이후 sourcedb를 종료한뒤 마지막 아카이브로그까지 targetdb로 전송시킨 후 recover를 진행함
이 방식을 사용하게 되면 sourcedb를 종료하기 직전까지는 ap에서 sourcedb로 연결 시켜놓았다가 targetdb가 recover, open 되면 ap에서 targetdb로 연결을 변경하면됨
최종적으로 sourcedb 종료시점부터 targetdb가 recover 되서 올라오는 시간까지만 다운타임이 발생하게됨
수동으로 ADG(Active Data Guard)의 mrp 기능을 수행한다고 보면될듯함

 

 

서버 정보
sourcedb : hostname : sourcedb, ip : 192.168.137.100
targetdb : hostname : targetdb, ip : 192.168.137.101
*참고로 현재 targetdb 서버에는 sourcedb 서버와 동일한 엔진이 설치되어있는 상태임

 

 

테스트
샘플 유저 생성
참고 : 오라클 19c 테스트 시 사용하는 imsi 유저 생성 쿼리 ( https://positivemh.tistory.com/1017 )

 

 

sourcedb에 아카이브 로그 설정

1
2
3
4
5
6
7
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에 샘플 테이블 생성 및 데이터 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SQL>
conn imsi/imsi
drop table sample_t purge;
drop table sample_t purge;
drop table sample_t2 purge;
drop table sample_t3 purge;
drop table sample_t4 purge;
create table sample_t 
(id1 number, id2 number, name varchar2(10),  
date1 varchar2(8), date2 varchar2(8), date3 date, 
phone varchar2(13), price number, qty number, 
test1 number,  test2 varchar2(5), test3 varchar2(4)
);
 
Table created.
 
SQL>
DECLARE
TYPE tbl_ins IS TABLE OF sample_t%ROWTYPE INDEX BY BINARY_INTEGER;
w_ins tbl_ins;
BEGIN
FOR d IN 1..10 LOOP
FOR i IN 1..100000 LOOP 
   w_ins(i).id1   := i;
   w_ins(i).id2   := i||ceil(dbms_random.value(1, 10000000));
   w_ins(i).name  := dbms_random.string('x',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');
   w_ins(i).date2 := '2021'||to_char(round(dbms_random.value(1,12)) , 'FM09')||to_char(round(dbms_random.value(1,28)), 'FM09');
   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');
   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;
   w_ins(i).qty   := ceil(dbms_random.value(1, 10));
   w_ins(i).test1 := 1234;
   w_ins(i).test2 := 'SQLP';
   w_ins(i).test3 := 'A'||ceil(dbms_random.value(100, 999));
END LOOP;
FORALL i in 1..100000 INSERT INTO sample_t VALUES w_ins(i);
   COMMIT;
END LOOP;
END;
/
 
PL/SQL procedure successfully completed.

 

 

테이블 건수 확인

1
2
3
4
5
SQL> select count(*) from sample_t;
 
  COUNT(*)
----------
  10000000

 

 

sourcedb에서 로그 스위치 수행

1
2
3
4
5
6
7
8
9
10
11
12
SQL> conn / as sysdba
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
SQL> /
 
System altered.

 

 

sourcedb의 데이터파일 목록 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL> 
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 AUT STATUS    ONLINE_
-------------------- ---------- ---------------------------------------------------------------------- ---------- ---------- --- --------- -------
SYSTEM                        1 /app/oracle/oradata/ORACLE19/system01.dbf                                     .68         32 YES AVAILABLE SYSTEM
TEMP                          1 /app/oracle/oradata/ORACLE19/temp01.dbf                                         5         32 YES ONLINE
SYSAUX                        2 /app/oracle/oradata/ORACLE19/sysaux01.dbf                                     .54         32 YES AVAILABLE ONLINE
UNDOTBS1                      3 /app/oracle/oradata/ORACLE19/undotbs01.dbf                                      5         32 YES AVAILABLE ONLINE
USERS                         4 /app/oracle/oradata/ORACLE19/users01.dbf                                        5         32 YES AVAILABLE ONLINE

temp포함 5개가 존재함

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL>
set lines 200 pages 1000
col member for a60
select thread#, l.group#, member, archived, l.status, (bytes/1024/1024) MB, sequence#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1, 2;
 
   THREAD#     GROUP# MEMBER                                                       ARC STATUS                   MB  SEQUENCE#
---------- ---------- ------------------------------------------------------------ --- ---------------- ---------- ----------
         1          1 /app/oracle/oradata/ORACLE19/redo01.log                      YES INACTIVE               2048        142
         1          2 /app/oracle/oradata/ORACLE19/redo02.log                      NO  CURRENT                2048        143
         1          3 /app/oracle/oradata/ORACLE19/redo03.log                      YES INACTIVE               2048        141

3개 redo가 존재함

 

 

sourcedb의 컨트롤파일 목록 확인

1
2
3
4
5
6
7
8
9
SQL> 
set lines 200 pages 1000
col name for a50
select name from v$controlfile;
 
NAME
--------------------------------------------------
/app/oracle/oradata/ORACLE19/control01.ctl
/app/oracle/oradata/ORACLE19/control02.ctl

2개의 컨트롤파일이 존재함

 

 

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

1
2
3
4
5
6
7
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /app/oracle/arch
Oldest online log sequence     141
Next log sequence to archive   143
Current log sequence           143

정상적으로 아카이브모드가 설정되어 있고 /app/oracle/arch 경로에 존재함

 

 

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

1
2
3
4
5
SQL> show parameter spfile
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /app/oracle/product/19c/dbs/spfileoracle19.ora

 

 

audit 경로 확인

1
2
3
4
5
SQL> show parameter audit
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /app/oracle/admin/oracle19/adump

 

 

sourcedb에서 begin backup

1
2
3
SQL> alter database begin backup;
 
Database altered.

 

 

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

1
2
3
$ mkdir -p /app/oracle/oradata/ORACLE19/
$ mkdir -p /app/oracle/admin/oracle19/adump
$ mkdir -p /app/oracle/arch

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cd /app/oracle/oradata/ORACLE19/
$ scp ./* 192.168.137.101:/app/oracle/oradata/ORACLE19/
oracle@192.168.137.101's password:
control01.ctl                                                                       100%   10MB 216.5MB/s   00:00
control02.ctl                                                                       100%   10MB 195.8MB/s   00:00
redo01.log                                                                          100% 2048MB 176.0MB/s   00:11
redo02.log                                                                          100% 2048MB 169.8MB/s   00:12
redo03.log                                                                          100% 2048MB 180.3MB/s   00:11
sysaux01.dbf                                                                        100%  550MB 148.4MB/s   00:03
system01.dbf                                                                        100%  700MB 174.8MB/s   00:04
temp01.dbf                                                                          100% 5120MB 267.1MB/s   00:19
undotbs01.dbf                                                                       100% 5120MB 192.4MB/s   00:26
users01.dbf                                                                         100% 5120MB 170.8MB/s   00:29

모두 targetdb로 전송됨

 

 

파라미터파일 복제

1
2
3
4
$ cd $ORACLE_HOME/dbs
$ scp spfileoracle19.ora 192.168.137.101:/app/oracle/product/19c/dbs/
oracle@192.168.137.101's password:
spfileoracle19.ora                                                                  100% 3584     3.1MB/s   00:00

 

 

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

1
2
3
4
SQL> conn imsi/imsi
SQL> create table sample_t2 as select * from sample_t where rownum <= 100000;
 
Table created.

 

 

sourcedb에서 로그 스위치 수행

1
2
3
4
5
6
7
8
9
10
11
12
SQL> conn / as sysdba
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
SQL> /
 
System altered.

 

 

sourcedb에서 end backup

1
2
3
SQL> alter database end backup;
 
Database altered.

 

 

아카이브로그 확인

1
2
3
4
5
6
7
8
9
10
11
$ cd /app/oracle/arch
$ ls -al
total 108672
drwxr-xr-x.  2 oracle oinstall       222 Feb 23 12:32 .
drwxrwxr-x. 10 oracle dba            124 Feb 22 16:17 ..
-rw-r-----.  1 oracle oinstall 100574720 Feb 23 13:23 oracle19_1_140_1177056415.arc
-rw-r-----.  1 oracle oinstall      1024 Feb 23 13:23 oracle19_1_141_1177056415.arc
-rw-r-----.  1 oracle oinstall    254976 Feb 23 13:23 oracle19_1_142_1177056415.arc
-rw-r-----.  1 oracle oinstall  10434048 Feb 23 13:25 oracle19_1_143_1177056415.arc
-rw-r-----.  1 oracle oinstall      1024 Feb 23 13:25 oracle19_1_144_1177056415.arc
-rw-r-----.  1 oracle oinstall      3584 Feb 23 13:25 oracle19_1_145_1177056415.arc

 

 

핫백업 시점 + 신규 아카이브로그까지 scp로 전송

1
2
3
4
5
6
7
8
$ scp ./* 192.168.137.101:/app/oracle/arch/
oracle@192.168.137.101's password:
oracle19_1_112_1177056415.arc                              100%   48MB 229.1MB/s   00:00
oracle19_1_113_1177056415.arc                              100% 1024   335.7KB/s   00:00
oracle19_1_114_1177056415.arc                              100%  127KB  27.6MB/s   00:00
oracle19_1_115_1177056415.arc                              100%   10MB 249.6MB/s   00:00
oracle19_1_116_1177056415.arc                              100% 1024   418.4KB/s   00:00
oracle19_1_117_1177056415.arc                              100% 3072     1.2MB/s   00:00

 

 

targetdb에서 db mount로 기동

1
2
3
4
5
6
7
8
9
10
$ export ORACLE_SID=oracle19
SQL> startup mount
ORACLE instance started.
 
Total System Global Area 1375731600 bytes
Fixed Size                  8896400 bytes
Variable Size             402653184 bytes
Database Buffers          956301312 bytes
Redo Buffers                7880704 bytes
Database mounted.

정상적으로 기동됨

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ rman target /
RMAN> catalog start with '/app/oracle/arch/';
 
using target database control file instead of recovery catalog
searching for all files that match the pattern /app/oracle/arch/
 
List of Files Unknown to the Database
=====================================
File Name: /app/oracle/arch/oracle19_1_143_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_144_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_145_1177056415.arc
 
Do you really want to catalog the above files (enter YES or NO)? yes <<-- [yes 입력]
cataloging files...
cataloging done
 
List of Cataloged Files
=======================
File Name: /app/oracle/arch/oracle19_1_143_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_144_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_145_1177056415.arc

핫백업중에 생성된 아카이브(143~145)들이 정상적으로 targetdb에서 인식됨

 

 

인식한 아카이브로그 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
RMAN> list archivelog all;
 
List of Archived Log Copies for database with db_unique_name ORACLE19
=====================================================================
 
Key     Thrd Seq     S Low Time
------- ---- ------- - -------------------
130     1    140     A 2025-02-23 13:22:10
        Name: /app/oracle/arch/oracle19_1_140_1177056415.arc
 
131     1    141     A 2025-02-23 13:23:21
        Name: /app/oracle/arch/oracle19_1_141_1177056415.arc
 
132     1    142     A 2025-02-23 13:23:21
        Name: /app/oracle/arch/oracle19_1_142_1177056415.arc
 
133     1    143     A 2025-02-23 13:23:24
        Name: /app/oracle/arch/oracle19_1_143_1177056415.arc
 
134     1    144     A 2025-02-23 13:25:05
        Name: /app/oracle/arch/oracle19_1_144_1177056415.arc
 
135     1    145     A 2025-02-23 13:25:05
        Name: /app/oracle/arch/oracle19_1_145_1177056415.arc

핫백업중에 생성된 아카이브(143~145)와 핫백업 전에 생성된 140~142 아카이브로그도 확인됨

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
RMAN> recover database until sequence 146;
 
Starting recover at 2025-02-23 13:26:58
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=138 device type=DISK
 
starting media recovery
 
archived log for thread 1 with sequence 143 is already on disk as file /app/oracle/arch/oracle19_1_143_1177056415.arc
archived log for thread 1 with sequence 144 is already on disk as file /app/oracle/arch/oracle19_1_144_1177056415.arc
archived log for thread 1 with sequence 145 is already on disk as file /app/oracle/arch/oracle19_1_145_1177056415.arc
archived log file name=/app/oracle/arch/oracle19_1_143_1177056415.arc thread=1 sequence=143
archived log file name=/app/oracle/arch/oracle19_1_144_1177056415.arc thread=1 sequence=144
archived log file name=/app/oracle/arch/oracle19_1_145_1177056415.arc thread=1 sequence=145
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/ORACLE19/system01.dbf'
 
media recovery complete, elapsed time: 00:00:00
Finished recover at 2025-02-23 13:26:59

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

 


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

1
2
3
4
5
6
7
SQL> alter database end backup;
 
Database altered.
 
SQL> alter database open noresetlogs;
 
Database altered.

 

 

데이터확인

1
2
3
4
5
6
7
SQL> conn imsi/imsi
SQL> select * from tab;
 
TNAME                TABTYPE        CLUSTERID
-------------------- ------------- ----------
SAMPLE_T             TABLE
SAMPLE_T2            TABLE

=====참고1=====

 

 

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

1
2
3
4
SQL> conn imsi/imsi
SQL> create table sample_t3 as select * from sample_t where rownum <= 100000;
 
Table created.

 

 

(이 시점 이후 ap 종료 또는 sql 등 변경 제한 조치 시행)

 

 

sourcedb에서 로그 스위치 수행

1
2
3
4
5
6
7
8
9
10
11
12
SQL> conn / as sysdba
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
SQL> /
 
System altered.

 

 

sourcedb 종료(sourcedb에 더이상 변경이 없음을 확인)

1
2
3
4
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

 

 

아카이브로그 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cd /app/oracle/arch
$ ls -al
total 118560
drwxr-xr-x.  2 oracle oinstall      4096 Feb 23 13:27 .
drwxrwxr-x. 10 oracle dba            124 Feb 22 16:17 ..
-rw-r-----.  1 oracle oinstall 100574720 Feb 23 13:23 oracle19_1_140_1177056415.arc
-rw-r-----.  1 oracle oinstall      1024 Feb 23 13:23 oracle19_1_141_1177056415.arc
-rw-r-----.  1 oracle oinstall    254976 Feb 23 13:23 oracle19_1_142_1177056415.arc
-rw-r-----.  1 oracle oinstall  10434048 Feb 23 13:25 oracle19_1_143_1177056415.arc
-rw-r-----.  1 oracle oinstall      1024 Feb 23 13:25 oracle19_1_144_1177056415.arc
-rw-r-----.  1 oracle oinstall      3584 Feb 23 13:25 oracle19_1_145_1177056415.arc
-rw-r-----.  1 oracle oinstall   9986560 Feb 23 13:27 oracle19_1_146_1177056415.arc
-rw-r-----.  1 oracle oinstall      1536 Feb 23 13:27 oracle19_1_147_1177056415.arc
-rw-r-----.  1 oracle oinstall      3072 Feb 23 13:27 oracle19_1_148_1177056415.arc

 

 

신규 아카이브로그 scp로 전송

1
2
3
4
5
$ scp ./*146* ./*147* ./*148* 192.168.137.101:/app/oracle/arch/
oracle@192.168.137.101's password:
oracle19_1_146_1177056415.arc                                  100% 9753KB 124.7MB/s   00:00
oracle19_1_147_1177056415.arc                                  100% 1536     1.8MB/s   00:00
oracle19_1_148_1177056415.arc                                  100% 3072     4.2MB/s   00:00

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ rman target /
RMAN> catalog start with '/app/oracle/arch/';
 
searching for all files that match the pattern /app/oracle/arch/
 
List of Files Unknown to the Database
=====================================
File Name: /app/oracle/arch/oracle19_1_146_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_147_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_148_1177056415.arc
 
Do you really want to catalog the above files (enter YES or NO)? yes <<-- [yes 입력]
cataloging files...
cataloging done
 
List of Cataloged Files
=======================
File Name: /app/oracle/arch/oracle19_1_146_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_147_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_148_1177056415.arc

핫백업 이후에 생성된 아카이브들이 정상적으로 targetdb에서 인식됨

 

 

인식한 아카이브로그 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
RMAN> list archivelog all;
 
List of Archived Log Copies for database with db_unique_name ORACLE19
=====================================================================
 
Key     Thrd Seq     S Low Time
------- ---- ------- - -------------------
130     1    140     A 2025-02-23 13:22:10
        Name: /app/oracle/arch/oracle19_1_140_1177056415.arc
 
131     1    141     A 2025-02-23 13:23:21
        Name: /app/oracle/arch/oracle19_1_141_1177056415.arc
 
132     1    142     A 2025-02-23 13:23:21
        Name: /app/oracle/arch/oracle19_1_142_1177056415.arc
 
133     1    143     A 2025-02-23 13:23:24
        Name: /app/oracle/arch/oracle19_1_143_1177056415.arc
 
134     1    144     A 2025-02-23 13:25:05
        Name: /app/oracle/arch/oracle19_1_144_1177056415.arc
 
135     1    145     A 2025-02-23 13:25:05
        Name: /app/oracle/arch/oracle19_1_145_1177056415.arc
 
136     1    146     A 2025-02-23 13:25:08
        Name: /app/oracle/arch/oracle19_1_146_1177056415.arc
 
137     1    147     A 2025-02-23 13:27:27
        Name: /app/oracle/arch/oracle19_1_147_1177056415.arc
 
138     1    148     A 2025-02-23 13:27:28
        Name: /app/oracle/arch/oracle19_1_148_1177056415.arc

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
RMAN> recover database until sequence 149;
 
Starting recover at 2025-02-23 13:28:58
using channel ORA_DISK_1
 
starting media recovery
 
archived log for thread 1 with sequence 146 is already on disk as file /app/oracle/arch/oracle19_1_146_1177056415.arc
archived log for thread 1 with sequence 147 is already on disk as file /app/oracle/arch/oracle19_1_147_1177056415.arc
archived log for thread 1 with sequence 148 is already on disk as file /app/oracle/arch/oracle19_1_148_1177056415.arc
archived log file name=/app/oracle/arch/oracle19_1_146_1177056415.arc thread=1 sequence=146
archived log file name=/app/oracle/arch/oracle19_1_147_1177056415.arc thread=1 sequence=147
archived log file name=/app/oracle/arch/oracle19_1_148_1177056415.arc thread=1 sequence=148
media recovery complete, elapsed time: 00:00:01
Finished recover at 2025-02-23 13:28:59

정상적으로 아카이브로그들이 db에 적용됨

*참고 : 만약 hotbackup 이후 추가된 데이터파일이 존재하는 경우 컨트롤파일은 모르지만, 아카이브 로그는 해당 내용을 알고있기 때문에 alter database create datafile 명령으로 빈 데이터파일을 만들어준뒤 아카이브 로그를 이용해 recover 해주면 됨

참고 : 오라클 19c rman 백업 이후 datafile이 추가된 경우 복구 상황 시나리오 ( https://positivemh.tistory.com/981 )

 

 

db 기동(noresetlogs)

1
2
3
RMAN> alter database open noresetlogs;
 
Statement processed

 

 

데이터 확인

1
2
3
4
5
6
7
8
SQL> conn imsi/imsi
SQL> select * from tab;
 
TNAME                TABTYPE        CLUSTERID
-------------------- ------------- ----------
SAMPLE_T             TABLE
SAMPLE_T2            TABLE
SAMPLE_T3            TABLE

테이블이 정상적으로 확인됨

 

 

테이블 건수 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> select count(*) from sample_t;
 
  COUNT(*)
----------
   1000000
 
SQL> select count(*) from sample_t2;
 
  COUNT(*)
----------
    100000
 
SQL> select count(*) from sample_t3;
 
  COUNT(*)
----------
    100000

테이블 데이터도 정상적으로 확인됨

 

 

=====참고2=====
targetdb에서 open한 이후부터는 더이상 sourcedb의 아카이브로그를 targetdb에 적용시킬 수 없음
만약 sourcedb에서 추가로 생성한 데이터를 targetdb에 적용하면 아래와 같이 아카이브가 적용되지않음
sourcedb에서 샘플 테이블4 추가 생성 및 데이터 삽입

1
2
3
4
SQL> conn imsi/imsi
SQL> create table sample_t4 as select * from sample_t where rownum <= 100000;
 
Table created.

 

 

sourcedb에서 로그 스위치 수행

1
2
3
4
5
6
7
8
9
10
11
12
SQL> conn / as sysdba
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
SQL> /
 
System altered.

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cd /app/oracle/arch
$ ls -al
total 132208
drwxr-xr-x.  2 oracle oinstall      4096 Feb 23 11:44 .
drwxrwxr-x. 10 oracle dba            124 Feb 26 16:17 ..
-rw-r-----.  1 oracle oinstall 50375680 Feb 23 12:45 oracle19_1_112_1177056415.arc
-rw-r-----.  1 oracle oinstall     1024 Feb 23 12:45 oracle19_1_113_1177056415.arc
-rw-r-----.  1 oracle oinstall   130048 Feb 23 12:45 oracle19_1_114_1177056415.arc
-rw-r-----.  1 oracle oinstall 10351616 Feb 23 12:47 oracle19_1_115_1177056415.arc
-rw-r-----.  1 oracle oinstall     1024 Feb 23 12:47 oracle19_1_116_1177056415.arc
-rw-r-----.  1 oracle oinstall     3072 Feb 23 12:47 oracle19_1_117_1177056415.arc
-rw-r-----.  1 oracle oinstall 10017792 Feb 23 12:49 oracle19_1_118_1177056415.arc
-rw-r-----.  1 oracle oinstall     1024 Feb 23 12:49 oracle19_1_119_1177056415.arc
-rw-r-----.  1 oracle oinstall     3072 Feb 23 12:49 oracle19_1_120_1177056415.arc
-rw-r-----.  1 oracle oinstall  9994240 Feb 23 12:56 oracle19_1_121_1177056415.arc
-rw-r-----.  1 oracle oinstall     1024 Feb 23 12:56 oracle19_1_122_1177056415.arc
-rw-r-----.  1 oracle oinstall     2560 Feb 23 12:56 oracle19_1_123_1177056415.arc
$ scp ./*121* ./*122* ./*123* 192.168.137.101:/app/oracle/arch/
oracle@192.168.137.101's password:
oracle19_1_121_1177056415.arc                                                 100% 9760KB 184.2MB/s   00:00
oracle19_1_122_1177056415.arc                                                 100% 1024   335.0KB/s   00:00
oracle19_1_123_1177056415.arc                                                 100% 2560     3.5MB/s   00:00

 

 

targetdb 종료 후 mount 기동

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
 
SQL> startup mount
ORACLE instance started.
 
Total System Global Area 1375731600 bytes
Fixed Size                  8896400 bytes
Variable Size             402653184 bytes
Database Buffers          956301312 bytes
Redo Buffers                7880704 bytes
Database mounted.

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ rman target /
RMAN> catalog start with '/app/oracle/arch/';
 
using target database control file instead of recovery catalog
searching for all files that match the pattern /app/oracle/arch/
 
List of Files Unknown to the Database
=====================================
File Name: /app/oracle/arch/oracle19_1_121_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_122_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_123_1177056415.arc
 
Do you really want to catalog the above files (enter YES or NO)? yes <<-- [yes 입력]
cataloging files...
cataloging done
 
List of Cataloged Files
=======================
File Name: /app/oracle/arch/oracle19_1_121_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_122_1177056415.arc
File Name: /app/oracle/arch/oracle19_1_123_1177056415.arc

아카이브로그들이 인식은 됨

 

 

targetdb에서 아카이브로그 파일을 이용해 recover

1
2
3
4
5
6
7
8
9
10
RMAN> recover database until sequence 124;
 
Starting recover at 2025-02-23 12:57:46
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=138 device type=DISK
 
starting media recovery
media recovery complete, elapsed time: 00:00:00
 
Finished recover at 2025-02-23 12:57:46

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

 

 

db 기동

1
2
3
RMAN> alter database open noresetlogs;
 
Statement processed

 

 

데이터 확인

1
2
3
4
5
6
7
8
SQL> conn imsi/imsi
SQL> select * from tab;
 
TNAME                TABTYPE        CLUSTERID
-------------------- ------------- ----------
SAMPLE_T             TABLE
SAMPLE_T2            TABLE
SAMPLE_T3            TABLE

신규로 생성한 테이블이 나오지 않음
=====참고2=====

 

 

결론 :
본문과 같이 adg나 동기화 솔루션을 사용하지 않고 핫백업 + 아카이브로그만을 활용하여 다운타임을 최소화하면서 db를 이관할 수 있음
targetdb는 sourcedb의 데이터변경이 더 일어나지 않는다는 확정을 받기 전까지는 계속 mount 상태로 있어야함, 이후 open 하면됨
하지만 한 번 open 상태가 되면 이후 추가된 데이터(아카이브 로그)는 반영할 수 없음
운영환경에서는 sourcedb에서 아카이브를 보내고 targetdb에서 recover 하는 작업을 쉘등을 이용해 자동화해서 사용하면 조금더 편함

 

 

참조 : 

https://docs.oracle.com/en/database/oracle/oracle-database/19/rcmrf/index.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/
https://docs.oracle.com/en/database/oracle/oracle-database/19/rcmrf/untilClause.html