프린트 하기 URL 복사

OS 환경 : Oracle Linux 9.6 (64bit)

 

DB 환경 : Oracle Database 19.28.0.0

 

방법 : 오라클 19c ADG Gap 발생시 rman duplicate 재수행 복구 시나리오

현재 오라클 19c Restart(ASM) to 싱글(FS) ADG가 구축되어 있는 상태임
참고 : 오라클 19c Restart(ASM) to 싱글(FS) ADG 구성 가이드 ( https://positivemh.tistory.com/1391 )
현재 상태에서 네트워크 장애를 발생시키고 강제로 아카이브를 유실시켜 gap을 만들고
이 장애를 해결하기 위해 rman duplicate를 재수행하는 시나리오를 테스트해봄

 

 

테스트
아카이브 갭 등 정상여부 확인

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
#Primary
SQL> 
set lines 200 pages 1000
select dest_id, db_unique_name, status, database_mode, recovery_mode, db_unique_name, gap_status 
from v$archive_dest_status 
where dest_id <=2 
order by 1,2;
 
   DEST_ID DB_UNIQUE_NAME                 STATUS    DATABASE_MODE   RECOVERY_MODE                      DB_UNIQUE_NAME                 GAP_STATUS
---------- ------------------------------ --------- --------------- ---------------------------------- ------------------------------ ------------------------
         1 oracle19                       VALID     OPEN            IDLE                               oracle19
         2 oracle19stb                    VALID     OPEN_READ-ONLY  MANAGED REAL TIME APPLY WITH QUERY oracle19stb                    NO GAP
 
#Standby
SQL> 
set lines 200 pages 1000
select dest_id, db_unique_name, status, database_mode, recovery_mode, db_unique_name, gap_status 
from v$archive_dest_status 
where dest_id <=2 
order by 1,2;
 
   DEST_ID DB_UNIQUE_NAME                 STATUS    DATABASE_MODE   RECOVERY_MODE                      DB_UNIQUE_NAME                 GAP_STATUS
---------- ------------------------------ --------- --------------- ---------------------------------- ------------------------------ ------------------------
         1 oracle19stb                    VALID     OPEN_READ-ONLY  MANAGED REAL TIME APPLY            oracle19stb
         2 oracle19                       VALID     UNKNOWN         IDLE                               oracle19

현재 adg는 정상적인 상태임

 

 

Standby db의 네트워크를 잠시 내려놓음(장애 발생 상황 가정)

1
2
3
4
5
6
7
8
9
10
# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.137.60  netmask 255.255.255.0  broadcast 192.168.137.255
        ether 00:50:56:a8:f1:2c  txqueuelen 1000  (Ethernet)
        RX packets 474857  bytes 8816967143 (8.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 162866  bytes 37564406 (35.8 MiB)
        TX errors 0  dropped 801 overruns 0  carrier 0  collisions 0
 
# nmcli connection down ens160

 

 

Primary에서 로그 스위치 수행

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

3회 수행함

 

 

Primary alert log에 아래와 같이 에러가 남음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ tail -300f /app/oracle/diag/rdbms/oracle19/oracle19/trace/alert_oracle19.log
2026-06-07T20:04:23.853966+09:00
Errors in file /app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_tt02_85677.trc:
ORA-16038: log 3 sequence# 60 cannot be archived
2026-06-07T20:04:23.854554+09:00
Errors in file /app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_tt02_85677.trc:
ORA-16038: log 3 sequence# 60 cannot be archived <<--!!
2026-06-07T20:06:26.472711+09:00
TMON (PID:44675): Process (PID:44782) hung on an I/O to LAD:2 after 270 seconds with threshold of 240 at [krsu.c:10195]
TMON (PID:44675): WARN: Terminating process hung on an operation (PID:44782)
2026-06-07T20:06:30.669332+09:00
TMON (PID:44675): Killing 1 processes (PIDS:44782) (Process by index) in order to remove hung processes. Requested by OS process 44675
2026-06-07T20:06:30.670125+09:00
Process termination requested for pid 44782 [source = rdbms], [info = 2] [request issued by pid: 44675, uid: 54321]
2026-06-07T20:06:32.710569+09:00
TT00 (PID:98288): Gap Manager starting

시퀀스 60을 아카이브하지 못했다고 나옴(Standby로 전송하지 못했다는 말로 보임)

 

 

Standby로 넘어가지 못한 아카이브 로그 제거 시도

1
2
3
4
5
6
7
8
9
10
11
RMAN> delete noprompt archivelog all;
delete noprompt archivelog all;
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=52 device type=DISK
RMAN-08137: warning: archived log not deleted, needed for standby or upstream capture process
archived log file name=+DATA/ORACLE19/ARCHIVELOG/2026_06_07/thread_1_seq_60.308.1235333037 thread=1 sequence=60
RMAN-08137: warning: archived log not deleted, needed for standby or upstream capture process
archived log file name=+DATA/ORACLE19/ARCHIVELOG/2026_06_07/thread_1_seq_61.307.1235333037 thread=1 sequence=61
RMAN-08137: warning: archived log not deleted, needed for standby or upstream capture process
archived log file name=+DATA/ORACLE19/ARCHIVELOG/2026_06_07/thread_1_seq_62.303.1235333043 thread=1 sequence=62

rman에서 제거하려니 실패함(오라클이 실수를 막아줌)

 

 

asmcmd에서 확인해도 아카이브로그가 안지워졌음

1
2
3
4
5
6
7
8
$ . oraenv
ORACLE_SID = [oracle19] ? +ASM
The Oracle base remains unchanged with value /app/oracle
 
ASMCMD [+data/oracle19/archivelog/2026_06_07] > ls
thread_1_seq_60.308.1235333037  <<-- !! 제거 예정
thread_1_seq_61.307.1235333037
thread_1_seq_62.303.1235333043

 

 

테스트를 위해 시퀀스 60 아카이브 로그 수동으로 삭제

1
2
3
4
ASMCMD [+data/oracle19/archivelog/2026_06_07] > rm thread_1_seq_60.308.1235333037
ASMCMD [+data/oracle19/archivelog/2026_06_07] > ls
thread_1_seq_61.307.1235333037
thread_1_seq_62.303.1235333043

시퀀스 60을 지움

 

 

현재 상황
Primary에서 아카이브로그 시퀀스 60부터 62까지가 생성되었고
여기서 시퀀스 60을 지워버린 상태
Standby 네트워크를 정상화 시켜도 아카이브로그는 순차적으로 적용해야하기 때문에
시퀀스 60이 없어서 시퀀스 61, 62를 Standby에 적용할수가 없음

 

 

Standby 네트워크 정상화

1
2
3
4
5
6
7
8
9
10
# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.137.60  netmask 255.255.255.0  broadcast 192.168.137.255
        ether 00:50:56:a8:f1:2c  txqueuelen 1000  (Ethernet)
        RX packets 474857  bytes 8816967143 (8.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 162866  bytes 37564406 (35.8 MiB)
        TX errors 0  dropped 801 overruns 0  carrier 0  collisions 0
 
# nmcli connection up ens160

 

 

Standby mrp 프로세스 재시작

1
2
3
4
5
6
7
SQL> alter database recover managed standby database cancel;
 
Database altered.
 
SQL> alter database recover managed standby database disconnect from session;
 
Database altered.

 

 

아카이브 갭 확인

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
#Primary
SQL> 
set lines 200 pages 1000
select dest_id, db_unique_name, status, database_mode, recovery_mode, db_unique_name, gap_status 
from v$archive_dest_status 
where dest_id <=2 
order by 1,2;
 
   DEST_ID DB_UNIQUE_NAME                 STATUS    DATABASE_MODE   RECOVERY_MODE                      DB_UNIQUE_NAME                 GAP_STATUS
---------- ------------------------------ --------- --------------- ---------------------------------- ------------------------------ ------------------------
         1 oracle19                       VALID     OPEN            IDLE                               oracle19
         2 oracle19stb                    VALID     OPEN_READ-ONLY  MANAGED REAL TIME APPLY WITH QUERY oracle19stb                    UNRESOLVABLE GAP  <<--!!
 
#Standby
SQL> 
set lines 200 pages 1000
select dest_id, db_unique_name, status, database_mode, recovery_mode, db_unique_name, gap_status 
from v$archive_dest_status 
where dest_id <=2 
order by 1,2;
 
   DEST_ID DB_UNIQUE_NAME                 STATUS    DATABASE_MODE   RECOVERY_MODE                      DB_UNIQUE_NAME                 GAP_STATUS
---------- ------------------------------ --------- --------------- ---------------------------------- ------------------------------ ------------------------
         1 oracle19stb                    VALID     OPEN_READ-ONLY  MANAGED REAL TIME APPLY            oracle19stb
         2 oracle19                       VALID     UNKNOWN         IDLE                               oracle19

Primary에서 Standby db 상태(STATUS)를 보면 처음에 ERROR 였다가 지금은 VALID로 변경되었음
하지만 여전히 GAP_STATUS는 UNRESOLVABLE GAP임

 

 

Standby에서 아카이브 갭 시퀀스 확인

1
2
3
4
5
SQL> select * from v$archive_gap;
 
   THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#     CON_ID
---------- ------------- -------------- ----------
         1            60             60          1

시퀀스 60번이 필요한 상태임

 

 

Standby에서 마지막으로 적용한 아카이브로그 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL>
select thread#, sequence#, first_change#, next_change#, applied 
from v$archived_log 
where applied = 'YES' 
order by sequence# desc;
 
   THREAD#  SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# APPLIED
---------- ---------- ------------- ------------ ---------
         1         59       1327468      1327670 YES
         1         58       1327243      1327468 YES
         1         57       1327023      1327243 YES
         1         56       1326807      1327023 YES
         1         55       1326591      1326807 YES
         1         54       1326375      1326591 YES
         1         53       1326157      1326375 YES
         1         52       1325916      1326157 YES
         1         51       1325706      1325916 YES
         1         50       1325486      1325706 YES
         1         49       1325253      1325486 YES
         1         48       1325039      1325253 YES
         1         47       1324821      1325039 YES
..

59번까지 적용되어 있음

 

 

Primary alert log에 아래와 같이 에러가 남음

1
2
3
4
5
6
7
8
9
10
11
$ tail -300f /app/oracle/diag/rdbms/oracle19/oracle19/trace/alert_oracle19.log
2026-06-07T20:18:42.206843+09:00
Thread 1 advanced to log sequence 64 (LGWR switch),  current SCN: 1331051
  Current log# 1 seq# 64 mem# 0: +DATA/ORACLE19/ONLINELOG/group_1.258.1235315217
2026-06-07T20:18:42.889785+09:00
ARC0 (PID:44780): Archived Log entry 90 added for B-1220456354.T-1.S-63 LOS:0x0000000000144a38 NXS:0x0000000000144f6b NAB:104278 ID 0xcb94dc22 LAD:1
2026-06-07T20:19:39.651320+09:00
Errors in file /app/oracle/diag/rdbms/oracle19/oracle19/trace/oracle19_tt00_98288.trc:
ORA-00308: cannot open archived log '+DATA/ORACLE19/ARCHIVELOG/2026_06_07/thread_1_seq_60.308.1235333037'
ORA-17503: ksfdopn:2 Failed to open file +DATA/ORACLE19/ARCHIVELOG/2026_06_07/thread_1_seq_60.308.1235333037
ORA-15012: ASM file '+DATA/ORACLE19/ARCHIVELOG/2026_06_07/thread_1_seq_60.308.1235333037' does not exist

 

 

해결
아카이브로그 백업이 있다면 해당 아카이브를 적용하면 아래 명령으로 적용하면되지만

1
SQL> alter database register logfile '/tmp/arch_stb/아카이브로그파일명.arc';

 

 

현재는 아카이브로그 백업이 없기 때문에 rman duplicate를 재수행해봄

 

 

Standby DB 종료 및 nomount 기동

1
2
SQL> shutdown immediate
SQL> startup nomount

 

 

Primary 서버에서 rman 접속

1
2
3
4
5
6
7
8
9
10
11
$ rman target sys/oracle@oracle19 auxiliary sys/oracle@oracle19stb
 
Recovery Manager: Release 19.0.0.0.0 - Production on Sun Jun 7 16:20:36 2026
Version 19.28.0.0.0
 
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
 
connected to target database: ORACLE19 (DBID=3400652514)
connected to auxiliary database: ORACLE19 (not mounted)
 
RMAN>

접속됨

 

 

duplicate 명령으로 복제

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
RMAN> duplicate target database for standby from active database dorecover;
duplicate target database for standby from active database;
Starting Duplicate Db at 2026-06-07 20:31:21
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=21 device type=DISK
 
contents of Memory Script:
{
   backup as copy reuse
   passwordfile auxiliary format  '/app/oracle/product/19c/dbs/orapworacle19stb'   ;
}
executing Memory Script
 
Starting backup at 2026-06-07 20:31:22
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=50 device type=DISK
Finished backup at 2026-06-07 20:31:26
 
contents of Memory Script:
{
   restore clone from service  'oracle19' standby controlfile;
}
executing Memory Script
 
Starting restore at 2026-06-07 20:31:26
using channel ORA_AUX_DISK_1
 
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service oracle19
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/app/oracle/oradata/oracle19stb/control01.ctl
Finished restore at 2026-06-07 20:31:30
 
contents of Memory Script:
{
   sql clone 'alter database mount standby database';
}
executing Memory Script
 
sql statement: alter database mount standby database
 
contents of Memory Script:
{
   set newname for tempfile  1 to
 "/app/oracle/oradata/oracle19stb/temp.264.1220456361";
   switch clone tempfile all;
   set newname for datafile  1 to
 "/app/oracle/oradata/oracle19stb/system.261.1220456359";
   set newname for datafile  2 to
 "/app/oracle/oradata/oracle19stb/sysaux.262.1220456361";
   set newname for datafile  3 to
 "/app/oracle/oradata/oracle19stb/undotbs1.263.1220456361";
   set newname for datafile  4 to
 "/app/oracle/oradata/oracle19stb/users.265.1220456367";
   restore
   from  nonsparse   from service
 'oracle19'   clone database
   ;
   sql 'alter system archive log current';
}
executing Memory Script
 
executing command: SET NEWNAME
 
renamed tempfile 1 to /app/oracle/oradata/oracle19stb/temp.264.1220456361 in control file
 
executing command: SET NEWNAME
 
executing command: SET NEWNAME
 
executing command: SET NEWNAME
 
executing command: SET NEWNAME
 
Starting restore at 2026-06-07 20:31:35
using channel ORA_AUX_DISK_1
 
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service oracle19
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /app/oracle/oradata/oracle19stb/system.261.1220456359
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:01:55
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service oracle19
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00002 to /app/oracle/oradata/oracle19stb/sysaux.262.1220456361
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service oracle19
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00003 to /app/oracle/oradata/oracle19stb/undotbs1.263.1220456361
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service oracle19
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00004 to /app/oracle/oradata/oracle19stb/users.265.1220456367
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
Finished restore at 2026-06-07 20:33:50
 
sql statement: alter system archive log current
 
contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script
 
datafile 1 switched to datafile copy
input datafile copy RECID=1 STAMP=1235332888 file name=/app/oracle/oradata/oracle19stb/system.261.1220456359
datafile 2 switched to datafile copy
input datafile copy RECID=2 STAMP=1235332888 file name=/app/oracle/oradata/oracle19stb/sysaux.262.1220456361
datafile 3 switched to datafile copy
input datafile copy RECID=3 STAMP=1235332888 file name=/app/oracle/oradata/oracle19stb/undotbs1.263.1220456361
datafile 4 switched to datafile copy
input datafile copy RECID=4 STAMP=1235332888 file name=/app/oracle/oradata/oracle19stb/users.265.1220456367
Finished Duplicate Db at 2026-06-07 20:33:56

커맨드에 dorecover를 붙여주면 duplicate가 오래 걸려도 그사이 생긴 아카이브로그도 Standby에 적용해줌

 

 

참고로 병렬 채널 할당도 가능함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
RMAN>
RUN {
    # 1. Target(Primary) 채널 4개 할당 (ASM 디스크 Read 담당)
    ALLOCATE CHANNEL p1 DEVICE TYPE DISK;
    ALLOCATE CHANNEL p2 DEVICE TYPE DISK;
    ALLOCATE CHANNEL p3 DEVICE TYPE DISK;
    ALLOCATE CHANNEL p4 DEVICE TYPE DISK;
 
    # 2. Auxiliary(Standby) 채널 4개 할당 (FS 디스크 Write 담당)
    ALLOCATE AUXILIARY CHANNEL s1 DEVICE TYPE DISK;
    ALLOCATE AUXILIARY CHANNEL s2 DEVICE TYPE DISK;
    ALLOCATE AUXILIARY CHANNEL s3 DEVICE TYPE DISK;
    ALLOCATE AUXILIARY CHANNEL s4 DEVICE TYPE DISK;
 
    # 3. Duplicate 명령 수행 (DORECOVER 포함)
    DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE
    DORECOVER;
}

 

 

db role 및 상태 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
#Primary
SQL> select database_role, open_mode, (select status from v$instance) status from v$database;
 
DATABASE_ROLE    OPEN_MODE            STATUS
---------------- -------------------- ------------
PRIMARY          READ WRITE           OPEN
 
#Standby
SQL> select database_role, open_mode (select status from v$instance) status from v$database;
 
DATABASE_ROLE    OPEN_MODE            STATUS
---------------- -------------------- ------------
PHYSICAL STANDBY MOUNTED              MOUNTED

Standby가 mount로 기동됨

 

 

Standby db read only로 기동

1
2
3
SQL> alter database open read only;
 
Database altered.

 

 

Standby에서 MRP 프로세스(Managed Recovery Process)를 기동

1
2
3
SQL> alter database recover managed standby database disconnect from session;
 
Database altered.

 

 

Primary에서 로그 스위치 수행

1
2
3
SQL> alter system switch logfile;
 
System altered.

 

 

alert log 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Primary
$ tail -300f /app/oracle/diag/rdbms/oracle19/oracle19/trace/alert_oracle19.log
2026-06-07T20:36:16.487709+09:00
Thread 1 advanced to log sequence 66 (LGWR switch),  current SCN: 1332365
  Current log# 3 seq# 66 mem# 0: +DATA/ORACLE19/ONLINELOG/group_3.260.1235315267
2026-06-07T20:36:16.592451+09:00
ARC3 (PID:44792): Archived Log entry 96 added for B-1220456354.T-1.S-65 LOS:0x00000000001453c1 NXS:0x000000000014548d NAB:16659 ID 0xcb94dc22 LAD:1
 
#Standby
$ tail -300f /app/oracle/diag/rdbms/oracle19stb/oracle19stb/trace/alert_oracle19stb.log
2026-06-07T20:03:54.232185+09:00
 rfs (PID:53142): krsr_rfs_atc: Identified database type as 'PHYSICAL': Client is ASYNC (PID:85677)
2026-06-07T20:03:54.238631+09:00
 rfs (PID:53142): Selected LNO:4 for T-1.S-66 dbid 3400652514 branch 1220456354
2026-06-07T20:03:54.965536+09:00
PR00 (PID:52942): Media Recovery Log /app/oracle/arch/1_65_1220456354.arc
PR00 (PID:52942): Media Recovery Waiting for T-1.S-66 (in transit)
2026-06-07T20:03:55.047052+09:00
Recovery of Online Redo Log: Thread 1 Group 4 Seq 66 Reading mem 0
  Mem# 0: /app/oracle/oradata/oracle19stb/group_4.284.1235315377

정상적으로 아카이브가 Standby에도 적용됨

 

 

아카이브 갭 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Primary
SQL> 
set lines 200 pages 1000
select dest_id, db_unique_name, status, database_mode, recovery_mode, db_unique_name, gap_status 
from v$archive_dest_status 
where dest_id <=2 
order by 1,2;
 
   DEST_ID DB_UNIQUE_NAME                 STATUS    DATABASE_MODE   RECOVERY_MODE                      DB_UNIQUE_NAME                 GAP_STATUS
---------- ------------------------------ --------- --------------- ---------------------------------- ------------------------------ ------------------------
         1 oracle19                       VALID     OPEN            IDLE                               oracle19
         2 oracle19stb                    VALID     OPEN_READ-ONLY  MANAGED REAL TIME APPLY WITH QUERY oracle19stb                    NO GAP  <<--!!
 
#Standby
SQL> 
select dest_id, db_unique_name, status, database_mode, recovery_mode, db_unique_name, gap_status 
from v$archive_dest_status 
where dest_id <=2 
order by 1,2;
 
   DEST_ID DB_UNIQUE_NAME                 STATUS    DATABASE_MODE   RECOVERY_MODE                      DB_UNIQUE_NAME                 GAP_STATUS
---------- ------------------------------ --------- --------------- ---------------------------------- ------------------------------ ------------------------
         1 oracle19stb                    VALID     OPEN_READ-ONLY  MANAGED REAL TIME APPLY            oracle19stb
         2 oracle19                       VALID     UNKNOWN         IDLE                               oracle19

GAP_STATUS가 UNRESOLVABLE GAP에서 NO GAP로 변경됨

 

 

Standby에서 아카이브 갭 시퀀스 확인

1
2
3
SQL> select * from v$archive_gap;
 
no rows selected

no rows로 표시됨

 

 

Standby에서 마지막으로 적용한 아카이브로그 확인

1
2
3
4
5
6
7
8
9
10
SQL>
select thread#, sequence#, first_change#, next_change#, applied 
from v$archived_log 
where applied = 'YES' 
order by sequence# desc;
 
   THREAD#  SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# APPLIED
---------- ---------- ------------- ------------ ---------
         1         65       1332161      1332365 YES
         1         64       1331051      1332161 YES

정상적으로 65번 시퀀스까지 아카이브를 적용함

 

 

66번 시퀀스는 현재 Standby에서 ACTIVE redo임

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> 
set lines 200
set pages 1000
col member for a60
select thread#, l.group#, member, archived, l.status, (bytes/1024/1024) MB, sequence#
from v$standby_log l, v$logfile f
where f.group# = l.group#
order by 1, 2;
 
   THREAD#     GROUP# MEMBER                                                       ARC STATUS             MB  SEQUENCE#
---------- ---------- ------------------------------------------------------------ --- ---------- ---------- ----------
         0          5 /app/oracle/oradata/oracle19stb/group_5.285.1235315381       YES UNASSIGNED        200          0
         0          6 /app/oracle/oradata/oracle19stb/group_6.286.1235315381       YES UNASSIGNED        200          0
         1          4 /app/oracle/oradata/oracle19stb/group_4.284.1235315377       YES ACTIVE            200         66  <<-- !!

 

 

결론 :
adg 환경에서 gap이 너무 많이 생기거나 아카이브로그가 유실된 경우 본문과 같은 방식으로
rman duplicate를 재수행 해주어서 정상화시킬 수 있음

 

 

참조 : 

Oracle Linux 8.4에 Oracle 19c ADG 설치 가이드_Part 1 ( https://positivemh.tistory.com/819 )
Oracle Linux 8.4에 Oracle 19c RAC to RAC ADG 설치 가이드_Part 1 ( https://positivemh.tistory.com/824 )

오라클 19c Restart(ASM) to 싱글(FS) ADG 구성 가이드 ( https://positivemh.tistory.com/1391 )

https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-guard-role-transitions.html#GUID-AAD70601-D248-4309-B8DD-F461EE31A5FF
https://docs.oracle.com/en/database/oracle/oracle-database/19/spmss/switchover-to-a-physical-db.html#GUID-AAD70601-D248-4309-B8DD-F461EE31A5FF