DATOR


B&R 6. Online Redo Log Group Multiplexing 및 추가/삭제 DBMS B&R



 온라인 리두 로그 그룹은 복구를 위해 필요한 아주 중요한 파일이지만 유실 시 백업 파일을 이용할 수 없다. 말 그대로 '실시간' 로그 정보를 기록 하는 파일이기 때문이다.
 만약 온라인 리두 로그 그룹을 유실하게 된다면 그 시점에서 완전 복구는 불가능하다.
 그렇기 때문에 온라인 리두 로그 파일은 가급적 2개이상의 그룹을 서로 다른 스토리지에 구성하는 것 을 추천한다.

 이번 장에서는 온라인 리두 로그의 그룹 구성 및 그룹 추가에 대해 알아보도록 한다.

1. 그룹 구성
먼저 아래와 같이 현재의 그룹을 확인한다.

SQL> set linesize 200
col group# format 999
col member format a40
col type format a7
col status format a8SQL> SQL> SQL> SQL>
SQL> select GROUP#, STATUS, TYPE, MEMBER
             from v$logfile
             order by 1,4 ;  2    3

GROUP# STATUS   TYPE       MEMBER
------ ----------- --------- ----------------------------------------
     1                      ONLINE   /u01/app/oracle/oradata/orcl/redo01.log
     2        STALE    ONLINE   /u01/app/oracle/oradata/orcl/redo02.log
     3                      ONLINE   /u01/app/oracle/oradata/orcl/redo03.log

 3개의 그룹이 각각 1개의 파일로 구성 되어 있다.
 만약 이 상황에서 파일이 손상 된다면 아주 치명적인 장애로 이어질 수 있다.

 아래와 같이 리두 로그 파일을 그룹으로 묶어 준다.
 SQL> ALTER DATABASE ADD LOGFILE MEMBER
  '/u01/app/oracle/oradata/orcl/redo01b.log' TO GROUP 1 ,
  '/u01/app/oracle/oradata/orcl/redo02b.log' TO GROUP 2 ,
  '/u01/app/oracle/oradata/orcl/redo03b.log' TO GROUP 3

Database altered.
 손 쉽게 파일을 추가하였다.
 하지만 이 상태로 바로 그룹 파일을 사용할 수 있는 건 아니다.
 현재 사용 중 인 파일이기 때문에 추가 했다고 바로 사용 할 수 있는 것 이 아니고, 로그 스위칭이 발생할 때 사용 할 수 있기 때문이다.
 현재 상태를 확인 하면 아래와 같이 리두 로그 그룹을 확인 하면 추가된 파일들은 INVALID 상태 이다.

 SQL> select GROUP#, STATUS, TYPE, MEMBER
             from v$logfile
             order by 1,4 ;   2    3

GROUP# STATUS   TYPE        MEMBER
------ ----------- ---------- ----------------------------------------
     1                      ONLINE  /u01/app/oracle/oradata/orcl/redo01.log
     1 INVALID         ONLINE  /u01/app/oracle/oradata/orcl/redo01b.log
     2 STALE           ONLINE  /u01/app/oracle/oradata/orcl/redo02.log
     2 INVALID         ONLINE  /u01/app/oracle/oradata/orcl/redo02b.log
     3                      ONLINE  /u01/app/oracle/oradata/orcl/redo03.log
     3 INVALID          ONLINE  /u01/app/oracle/oradata/orcl/redo03b.log

6 rows selected.

 아래와 같이 강제로 로그 스위칭을 하면 INVALID 상태가 사라진다.

 SQL> alter system switch logfile ;

System altered.

SQL> alter system checkpoint ;

System altered.

SQL> select GROUP#, STATUS, TYPE, MEMBER
             from v$logfile
             order by 1,4 ;  2    3

