ORACLE/ADMIN2009. 11. 19. 14:29
반응형

logminer사용하기~!! 


1. 파라미터 파일에 dictionary file 이 생성될 위치를 지정한다.

    utl_file_dir="d:\oracle"    -->> spfile을 사용할 경우 alter system set utl_file_dir='c:\oracle\ora92\logminer') scope=sfpile; 을 사용하여 dict파일을 생성될 위치를 생성해주면 된다!!

 


2. db 를 restart 한다.


  SQL> shutdown immediate

  SQL> startup

 


4. dbms_logmnr_d.build 를 사용하여 dictionary file을 생성시킨다.


   SQL> execute dbms_logmnr_d.build('dir_file','c:\oracle\ora92\logminer);

 

   PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

 

5. 분석할 아카이브 로그파일및 리두로그파일을 추가시킨다.

 

   SQL>  execute dbms_logmnr.add_logfile('d:\oracle\oradata\ocp\redo01.log',dbms_logmnr.new);

 

    PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

 

 

 

< 참조문서: 분석을 위한 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> exec dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo01.log',1);

 

   3. log 리스트에 첨가하는 작업
      SQL> exec dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo02.log',3);

 

   4. log 리스트에서 삭제하는 방법
      SQL> exec dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo02.log',2);

 


6. 분석 시점을 지정한다.

    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'d:\oracle\dir_file',-
       starttime=>to_date('2005/08/09 15:55:10','RRRR/MM/DD HH24:MI:SS'),-
       endtime=>to_date('2005/08/09 16:05:10','RRRR/MM/DD HH24:MI:SS') );

 

    PL/SQL 처리가 정상적으로 완료되었습니다.

 

또는 파일 이름을 지정하면 된다!!~!! 시점을 지정해서 검색도 가능하다!!!

 


7. v$logmnr_contents  를 조회하여 원하는 정보를 추출한다.

     
   SQL> alter session set nls_date_format='RRRR/MM/DD:HH:MI:SS';

 

 

   SQL> col seg_owner for a10


   SQL> col username for a10

 

   SQL> col sql_redo for a30

                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                    
    SQL> select timestamp,seg_owner,username, sql_redo from v$logmnr_contents
             where sql_redo like '%drop%';

TIMESTAMP              SEG_OWNER     USERNAME                 SQL_REDO                                                                                                                                                                                                                                     
------------------- ---------          --------------------- ---------------                                                                                                                                                                                                               
2005/08/09:03:57:33 SYS                  SYS                          drop table emp900;

 

 

 

==========================================================================

 

 

 

 

로그마이너를 통해 원하는 시점의 log정보를 검색해서 내가 어느 시점에 파일을 drop시켰는지 변경했는지를 알 수 있다!!

그 후 데이터베이스의 테이블을 불완전 복구하면 원하는 시점으로 테이블을 복구 할 수 있다!

예를 들어 내가 2008년 7월 22일 15:00:00 시에 scott의 emp테이블을 drop했을경우 나는 오프라인 백업데이터를 가져와 그 시점까지만 복구하면 drop하기 바로전까지 복구 할 수 있는 것이다

 

1.백업된 파일은 내 데이터 베이스로 복사해온다...

 

2.불완전 복구작업을 수행할 때 가장 중요한 포인트 중에 하나는 마지막 오프라인 백업된 모든 데이터 파일들을 현재 경로로 복사해야 한다는 것입니다.

이때 ctl파일이나 redo파일등은 복사할 필요 없고, 데이터 파일이 깨진 것이므로 모든 데이터 파일만 복사하면 된다.

 

불완전 복구 방법에서는 특정 파일만 재 설치해서는 모든 데이터를 과거 특정시점으로 되돌릴 수 없기 때문에 반드시 모든 데이터를 과거 시점으로 복구해야 하기 때문이다!!!

 

 

 

3.startup mount

 

4.SQL> set autorecovery on --->> recover database 실행하여 아카이브 적용시 자동으로 auto를 적용시켜줌

 

5.SQL> recover database until time '2008-07-22 15:33:00';

 

6.SQL> alter database open; until time을 사용하여 복구해서 datafile의 scn이 다르기 때문에 resetlogs를 사용하여 강제로 scn과 모든 상태정보값을 초기화 시킨 후 오픈하여야 한다~!

 

7.SQL> alter database open resetlogs;

 

 

 


ORACLE10G 에서 추가된 LOGMINER 의 기능
======================================

출처:한국오라클 불리틴

 

PURPOSE
-------
이 자료는 Oracle10g version에 추가된 LogMiner 기능에 대해 설명한다.

 

Explanation
-----------
Oracle10g LogMiner 에서는 아래의 기능들이 추가되었다.


1.  LogMiner in a Shared Server Environment

 

기존에는 Dedicated mode에서만 logminer실행이 가능했으나 Oracle10g 에서는 MTS 환경에서도 logminer의 실행이 가능하다.


2.  Support for Index Organized Tables

 

Logminer 는 IOT 에 대해서도 Logminer를 통해서 정확한 record 변화를 찾을 수 있다. Oracle9i 까지는 Logminer에서 IOT 를 지원하지 못했다.


3.  Support for new datatypes

 

LogMiner 10g 에서는 아래의 data type을 redo/undo transaction에서 정확히 반영하게 되었다.  즉, 아래의 parameter가 새로

지원된다.

 

  - LONG
  - Multibyte CLOB
  - NCLOB


4.   SQL_REDO/SQL_UNDO without rowids - NO_ROWID_IN_STMT

 

DBMS_LOGMNR.START_LOGMNR procedure실행시에 NO_ROWID_IN_STMT option을 추가할 수 있다. 이 기능은

v$logmnr_contents view의 SQL_REDO 와 SQL_UNDO column에서 rowid 를 나타내지 않도록 하는 option이다.

이 rowid 를 나타내지 않으면 이 sql들을 rowid 가 다른 환경에서도 사용할 수 있으므로 더 유용하다.  logminer 기능을  object가

원래 있는 db가 아닌 다른 db에서 실행할 때 이 기능을 이용하여 rowid 가 아닌 primary key 등에 의해 sql 을 적용할 수 있다.

 

[예제]

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-
         OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -
         DBMS_LOGMNR.NO_ROWID_IN_STMT);

 

5.  Removing a logfile from the LogMiner session

 

Oracle9i 까지는 Logminer session을 실행하여 log file이나 archiving file을 add한 후에는 list 에서 삭제할 수가 없었다. 

Oracle10g 부터는 add한 file을 삭제할 수 있는 기능이 추가되었다.

이 기능은 다음과 같이 DBMS_LOGMNR.REMOVE_LOGFILE()를 이용하여 가능하다.

[예제]

SQL>  EXEC DBMS_LOGMNR.REMOVE_LOGFILE(LOGFILENAME => '/oracle/logs/log2.f');


만약 위와 같이 logfile을 삭제한 후에 바로 v$logmnr_contents view를 조회하면
아래와 같이 ora-1306 error가 발생한다. 그러므로 다시 DBMS_LOGMNR.START_LOGMNR 를
실행한 후 조회해야 한다.


SQL>  select count(*) from v$logmnr_contents;
 select count(*) from v$logmnr_contents
                      *
ERROR at line 1:
ORA-01306: dbms_logmnr.start_logmnr() must be invoked before selecting from
v$logmnr_contents

 

Reference Documents
-----------------
<Note:249001.1>


======================================================================================================

반응형
Posted by [PineTree]