DATA 전문가로 가는 길

[ Oracle - B&R ] Log Miner 사용 방법과 원리 이해 본문

Data Architecture/Backup & Recovery

[ Oracle - B&R ] Log Miner 사용 방법과 원리 이해

EstenPark 2011. 2. 18. 18:38


1. Oracle Log Miner 개념

[1-1 개념] DB 운영을 하다보면 사용자의 실수로 Drop되서 복구 시점을 잡을 수가 없게 될 수도 있습니다. Log Miner(로그 마이너) 유틸리티는 오라클의 리두 로그 파일의 내용을 자세히 분석하여 볼 수 있게 해주는 유틸리티 입니다. 리두 로그 파일이나 아카이브로 그 파일에 있는 내용을 보고 싶을 때 유용하게 사용하는 경우가 많습니다.
보통 리두 로그 파일에서 필요한 최소한의 정보만 저장하는데 Supplemental Logging은 부가적인 정보를 더 저장하게 됩니다. 예로 든다면 UPDATE 문장에서 특정 컬럼만 수정 했을 경우 해당 컬럼에 대한 정보만 Logging을 하게 되는게 아니라 전체 컬럼에 대해서 Logging을 하게 됩니다. 그래서 리두 로그 파일이나 아카이브 파일의 사이즈가 보통 20%이상 커진다고 보시면 됩니다.


2. 실전 Log Miner

[2-1 파라미터 파일 설정] DB를 종료 후에 $ORACLE_HOME/dbs/initSID.ora 파일에서 디렉토리를 설정 합니다. 디렉토리를 설정하는 이유는 딕셔너리 파일이 생성 되기 때문입니다.딕셔너리 파일이란 log miner가 리두 로그를 분석할 때 사용하는 target database의 정보를 저장하고 있는 파일 입니다.

[설명] Pfile에 내용 추가
[2011-02-18 18:39:21]-[oracle@calmestenpark:~/product/10g/dbs]
$ vi inittestdb.ora
*.utl_file_dir="/home/oracle/logmnr"

[2-2 실습] 딕셔너리 파일 생성, 로그파일 추가, 로그 파일 분석

[설명] supplemental logging을 먼저 해주는 이유는 현재 시점 부터 DML을 기록 하겠다는 의미 입니다.
SYS@testdb> alter database add supplemental log data;

[설명] DML 정보가 나오는지 확인 하기 위해서 테이블을 생성 후 데이터를 Insert 합니다.

SYS@testdb> conn scott/oracle
Connected.
SCOTT@testdb> create table estenpark (no number) tablespace test;
Table created.
SCOTT@testdb> @time
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2011-02-18:17:06:43

[설명] INSERT 1
SCOTT@testdb> insert into estenpark values(1);
1 row created.
SCOTT@testdb> commit;
Commit complete.
SCOTT@testdb> @time
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2011-02-18:17:07:04

[설명] INSERT 2
SCOTT@testdb> insert into estenpark values(2);
1 row created.
SCOTT@testdb> commit;
Commit complete.
SCOTT@testdb> @time
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2011-02-18:17:07:18

[설명] DELETE
SCOTT@testdb> delete from estenpark where no=1;
1 row deleted.
SCOTT@testdb> commit;
Commit complete.
SCOTT@testdb> @time
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2011-02-18:17:07:48

[설명] 딕셔너리 파일을 생성 합니다. estenpark가 실제 파일이고 vi나 cat로 데이터를 확인 할 수 있습니다.
SYS@testdb> exec dbms_logmnr_d.build('estenpark','/home/oracle/logmnr');

[설명] 분석 할 리두 로그 파일이나  아카이브 로그 파일을 등록 합니다.
여기에서 중요한 사실이 하나 있습니다.

새 파일을 등록  : 1
exec dbms_logmnr_add_logfile('/home/oracle/oradata/testdb/redo01_a.log', 1);
등록된 파일을 삭제 : 2
exec dbms_logmnr_add_logfile('/home/oracle/oradata/testdb/redo01_a.log', 2);
다른 파일 추가 : 3
exec dbms_logmnr_add_logfile('/home/oracle/oradata/testdb/redo01_a.log', 3);