GROUP# STATUS   TYPE       MEMBER
------ ----------- --------- ----------------------------------------
     1       ONLINE                   /u01/app/oracle/oradata/orcl/redo01.log
     1       INVALID   ONLINE    /u01/app/oracle/oradata/orcl/redo01b.log
     2       STALE     ONLINE    /u01/app/oracle/oradata/orcl/redo02.log
     2       INVALID   ONLINE    /u01/app/oracle/oradata/orcl/redo02b.log
     3                      ONLINE   /u01/app/oracle/oradata/orcl/redo03.log
     3                      ONLINE   /u01/app/oracle/oradata/orcl/redo03b.log

 스위칭을 한번만 하였기에 하나의 그룹만 INVALID가 사라졌다.
 로그 스위칭을 두번 더 하면 모든 INVALID가 사라질 것 이다.

 아주 쉽게 온라인 리두 로그의 그룹을 구성하였다.
 예제에서는 디스크가 하나 이기 때문에 같은 디스크에 구성하였지만, 실무에서는 보통 여러개의 디스크를 스토리지로 구성하기 때문에 위와 같은 구성은 바람직 하지는 않다.
 다른 디스크 장비가 있다면 서로 다른 디스크로 그룹을 구성하는 것이 권장 사항이다.
 만약 디스크가 Failure가 되더라도 다른 디스크에 구성 된 그룹으로 부터 복구를 받을 수 있기 때문이다.

2. 그룹의 일부 유실 복구 
 그룹 중 일부를 유실 할 경우 복구에 대해 알아보도록 한다.
 현재 CURRENT에 해당하는 파일을 삭제해 보기로 한다. 먼저 아래의 SQL로 현재 CURRENT 상태의 온라인 리두 로그 파일을 알아보도록 한다.

SQL> select group#, SEQUENCE#, STATUS from v$log where status = 'CURRENT';

GROUP#  SEQUENCE# STATUS
------ ---------- --------
     1          5 CURRENT

 현재의 CURRENT 파일을 지워보도록 한다.
 $ rm -rf /u01/app/oracle/oradata/orcl/redo01.log
 CURRENT 로그 그룹 중 일부 파일이 유실 되었지만, 문제 없이 트랜젝션의 진행이 가능하다.
 아래와 같이 HR계정으로 접속해 INSERT 문장을 날려보도록 한다.

 SQL> insert into regions values(10000, 'test');

1 row created.

SQL> commit;

Commit complete.


 서비스에는 문제 없지만, 로그 스위치가 되면 alert_log에 에러 메시지가 뜨게 된다. 아래와 같이 로그 스위치를 몇차례 하고 alert로그를 확인해 보도록 한다.

SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.
SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.
SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.

 alert로그를 확인 해 보면 아래와 같이 메시지가 나온다.
cat /u01/app/oracle/admin/orcl/bdump/alert_orcl.log
.....
 Wed Feb 22 23:57:23 2012
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_lgwr_7007.trc:
ORA-00321: log 1 of thread 1, cannot update log file header
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log'
.....
 로그 그룹 파일 중 일부가 없다는 뜻 이다.
 큰 장애는 아니지만, 얼럿 로그에 계속 스위칭이 일어날 때 마다 에러메시지가 나오기 때문에 그룹 중 정상인 파일을 다시 복사 하여 복구를 해야 한다.
 먼저 복구의 대상의 그룹이 CURRENT 상태인지 확인한다.

 SQL> select group#, SEQUENCE#, STATUS from v$log where status = 'CURRENT';

    GROUP#  SEQUENCE#   STATUS
---------- -------------- ------------------------------------------------
         1         11                 CURRENT

 CURRENT그룹이 현재 복구가 필요한 그룹이다.
 복사를 하기 전에 먼저 로그 스위치를 한다.
SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.
스위칭이 되었으면 아래와 같이 정상적인 파일을 유실된 파일명으로 복사한다.
 $ cp /u01/app/oracle/oradata/orcl/redo01b.log /u01/app/oracle/oradata/orcl/redo01.log
 다시 로그 스위칭을 수차례 시도한다.

SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.
SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.
SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.

 이제 alert로그를 확인 하더라도 아래와 같이 정상적으로 로그 스위칭이 이루어지는 것 을 확인 할 수 있다.
 cat /u01/app/oracle/admin/orcl/bdump/alert_orcl.log
...
Thread 1 advanced to log sequence 14
  Current log# 1 seq# 14 mem# 0: /u01/app/oracle/oradata/orcl/redo01.log
  Current log# 1 seq# 14 mem# 1: /u01/app/oracle/oradata/orcl/redo01b.log
....
 로그 그룹만 잘 되어 있다면 복구 자체는 어렵지는 않다.
 다시 한번 말 하지만, 항상 로그 그룹 전체가 유실 되지 않도록 온라인 리두 로그 파일은 서로 다른 디스크에 그룹을 지어주는 것 을 적극 권장한다.

