1. 개요

Oracle8i부터 새로 나온 LogMiner의 기능과 사용 방법에 대해 알아보자.


2. LogMiner란?

Log file에는 Oracle Database에서 발생한 작업에 관련된 많은 양의 유용한 정보가 저장되어 있다. 하지만 Oracle 8i 버전 이전에는 이 정보를 얻기 위한 손쉬운 방법이 없었다.
 
LogMiner는 online 혹은 offline redo log file에 대한 읽기/분석/해석에 관한 작업을 SQL을 사용하여 수행할 수 있도록 한다. LogMiner를 위한 다른 추가적인 비용은 수반되지 않는다.
 
Log File의 분석 작업의 결과는 다음과 같은 용도에 사용될 수 있다.
 
  1. Transaction 별, 사용자 별, 테이블 별, 시간대 별로 database에 가해진 변경 사항에 대한 추적을 할 수 있다. 즉, 어떤 사용자가 자료를 수정했는지 또 그 작업을 수행하기 이전의 데이타의 값은 무엇이었으며 작업 이후의 데이타의 값을 무엇인지를 알 수 있다. 데이타의 변경에 대한 이해와 과거 자료로의 추적 기능의 제공과 그 작업을 취소(Undo)할 수 있는 기능은 보안과 관리의 매우 중요한 수단으로 사용될 수 있다.
  2. 논리적인 자료의  변조 (예를 들어 실수로 자료를 지우고 계속 작업을 진행하는 경우)가 언제 발생했는지를 알 수 있다.변조된 이전 시점까지 일관성이 보장된 상태로 database를 복원하기 위해서 어떤 방법으로 recovery를 시작할 것인지를 결정하는데 있어서 중요한 역할을 수행한다.
  3. Tuning과 capacity 계획을 수립하기 위한 보조 자료로서 사용될 수 있다. 다양한 형태의 시간적 추이에 따른 성향과 자료의 패턴 분석이 가능하다.

3. 세부사항

LogMiner는 log file을 처리하여, 그 안에 저장되어 있는 내용물을 database에 가해진 논리적인 작업을 표현하는 SQL로 변환한다.
 
v$logmnr_contents view는 본래의 작업을 표현하는 SQL(SQL_REDO column)과 그 작업을 취소할 수 있는 SQL(SQL_UNDO column)을 나열하고 있다.  SQL_UNDO를 적용함으로써 원래의 상태로 되돌릴 수 있게 된다.
 
기타 v$logmnr_contents를 통해 얻어낼 수 있는 정보를 다음과 같은 것들이 있다.
 
  •  언제 논리적인 변조가 발생했는지를 결정하고, 그것에 대한 복구 작업(Incomplete recovery)을 수행하기 위해 필요한 SCN(system change number)나 시간 정보를 제공한다.
  •  특정 table에 발생한 변화
  •  특정 사용자로부터 발생한 변화

4. 제약 사항

  • Oracle8i 이상에서만 작동한다.
  • 분석하는 instance와 같은 H/W platform에서 동작하는 같은 character set을 사용하는 8.0 이상에서 생성된 redo log file을 처리한다.
  • PL/SQL package에 의해 생성된 dicrionary의 도움을 통해서만 redo log file의 내용을 분석할 수 있다. 이 dictionary는 logminer가 내부적인 OID (object identifier)와 data type을 Object 이름과 외부 data format으로 변경시킬 수 있도록 도와준다.
  • 일반 table에 적용되는 DML에 대한 정보만 얻어낼 수 있다. 즉, 다음과 같은 table에 대해서는 지원하지 않는다. 

지원이 되지 않는 경우 view에 "Unsupported"라는 자료로 통지된다.

  •  Index-Organized Table (IOT)
  •  Clustered table / index
  •  Non-scalar data type - varray / nested table과 Object type제외
  •  Chained rows
- Rollback, Commit, Begin Transaction 등의 명령어는 지원한다.

5. LogMiner 사용하기

5-1. Package file 실행하기

다음과 같이 파일을 실행한다. 

5-1-1. on Oracle 8.1.5

SVRMGRL> connect internal;
SVRMGRL> @?/rdbms/admin/dbmslogmnrd.sql

5-1-2. on Oracle 8.1.6 and 8.1.7 , Oracle9i

SVRMGRL> connect internal;
SVRMGRL> @?/rdbms/admin/dbmslm.sql
...
SVRMGRL> @?/rdbms/admin/dbmslmd.sql

5-2. Dictionary file 생성하기

Logminer는 database가 mount/unmount 상태에 상관없이 수행할 수 있다. LogMiner는 dictionary file을 사용하는데 그 내용물로부터 그 file을 생성한 database와 그 file이 생성된 시간을 알 수 있다. 반드시 필요한 사항은 아니지만 권장사항으로 dictionary file을 요구한다. 
 
만약 dictionary file이 없을 경우, 결과로 나타난 sql 문장에서 object 이름에 해당하는 object ID와 column이 hexa 데이타로 표시된다.
 
Dictionary file을 만들기 위해서는 database를 mount하고 dictionary 정보를 외부 file로 추출해야 한다. 그 때 분석 대상이 되는 redo log file을 생성한 database로부터 dictionary file을 생성해야 한다. 일단 생성된 dictionary file은 redo log를 분석하는 데 사용된다.

5-3. Oracle8i에서 dictionary file을 생성하는 단계

5-3-1.

반드시 utl_file_dir이라는 parameter를 parameter file(init<SID>.ora)에 지정한다.

