카테고리 없음

[오라클] 리두 로그 파일과 아카이브 로그 파일 개념 및 실습

Dong538 2021. 12. 1. 10:16

데이터베이스의 가장 큰 특징은 백업과 복구이다. 백업/복구 아키텍처를 구성하기 위해 별도 관리 항목을 만든 것이 바로 리두 로그 파일과 아카이브 로그 파일이다. 

 

리두 로그 버퍼: SGA의 구성 요소이며 메모리 영역이다(not disk). 데이터베이스 장애 시 복구 수행을 하기 위해 모든 DML 로그를 기록한다. 

리두 로그 버퍼의 구조: Physiological 로깅.
  1. Logical 로깅: 작업에 대한 명세서 기록
  2. Physical 로깅: 변경된 블록에 대한 이전/이후 이미지를 모두 저장
  3. Physiological 로깅: 변경된 데이터에 대해 이전/이후 이미지를 저장하고 명세서도 작성함. Physiological 로깅의 특징은, 로그 양은 나머지 둘의 중간 정도이고, 복구 시 완벽하고, 성능은 Physical 로깅보다 빠르다. 

Write-Ahead 로깅: 로그를 기록하는 작업을 먼저 수행한다. DML을 수행할 때, 작업 전 데이터의 변경에 대한 내용을 리두 로그 버퍼에 미리 저장한다. 여기에는 Logical buffer ahead, log file ahead 두 가지 종류의 Write-ahead 로깅이 존재한다. 로지컬 버퍼 어헤드는 실제 블록 변경 전 리두 로그를 리두 로그 버퍼에 먼저 기록한다. 로그 파일 어헤드는 DBWR이 블록을 데이터 파일에 ㅣ록하기 전 LGWR이 리두 로그 버퍼의 리두 로그를 리두 로그 파일에 기록한다 .  

 

리두 로그 파일: 메모리 자원은 한정되어 있으므로 로그 버퍼 공간은 재사용된다. 이 때문에 LGWR 백그라운드 프로세스가 로그 버퍼의 내용을 디스크 영역의 리두 로그 "파일"에 기록한다. 

CURRENT 리두 로그 그룹: 리두 로그 멤버가 곧 리두 로그 파일이다. 그룹 내 모든 멤버는 동일한 리두 로그 버퍼 내용을 가진다. 
리두 로그 그룹이란 이러한 멤버들의 집합이다. 동일 그룹이면 저장된 리두 로그 버퍼 내용도 같다. 
생성 가능한 리두 로그 그룹 및 멤버 개수는 MAXLOGMEMBERS, MAXLOGFILES옵션에서 조절할 수 있다. 
리두 로그 그룹 여러 개일때 현재 LGWR가 기록 중인 리두 로그 그룹을 CURRENT 리두 로그 그룹이다.

 

리두 로그 파일에는 최소 요구 조건이 있고, 이를 만족하지 않을 때는 오라클이 오픈되지 않거나 장애가 발생한다. 여기서 말한 조건이란, 1) 최소한 두 개의 리두 로그 그룹; 2) 각 그룹은 한 개 이상의 멤버; 3) 리두 로그 그룹은 순환 구조일 것; 4) 리두 로그 그룹은 로그 시퀀스 번호를 가지고, 로그 스위치 발생할 때마다 번호 1씩 증가할 것; 

 

- 리두 로그 파일 장애: 리두 로그 파일에 발생 가능한 장애 유형은 다음과 같다:
1. 사용자 실수로 리두 로그 파일 삭제
2. 디스크 장애로 리두 로그 파일 손상 
오라클은 위와 같은 이유로 장애 발생 시 비정상 종료되고 복구하기 전에 데이터베이스 기동할 수 없다. 


- 리두 로그 파일 확인

SQL> SELECT * FROM V$LOG;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
           FIRST_CHANGE# FIRST_TI NEXT_CHANGE# NEXT_TIM     CON_ID
---------------- ------------- -------- ------------ -------- ----------
         1          1         10  209715200        512          1 NO
CURRENT                2505739 21/10/27   1.8447E+19                   0

         2          1          8  209715200        512          1 NO