3. 그룹 추가
 아래의 명령어로 온라인 리두 로그 그룹자체를 추가 할 수 있다.
 ALTER DATABASE ADD LOGFILE GROUP 4
      ('/u01/app/oracle/oradata/orcl/redo04a.log'
      ,'/u01/app/oracle/oradata/orcl/redo04b.log') size 50M ;
 아래와 같이 리두 로그 그룹을 확인하면 아래와 같이 그룹이 추가되었음을 알 수 있다.
SQL> select group#,sequence#,bytes,members,status,first_change#  from v$log ;

 GROUP#  SEQUENCE#      BYTES    MEMBERS   STATUS       FIRST_CHANGE#
--------- ------------- ----------- ---------- ------------ -----------------
     1              14               52428800       2            INACTIVE              606934
     2              16               52428800       2            CURRENT             627502
     3              15               52428800       2            INACTIVE              606954
     4               0               52428800       2             UNUSED                      0
 크게 주의할 사항은 아니지만 그룹이 추가 되면 로그 스위칭이 일어나게 되었을 때 번호 순서대로 로그 스위칭이 일어나는 게 아니고, UNUSED, 즉 새로 추가된 리두로그 그룹 스위칭이 일어난 다는 것 이다.
 아래와 같이 로그 스위칭을 하게 되면 현재(2번 그룹) 그룹의 다음 그룹(3번 그룹)으로 로그 스위칭이 되는 것 이 아니고, UNUSED(새로 추가한) 상태인 4번 그룹으로 스위칭이 됨을 알 수 있다.

SQL> alter system switch logfile ;
alter system checkpoint ;
System altered.
SQL> alter system checkpoint ;
System altered.

SQL> select group#,sequence#,bytes,members,status,first_change#  from v$log ;

GROUP#  SEQUENCE#      BYTES MEMBERS STATUS       FIRST_CHANGE#
-------- ------------- ---------- ---------- ------------ -------------
     1               14           52428800          2       INACTIVE             606934
     2               16           52428800          2       INACTIVE             627502
     3               15           52428800          2       INACTIVE             606954
     4               17           52428800          2       CURRENT             627829


4. 그룹 삭제
 그룹을 삭제 할 때 주의 사항은 INACTIVE상태의 그룹만 삭제가 허용된다는 점이다. 
 아래와 같이 (방금 테스트를 통해 CURRENT가 된) 4번 로그 그룹을 삭제하려면 아래와 같이 에러가 발생한다.
SQL> alter database drop logfile group 4 ;
alter database drop logfile group 4
*
ERROR at line 1:
ORA-01623: log 4 is current log for instance orcl (thread 1) - cannot drop
ORA-00312: online log 4 thread 1: '/u01/app/oracle/oradata/orcl/redo04a.log'
ORA-00312: online log 4 thread 1: '/u01/app/oracle/oradata/orcl/redo04b.log'
 로그 스위칭을 하고 다시 삭제를 하면 정상적으로 삭제가 가능하다.

SQL> alter system switch logfile ;
System altered.
SQL> alter system checkpoint ;
System altered.

SQL> alter database drop logfile group 4 ;

Database altered.

SQL> select group#,sequence#,bytes,members,status,first_change#  from v$log ;

GROUP#  SEQUENCE#      BYTES MEMBERS STATUS       FIRST_CHANGE#
------- --------------- ---------- ------- ------------ -------------
     1                  18          52428800       2     CURRENT             628088
     2                  16          52428800       2     INACTIVE            627502
     3                  15          52428800       2     INACTIVE            606954

 아카이브 로그 모드가 활성화 되면 스위칭 되는 온라인 리두 로그 그룹들이 아카이빙 되지만, 그래도 매우 빈번하게 트랜젝션이 발생하는 운영환경에서는 그룹을 추가하는 것 도 좋은 선택이다.

 이번 장을 통해 온라인 리두 로그 그룹의 멀티플렉싱 구성과 추가 삭제에 대해 알아보았다.
 예제에서는 디스크 하나로 구성된 환경이기 때문에 같은 디렉토리에 구성했지만, 실제 운영환경에서는 반드시 다른 디스크에 멀티플렉싱을 구성하는 것 을 권장한다.
 또한 멀티플렉싱 구성은 가급적이면 최초 운영을 시작하기 전에 구성해 두는 것을 적극적으로 권장한다.
Tag :

Leave Comments