utl_file_dir=/home2/o8ii/logs

5-3-2.

sqlplus를 사용하여 분석 대상이 되는 database를 mount하고 open한다. 참고로 Oracle8i 부터는 svrmgr에서 수행하는 대부분의 기능을 sqlplus에서 수행할 수 있게 된다.

SQL> startup

5-3-3.

DBMS_LOGMNR_D.BUILD를 사용하여 dictionary file을 만든다.

반드시 transaction의 처음 문장이어야 한다. transaction 중에는 사용할 수 없다.

SQL> call dbms_logmnr_d.build('dir_file','/home2/o8ii/logs');
5-4. 분석을 위한 Redo log 지정하기
 
dictionary file을 생성하였으면 이제 redo log를 분석할 수 있다. 첫 단계로, 분석하고 싶은 log file을 ADD_LOGFILE procedure를 이용하여 지정한다. procedure의 parameter로 NEW / ADDFILE / REMOVEFILE 등의 상수를 이용한다. 값을 지정하지 않을 경우 default로 ADDFILE이 배정된다.
 
각 상수의 값은 다음과 같다.
  • NEW : 1
  • ADDFILE : 3
  • REMOVEFILE : 2
 
1. sqlplus를 사용해서 Oracle Instance를 기동한다. 
SQL> startup
 
2. dbms_logmnr.add_logfile procedure에 NEW parameter를 지정함으로써 
 log의 리스트를 만든다. log는 online redo log file이거나 archived 
 log file 중에서 지정해야 하고 일반 filie을 지정할 경우 error가 발생한다.
 
 SQL> call dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo01.log',1);
 
3. log 리스트에 첨가하는 작업
 SQL> call dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo02.log',3);
 
4. log 리스트에서 삭제하는 방법
 SQL> call dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo02.log',2);
 
 
< Step 3. LogMiner 사용하기 >
 
Dictionary file을 만들고 어떤 log를 분석할지 지정이 끝나면 Logminer를 시작할 수 있게 되고 분석이 시작된다. 시작 시 탐색할 정보의 범위를 좁히기 위해서 다음과 같은 parameter를 지정한다.
 
- StartSCN (default 0) / EndSCN (0) / StartTime (01-JAN-1988) 
   / EndTime (01-JAN-2988) / DictFileName (Null) / Options (0)
   ** DictFileName은 null string이 기본값이므로 생성하였다면 반드시 지정한다.
 
Logminer를 시작하면 다음과 같은 View를 통해서 정보를 얻을 수 있다.
- V$LOGMNR_DICTIONARY    : 사용중인 dictionary file
- V$LOGMNR_PARAMETERS : LogMiner에 Setting된 현재의 parameter의 값
- V$LOGMNR_LOGS          : 분석되고 있는 redo log file
- V$LOGMNR_CONTENTS      : 현재 분석되고 있는 redo log file의 내용
 
1. dbms_logmnr.start_logmnr을 실행한다.
 주의) 다른 함수는 몰라도 start_logmnr은 반드시 execute를 이용해서 실행한다. 
       Call Spec을 이용하여 함수를 실행하면 named parameter passing 방법을 
       모르는 Call Spec은 error를 리턴한다.
 
 SQL> execute dbms_logmnr.start_logmnr(DictFileName=>'/home2/o8ii/logs/dir_file');
 
또는
 
 SQL> execute dbms_logmnr.start_logmnr(DictFileName=>'/home2/o8ii/logs/dir_file',
StartSCN=>100, EndSCN=>150);
 
2. V$LOGMNR_CONTENTS를 조회해 보자. SCN의 순서로 정렬된 결과가 보인다.
 
3. LogMiner를 종료한다.
 SQL> call dbms_logmnr.end_logmnr();
 
 
V. 다른 Database로부터 생성된 archive redo log file 분석하기.
 
현재 logminer를 운영하는 Database(LDB라고 하자)가 아닌 다른 database
(SDB라고 하자)의 archive redo log file을 분석하는 것이 가능하다. 
 
그러기 위해서는 다음과 같은 것들이 지켜져야 한다.
 
- SDB는 LDB와 같은 character set이어야 하고, SDB의 redo log file을 분석하기 
 위해서는 SDB에서 생성된 dictionary file을 사용해야 한다.
 
- LogMiner 를 실행하는 system 은 분석 대상 database 가 실린 system 일 필요는
 없지만 같은 hardware platform 이어야 한다 .
 
- Oracle8.0 이상에서 생성된 redo log file 을 사용해야 한다 .
 
 < Oracle8에서 Dictionary File 생성하기 > 
 
1. Oracle8i에서 dbmslogmnrd.sql(8.1.5) 또는 dbmslmd.sql filed을 
 copy한다. 
 
2. copy한 화일을 다음과 같이 실행한다.
 SVRMGRL> connect internal;
 SVRMGRL> @dbmslogmnrd.sql
    or
 SVRMGRL> @dbmslmd.sql
 
3. $ORACLE_HOME/dbs/initSID.ora file에 utl_file_dir parameter를 
 설정하고 db를 restartup한다.
 
4. dbms_logmnr_d package를 이용하여 dictionary file을 생성한다.
 
 SQL> connect sys/manager
 SQL> exec dbms_logmnr_d.build('dir_file','/home2/o8ii/logs');
 
5. 생성한 dictionary file과 분석하고자 하는 archiving file을 
 oracle8i db로 copy한 후에 logminer를 실행한다.