INACTIVE               2230816 21/09/29      2355976 21/10/20          0

         3          1          9  209715200        512          1 NO
INACTIVE               2355976 21/10/20      2505739 21/10/27          0



SQL> SELECT * FROM V$LOGFILE;

    GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_     CON_ID
--- ----------
         3         ONLINE
/u01/app/oracle/oradata/ORCL/redo03.log
NO           0

         2         ONLINE
/u01/app/oracle/oradata/ORCL/redo02.log
NO           0

    GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_     CON_ID
--- ----------

         1         ONLINE
/u01/app/oracle/oradata/ORCL/redo01.log
NO           0



SQL> SELECT * FROM V$LOG_HISTORY;

     RECID      STAMP    THREAD#  SEQUENCE# FIRST_CHANGE# FIRST_TI NEXT_CHANGE#
---------- ---------- ---------- ---------- ------------- -------- ------------
RESETLOGS_CHANGE# RESETLOG     CON_ID
----------------- -------- ----------
         1 1084123218          1          1       1920977 21/09/24      1955401
          1920977 21/09/24          0

         2 1084123404          1          2       1955401 21/09/24      1960965
          1920977 21/09/24          0

         3 1084123440          1          3       1960965 21/09/24      1971905
          1920977 21/09/24          0


     RECID      STAMP    THREAD#  SEQUENCE# FIRST_CHANGE# FIRST_TI NEXT_CHANGE#
---------- ---------- ---------- ---------- ------------- -------- ------------
RESETLOGS_CHANGE# RESETLOG     CON_ID
----------------- -------- ----------
         4 1084123715          1          4       1971905 21/09/24      2016769
          1920977 21/09/24          0

         5 1084123913          1          5       2016769 21/09/24      2100378
          1920977 21/09/24          0

         6 1084124150          1          6       2100378 21/09/24      2129562
          1920977 21/09/24          0


     RECID      STAMP    THREAD#  SEQUENCE# FIRST_CHANGE# FIRST_TI NEXT_CHANGE#
---------- ---------- ---------- ---------- ------------- -------- ------------
RESETLOGS_CHANGE# RESETLOG     CON_ID
----------------- -------- ----------
         7 1084550941          1          7       2129562 21/09/24      2230816
          1920977 21/09/24          0

         8 1086443402          1          8       2230816 21/09/29      2355976
          1920977 21/09/24          0

         9 1087051459          1          9       2355976 21/10/20      2505739
          1920977 21/09/24          0


9 rows selected.

SQL> SELECT TO_CHAR(FIRST_TIME, 'YYYY-MM-DD') "DATE", COUNT(*)
  2  FROM V$LOG_HISTORY
  3  GROUP BY TO_CHAR(FIRST_TIME, 'YYYY-MM-DD');

DATE         COUNT(*)
---------- ----------
2021-10-20          1
2021-09-29          1
2021-09-24          7

이 명령은 리두 로그 파일의 생성 추이 또는 사용량을 측정하는 명령이다. 데이터베이스 운영 시 아카이브 로그 모드 적용을 위해, 리두 로그 파일 저장에 필요한 파일 시스템 크기를 계산해야 할 경우가 발생한다. 그럴 때 유용하게 사용할 수 있다. 


로그 스위치: 현재 리두 로그 그룹 여유 공간이 부족하면 다음 리두 로그 그룹으로 변경하여 기록하는 것이다.

 

1. 컨트롤 파일에서 다음 리두 로그 그룹 번호와 체크포인트 및 아카이브 모드에서 아카이빙 완료되었는지 확인한다. 
1-1. 아카이빙 완료까지 대기한다.
2. 로그 스위치 직전 SCN을 리두 로그 파일 헤더에 기록한다. 
3. 새 리두 로그 그룹의 모든 멤버 오픈, 로그 시퀀스 번호 부여한다.
4. 이전 리두 로그 그룹은 ACTIVE로 표시하고 체크포인트 수행 후 INACTIVE로 표시한다.
4-1. 아카이브 모드일 때 이전 리두 로그 그룹에 대해 아카이브한다.