위에서 설명한 대로 만약 숫자를 1로 등록 한다면 하나의 파일만 분석 하게 됩니다.
그래서 여러가지 파일을 모두 분석을 하고 싶다면 첫번째를 제외 하고 모두 3번으로 입력 하시기 바랍니다.

SYS@testdb> exec dbms_logmnr.add_logfile('/home/oracle/oradata/testdb/redo01_a.log', 1);
PL/SQL procedure successfully completed.

SYS@testdb> exec dbms_logmnr.add_logfile('/home/oracle/oradata/testdb/redo02_a.log', 3);
PL/SQL procedure successfully completed.
SYS@testdb> exec dbms_logmnr.add_logfile('/home/oracle/oradata/testdb/redo03_a.log', 3);
PL/SQL procedure successfully completed.

.. (아카이브 로그 파일도 위와 같이 추가 하면 됩니다.)

[설명]  등록한 로그 파일을 분석 합니다. 위 에서 딕셔너리 파일을 만들었는데 해당 파일을 기준으로 분석을 시작 합니다.
SYS@testdb> exec dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/estenpark');
PL/SQL procedure successfully completed.

[설명] 리두 로그 파일 뿐만 아니라 아카이브 로그 파일도 사용가능 합니다. 딕셔너리 파일은 최초에 한번만 만들면 되고 추가로 분석하길 원하는 로그 파일을 등록하거나 필요 없는 파일은 제거하면서 사용하면 됩니다. 그럼 DML이 발생된 시점이 언제인지 확인 해보도록 하겠습니다.

SYS@testdb> L
  1  select to_char(timestamp, 'RRRR-MM-DD:HH24:MI:SS') "Timer_Stamp", seg_owner, username, sql_redo, sql_undo
  2  from v$logmnr_contents
  3  where seg_owner = '&seg_owner'
  4* and seg_name = '&seg_name'


SYS@testdb> @logmnr
Enter value for seg_owner: SCOTT
old   3: where seg_owner = '&seg_owner'
new   3: where seg_owner = 'SCOTT'
Enter value for seg_name: estenpark
old   4: and seg_name = '&seg_name'
new   4: and seg_name = 'estenpark'

Timer_Stamp          SEG_OWNER  USERNAME        SQL_REDO
-------------------------------------- ---------- -------------------- --------------------
SQL_UNDO
------------------------------------------------------------------------------------------------------------------------
2011-02-18:17:06:37         SCOTT   SCOTT         create table estenpark (n
               o number) tablespace
         test;

2011-02-18:17:07:01         SCOTT   SCOTT         insert into "SCOTT".
               "estenpark"("NO") values
               ('1');
delete from "SCOTT"."estenpark" where "NO" = '1' and ROWID = 'AAANBjAAGAAAAAMAAA';

2011-02-18:17:07:10         SCOTT   SCOTT         insert into "SCOTT".
               "estenpark"("NO") values
               ('2');
delete from "SCOTT"."estenpark" where "NO" = '2' and ROWID = 'AAANBjAAGAAAAAMAAB';

2011-02-18:17:07:43         SCOTT   SCOTT         delete from "SCOTT".
               "estenpark" where "NO" =
               '1' and ROWID = 'AAA
               NBjAAGAAAAAMAAA';
insert into "SCOTT"."estenpark"("NO") values ('1');


[설명] Log Miner를 확인 할 수 있는 VIEW 종류
- V$LOGMNR_DICTIONARY : 사용중인 dictionary file
- V$LOGMNR_PARAMETERS : LogMiner에 Setting된 현재의 parameter의 값
- V$LOGMNR_LOGS : 분석되고 있는 redo log file
- V$LOGMNR_CONTENTS : 현재 분석되고 있는 redo log file의 내용



로그 마이너로 하지 않아도 플래쉬 백으로 관련 정보를 볼 수 있습니다. 
Supplemental Logging 부분만 먼저 설정 한다면 DML도 위와 같이 조회를 할 수 있습니다.




Comments