Oracle® 데이터베이스를 아카이브하면 데이터를 장기간 보관하고 저장할 수 있습니다. 하지만 아카이브 저장 공간이 가득 차면 어떻게 될까요?
개요
아카이브 경로(archive destination)가 꽉 차면 Oracle 데이터베이스가 멈추거나(hang) 정지 상태에 빠질 수 있으며, 다음과 같은 오류가 발생할 수 있습니다.
- ORA-00257: 아카이버 오류(Archiver error), 공간이 확보될 때까지 internal로만 접속 가능
- ORA-16014: 로그 2 시퀀스# 1934가 아카이브되지 않음, 사용 가능한 대상 없음
이런 상황에 대비하려면 원래의 아카이브 경로에 장애가 발생했을 때 사용할 대체 아카이브 경로(alternate archive destination)를 미리 구성해 두어야 합니다. 대체 아카이브 경로는 기본(primary) 아카이브 경로에서 디스크 공간 부족, 하드웨어 오류 등 어떤 장애가 발생하더라도 활용할 수 있습니다.
그럼 간단한 데모를 통해 실제 동작 방식을 살펴보겠습니다.
데모 1단계: 기본 아카이브 경로 확인
먼저 기본 아카이브 경로를 /u03/primary_dest 위치로 설정합니다. 이 경로는 현재 사용률이 99%입니다. 테스트 목적이라면 누구나 동일하게 따라 해볼 수 있습니다.
다음 명령을 실행합니다:
SQL> select version from v$instance;
VERSION
-----------------
12.1.0.2.0
SQL> select DEST_NAME,TARGET,DESTINATION,VALID_ROLE,STATUS
from v$archive_dest where status!='INACTIVE';
DEST_NAME TARGET DESTINATION VALID_ROLE STATUS
--------------------- ---------- -------------------- ------------ ---------
LOG_ARCHIVE_DEST_1 PRIMARY /u03/primary_dest ALL_ROLES VALID
데모 2단계: 대체 아카이브 경로 추가
이제 기본 경로를 사용할 수 없을 때 시스템이 활용할 수 있는 대체 아카이브 경로 /u04/alternate_dest를 추가합니다.
SQL> !df -h /u04/alternate_dest
Filesystem Size Used Avail Use% Mounted on
/dev/ddg2 1004M 18M
936M 2% /u04
SQL> alter system set log_archive_dest_2='LOCATION=/u04/alternate_dest' scope=both;
System altered.
SQL> alter system set log_archive_dest_state_2=ALTERNATE scope=both;
System altered.
SQL> select DEST_NAME,TARGET,DESTINATION,VALID_ROLE,STATUS,ALTERNATE from v$archive_dest where status!='INACTIVE';
DEST_NAME TARGET DESTINATION VALID_ROLE STATUS ALTERNATE
------------------- ----------- ------------------- ------------ ----------- ---------
LOG_ARCHIVE_DEST_1 PRIMARY /u03/primary_dest ALL_ROLES VALID NONE
LOG_ARCHIVE_DEST_2 PRIMARY /u04/alternate_dest ALL_ROLES ALTERNATE NONE
데모 3단계: 기본 경로와 대체 경로 연결
기본 아카이브 경로와 대체 아카이브 경로를 서로 연결하면, 기본 위치의 사용률이 100%에 도달했을 때 Oracle이 자동으로 대체 아카이브 위치로 장애 조치(failover)할 수 있습니다.
다만 주의할 점이 있습니다. Oracle은 기본 경로가 다시 사용 가능해진 후 자동으로 되돌아오는 페일백(failback)을 수행하지 않습니다. 페일백이 동작하도록 하려면 대체 아카이브 경로인 LOG_ARCHIVE_DEST_2의 ALTERNATE 속성으로 기본 아카이브 경로 LOG_ARCHIVE_DEST_1을 지정해야 합니다. 다음 예시를 참고하세요:
SQL> alter system set log_archive_dest_2='LOCATION=/u04/alternate_dest
NOREOPEN ALTERNATE=LOG_ARCHIVE_DEST_1' scope=both;
System altered.
SQL> alter system set log_archive_dest_1='LOCATION=/u03/primary_dest
NOREOPEN ALTERNATE=LOG_ARCHIVE_DEST_2' scope=both;
System altered.
SQL> select DEST_NAME,TARGET,DESTINATION,VALID_ROLE,STATUS,ALTERNATE
from v$archive_dest where status!='INACTIVE';
DEST_NAME TARGET DESTINATION VALID_ROLE STATUS ALTERNATE
-------------------- ----------- -------------------- ------------ ---------- ------------------
LOG_ARCHIVE_DEST_1 PRIMARY /u03/primary_dest ALL_ROLES VALID LOG_ARCHIVE_DEST_2
LOG_ARCHIVE_DEST_2 PRIMARY /u04/alternate_dest ALL_ROLES ALTERNATE LOG_ARCHIVE_DEST_1
위 결과에서 아카이브 경로 1번과 2번이 서로 연결된 것을 확인할 수 있습니다. 이제 기본 경로에 여유 공간이 생기면 Oracle이 다시 기본 경로로 페일백할 수 있게 됩니다.
데모 4단계: 장애 조치 발생 확인
다음으로 DML 작업을 수행하여 아카이브 경로의 사용률을 100%까지 올렸습니다. 그 결과 다음과 같은 출력이 나타났습니다:
Thread 1 is advanced to log sequence 20 (LGWR switch)
Current log# 2 seq# 20 mem# 0: /u01/app/oracle/oradata/MODI/redo02.log
2020-12-05T04:44:29.216275+05:30
ARC0: Encountered disk I/O error 19502
2020-12-05T04:44:29.216575+05:30
ARC0: Closing local archive destination LOG_ARCHIVE_DEST_1 '/u03/primary_dest/1_19_1058325294.dbf' (error 19502) (MODI)
2020-12-05T04:44:29.217417+05:30
Errors in file /u01/app/oracle/diag/rdbms/modi/MODI/trace/MODI_arc0_23015.trc:
ORA-27072: File I/O error
Additional information: 4
Additional information: 350208
Additional information: 446464
ORA-19502: write error on file "/u03/primary_dest/1_19_1058325294.dbf", block number 350208 (block size=512)
2020-12-05T04:44:32.583182+05:30
MODIP(3):Resize operation completed for file# 11, old size 1172480K, new size 1182720K
2020-12-05T04:44:33.183355+05:30
Errors in file /u01/app/oracle/diag/rdbms/modi/MODI/trace/MODI_arc0_23015.trc:
ORA-19502: write error on file "/u03/primary_dest/1_19_1058325294.dbf", block number 350208 (block size=512)
ORA-27072: File I/O error
Additional information: 4
Additional information: 350208
Additional information: 446464
ORA-19502: write error on file "/u03/primary_dest/1_19_1058325294.dbf", block number 350208 (block size=512)
5단계: 자동 페일백 확인
Oracle은 항상 기본 아카이브 경로로 아카이브를 시도하며, 12c 버전부터는 기본 경로로의 자동 페일백이 지원됩니다. 기본 경로의 공간을 정리하여 다시 아카이브가 가능한 상태로 만들면, Oracle은 alert 로그 파일에 별도의 오류나 페일백 메시지를 남기지 않은 채 계속해서 리두 로그(redo log)를 기본 경로에 아카이브합니다. 다음은 v$archived_log 뷰를 조회한 예시입니다:
SQL> select thread#,sequence#,name from v$archive_log;
THREAD# SEQUENCE# NAME
-------- ---------- -----------------------------------------------
1 2 /u03/primary_dest/1_2_1058325294.dbf
1 3 /u03/primary_dest/1_3_1058325294.dbf
1 4 /u03/primary_dest/1_4_1058325294.dbf
1 5 /u03/primary_dest/1_5_1058325294.dbf
1 6 /u04/alternate_dest/1_6_1058325294.dbf
1 7 /u04/alternate_dest/1_7_1058325294.dbf
1 8 /u04/alternate_dest/1_8_1058325294.dbf
1 9 /u04/alternate_dest/1_9_1058325294.dbf
1 10 /u04/alternate_dest/1_10_1058325294.dbf
1 11 /u04/alternate_dest/1_11_1058325294.dbf
1 12 /u04/alternate_dest/1_12_1058325294.dbf
1 13 /u04/alternate_dest/1_13_1058325294.dbf
1 14 /u04/alternate_dest/1_14_1058325294.dbf
1 15 /u04/alternate_dest/1_15_1058325294.dbf
1 16 /u04/alternate_dest/1_16_1058325294.dbf
1 17 /u04/alternate_dest/1_17_1058325294.dbf
1 18 /u04/alternate_dest/1_18_1058325294.dbf
1 19 /u04/alternate_dest/1_19_1058325294.dbf
1 20 /u04/alternate_dest/1_20_1058325294.dbf
1 21 /u04/alternate_dest/1_21_1058325294.dbf
1 22 /u04/alternate_dest/1_22_1058325294.dbf
1 23 /u04/alternate_dest/1_23_1058325294.dbf
1 24 /u04/alternate_dest/1_24_1058325294.dbf
1 25 /u04/alternate_dest/1_25_1058325294.dbf
1 26 /u04/alternate_dest/1_26_1058325294.dbf
1 27 /u04/alternate_dest/1_27_1058325294.dbf
1 28 /u04/alternate_dest/1_28_1058325294.dbf
1 29 /u03/primary_dest/1_29_1058325294.dbf
1 30 /u03/primary_dest/1_30_1058325294.dbf
1 31 /u03/primary_dest/1_31_1058325294.dbf
1 32 /u03/primary_dest/1_32_1058325294.dbf
31 rows selected.
위 결과를 보면 시퀀스 6~28번의 로그는 대체 경로(/u04/alternate_dest)에 아카이브되었고, 기본 경로의 공간이 확보된 이후에는 시퀀스 29번부터 다시 기본 경로(/u03/primary_dest)에 아카이브된 것을 확인할 수 있습니다.
결론
Oracle은 기본 아카이브 경로와 대체 아카이브 경로 간의 전환을 자동으로 관리하는 기능에서 큰 발전을 이루었습니다. 이 글의 데모를 참고하면 이 기능을 충분히 활용할 수 있을 것입니다.
대체 아카이브 경로를 구성해 두면 장애 상황에서 큰 도움이 됩니다. 다만 한 가지 유의할 점은, 기본 아카이브 경로가 다시 준비될 때까지 Oracle이 alert 로그 파일에 기본 경로 장애 관련 오류 메시지를 간헐적으로 기록한다는 사실입니다.
데이터 서비스에 대해 더 자세히 알아보세요.
피드백 탭을 통해 의견을 남기거나 질문을 보내실 수 있으며, 언제든지 저희와 대화를 시작하실 수 있습니다.