SCN: System Change Number. 데이터베이스 변경 발생할 때마다 SCN을 리두 로그 파일 헤더, 데이터 파일 헤더, 컨트롤 파일 헤더에 기록한다. 
SCN 예:
Low scn: 0x0603.70a7e719 05/14/2005 08:16:10

리두 로그 파일의 상태:
UNUSED, ACTIVE, INACTIVE, CURRENT 

[참고] 리눅스 유저명은 대소문자를 구분한다.


로그 스위치 예:

SQL> SELECT GROUP#, SEQUENCE#, MEMBERS, BYTES/1024/1024 "SIZE", STATUS
  2  FROM V$LOG;

    GROUP#  SEQUENCE#    MEMBERS       SIZE STATUS
---------- ---------- ---------- ---------- ----------------
         1         19          1        200 INACTIVE
         2         20          1        200 INACTIVE
         3         21          1        200 CURRENT

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> SELECT GROUP#, SEQUENCE#, MEMBERS, BYTES/1024/1024 "SIZE", STATUS
  2  FROM V$LOG;

    GROUP#  SEQUENCE#    MEMBERS       SIZE STATUS
---------- ---------- ---------- ---------- ----------------
         1         22          1        200 CURRENT
         2         20          1        200 INACTIVE
         3         21          1        200 ACTIVE

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> SELECT GROUP#, SEQUENCE#, MEMBERS, BYTES/1024/1024 "SIZE", STATUS
  2  FROM V$LOG;

    GROUP#  SEQUENCE#    MEMBERS       SIZE STATUS
---------- ---------- ---------- ---------- ----------------
         1         22          1        200 INACTIVE
         2         23          1        200 CURRENT
         3         21          1        200 INACTIVE

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> SELECT GROUP#, SEQUENCE#, MEMBERS, BYTES/1024/1024 "SIZE", STATUS
  2  FROM V$LOG;

    GROUP#  SEQUENCE#    MEMBERS       SIZE STATUS
---------- ---------- ---------- ---------- ----------------
         1         22          1        200 INACTIVE
         2         23          1        200 INACTIVE
         3         24          1        200 CURRENT

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> SELECT GROUP#, SEQUENCE#, MEMBERS, BYTES/1024/1024 "SIZE", STATUS
  2  FROM V$LOG;

    GROUP#  SEQUENCE#    MEMBERS       SIZE STATUS
---------- ---------- ---------- ---------- ----------------
         1         25          1        200 CURRENT
         2         23          1        200 INACTIVE
         3         24          1        200 INACTIVE

리두 로그 파일의 사용량 측정:

SQL> SELECT TO_CHAR(FIRST_TIME, 'YYYY-MM-DD') "DATE", COUNT(*)
  2  FROM V$LOG_HISTORY
  3  GROUP BY TO_CHAR(FIRST_TIME, 'YYYY-MM-DD');

DATE         COUNT(*)
---------- ----------
2021-11-24          1
2021-11-18         18
2021-11-22          1
2021-11-25          3
2021-11-23          1

리두 로그 그룹 초기화: 
리두 로그 파일 손상 시 삭제하고 추가 명령을 수행한다. 리두 로그 그룹을 삭제할 수 없는 경우에 "초기화" 유용하게 쓰인다.
리두 로그 그룹을 삭제할 수 없는 경우:
current 리두 로그 그룹이 손상된 경우..
리두 로그 그룹이 오직 두 개만 존재할 경우..

초기화의 한계:
리두 로그 파일의 위치, 개수, 크기 변경 불가.


예:

SQL> ALTER DATABASE CLEAR LOGFILE GROUP 2;
SQL> SELECT * FROM V$LOG;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TI NEXT_CHANGE# NEXT_TIM     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------- ------------ -------- ----------
         1          1         25  209715200        512          1 NO  CURRENT                1329912 21/11/25   1.8447E+19                   0
         2          1          0  209715200        512          1 NO  UNUSED                 1329897 21/11/25      1329905 21/11/25          0
         3          1         24  209715200        512          1 NO  INACTIVE               1329905 21/11/25      1329912 21/11/25          0

아카이브 로그:

리두 로그 파일을 별도로 보관하는 모드. 
예:

SQL> ARCHIVE LOG LIST
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
Oldest online log sequence     24
Current log sequence           25


로그 스위치 시 이전 리두 로그 그룹에 대해 체크포인트 발생, 체크포인트 종료되면 재사용 가능하다. 아카이브 로그 모드는 여기 (체크포인트) 에 아카이브가 추가로 발생, 종료되는 특징이 있다.

리두 로그 그룹의 내용 = 리두 로그 정보 = 리두 로그 파일 

아카이브 로그 모드의 장점: 데이터베이스 종료 없이 특정 테이블스페이스 or 데이터 파일 복구 가능하다. 
아카이브 로그 모드의 단점: 데이터베이스 행 발생. Hang이란, 새로 사용할 리두 로그 그룹의 "아카이브" 완료를 기다림으로써 LGWR가 리두 로그 파일에 기록하지 못하고 있는 현상을 말한다. 로그를 기록할 수 없어 DML 작업 수행 불가능해진다. 


기동 중인 데이터베이스에서 아카이브 로그 모드로 전환하는 방법:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 1207958960 bytes
Fixed Size                  8895920 bytes
Variable Size             738197504 bytes
Database Buffers          452984832 bytes
Redo Buffers                7880704 bytes
Database mounted.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
Oldest online log sequence     24
Next log sequence to archive   25
Current log sequence           25

기동 중인 데이터베이스에서 노아카이브 로그 모드로 전환하는 방법:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 1207958960 bytes
Fixed Size                  8895920 bytes
Variable Size             738197504 bytes
Database Buffers          452984832 bytes
Redo Buffers                7880704 bytes
Database mounted.
SQL> alter database noarchivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
Oldest online log sequence     24
Current log sequence           25

CURRENT 리두 로그 그룹 수동 아카이브:

SQL> SELECT DEST_NAME, NAME, SEQUENCE#, B.STATUS
FROM V$ARCHIVE_DEST A, V$ARCHIVED_LOG B
WHERE A.DEST_ID=B.DEST_ID;

DEST_NAME            NAME                  SEQUENCE# S
-------------------- -------------------- ---------- -
LOG_ARCHIVE_DEST_1   /u01/app/oracle/prod ########## A
                     uct/19.0.0/dbhome_1/
                     dbs/arch1_25_1088949
                     820.dbf

SQL> SELECT * FROM V$ARCHIVE_PROCESSES;

   PROCESS STATUS     LOG_SEQUENCE STAT ROLES                              CON_ID
---------- ---------- ------------ ---- ------------------------------ ----------
         0 ACTIVE                0 IDLE NO_FAL NO_SRL                           0
         1 ACTIVE                0 IDLE                                         0
         2 ACTIVE                0 IDLE                                         0
         3 ACTIVE                0 IDLE                                         0
         4 STOPPED               0 IDLE                                         0
         5 STOPPED               0 IDLE                                         0
         6 STOPPED               0 IDLE                                         0
         7 STOPPED               0 IDLE                                         0
         8 STOPPED               0 IDLE                                         0
         9 STOPPED               0 IDLE                                         0
        10 STOPPED               0 IDLE                                         0
        11 STOPPED               0 IDLE                                         0
        12 STOPPED               0 IDLE                                         0
        13 STOPPED               0 IDLE                                         0
        14 STOPPED               0 IDLE                                         0
        15 STOPPED               0 IDLE                                         0
        16 STOPPED               0 IDLE                                         0
        17 STOPPED               0 IDLE                                         0
        18 STOPPED               0 IDLE                                         0
        19 STOPPED               0 IDLE                                         0
        20 STOPPED               0 IDLE                                         0
        21 STOPPED               0 IDLE                                         0
        22 STOPPED               0 IDLE                                         0
        23 STOPPED               0 IDLE                                         0
        24 STOPPED               0 IDLE                                         0
        25 STOPPED               0 IDLE                                         0
        26 STOPPED               0 IDLE                                         0
        27 STOPPED               0 IDLE                                         0
        28 STOPPED               0 IDLE                                         0
        29 STOPPED               0 IDLE                                         0

30 rows selected.