Oracle Logminer 數據挖掘

Logminer是oracle從8i開始提供的用於分析重作日誌信息的工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D兩個package,後邊的D是字典的意思。它既能分析redo log file,也能分析歸檔後的archive log file。在分析日誌的過程當中須要使用數據字典,通常先生成數據字典文件後使用,10g之後的版本還能夠使用在線數據字典。sql

  Logminer能夠分析其它數據庫的重作日誌文件,可是必須使用重作日誌所在數據庫的數據字典,不然會出現沒法識別的亂碼。另外被分析數據庫的操做系統平臺最好和當前Logminer所在數據庫的運行平臺同樣,且block size相同。數據庫


  LogMiner用於分析重作日誌和歸檔日誌所記載的事務操做。session

1、肯定數據庫的邏輯損壞時間。假定某個用戶執行drop table誤刪除了重要表sales,經過LogMiner能夠準肯定位該誤操做的執行時間和SCN值,而後經過基於時間恢復或者基於SCN恢復能夠徹底恢復該表數據。oracle

2、肯定事務級要執行的精細邏輯恢復操做。假定某些用戶在某表上執行了一系列DML操做並提交了事務,而且其中某個用戶的DML操做存在錯誤。經過LogMiner能夠取得任何用戶的DML操做及相應的UNDO操做,經過執行UNDO操做能夠取消用戶的錯誤操做。ide

3、執行後續審計。經過LogMiner能夠跟蹤Oracle數據庫的全部DML、DDL和DCL操做,從而取得執行這些操做的時間順序、執行這些操做的用戶等信息。工具


一、LogMiner基本對象ui

源數據庫(source database):該數據庫是指包含了要分析重作日誌和歸檔日誌的產品數據庫。操作系統

 分析數據庫(mining database):該數據庫是指執行LogMiner操做所要使用的數據庫。日誌

 LogMiner字典:LogMiner字典用於將內部對象ID號和數據類型轉換爲對象名和外部數據格式。使用LogMiner分析重作日誌和歸檔日誌時,應該生成LogMiner字典,不然將沒法讀懂分析結果。orm

二、LogMiner配置要求

(1)源數據庫和分析數據庫(源數據庫和分析數據庫能夠是同一個數據庫)

源數據庫和分析數據庫必須運行在相同硬件平臺上;

分析數據庫能夠是獨立數據庫或源數據庫;

分析數據庫的版本不能低於源數據庫的版本;

分析數據庫與源數據庫必須具備相同的字符集。

(2)LogMiner字典:LogMiner字典必須在源數據庫中生成。

(3)重作日誌文件

當分析多個重作日誌和歸檔日誌時,它們必須是同一個源數據庫的重作日誌和歸檔日誌;

當分析多個重作日誌和歸檔日誌時,它們必須具備相同的resetlogs  scn;

當分析的重作日誌和歸檔日誌必須在Oracle8.0版本以上。

三、補充日誌(suppplemental logging)

重作日誌用於實現例程恢復和介質恢復,這些操做所須要的數據被自動記錄在重作日誌中。可是,重作應用可能還須要記載其餘列信息到重作日誌中,記錄其餘列的日誌過程被稱爲補充日誌。

默認狀況下,Oracle數據庫沒有提供任何補充日誌,從而致使默認狀況下LogMiner沒法支持如下特徵:

索引簇、鏈行和遷移行;

直接路徑插入;

摘取LogMiner字典到重作日誌;

跟蹤DDL;

生成鍵列的SQL_REDO和SQL_UNDO信息;

LONG和LOB數據類型。

所以,爲了充分利用LogMiner提供的特徵,必須激活補充日誌。在數據庫級激活補充日誌的示例以下:

SQL> conn /as sysdba

已鏈接。

SQL> alter database add supplemental  log data;

數據庫已更改。

注意:這激活不用重啓數據庫,數據庫聯機便可。


LOGMNR 練習


1)DML 操做分析

06:02:11 SQL> conn /as sysdba

Connected.

06:02:17 SQL> show parameter utl


NAME                                 TYPE                   VALUE

------------------------------------ ---------------------- ------------------------------

create_stored_outlines               string

utl_file_dir                         string

06:02:19 SQL> conn scott/tiger

Connected.

06:04:04 SQL> select * from dept1;


   DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

       50 Account                      Beijing

       60 Market                       ShangHai

       70 Study                        BeiJing

       80 Technolygy                   BeiJing

       10 ACCOUNTING                   NEW YORK

       20 RESEARCH                     DALLAS

       30 SALES                        CHICAGO

       40 OPERATIONS                   BOSTON

       90 Market                       BeiJing

       80 Sales                        BeiJing

       80 Sales                        £?£?£?£?£?£?


11 rows selected.


06:04:18 SQL> delete from dept1 where deptno=80;


3 rows deleted.


06:04:35 SQL> select * from dept1;


   DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

       50 Account                      Beijing

       60 Market                       ShangHai

       70 Study                        BeiJing

       10 ACCOUNTING                   NEW YORK

       20 RESEARCH                     DALLAS

       30 SALES                        CHICAGO

       40 OPERATIONS                   BOSTON

       90 Market                       BeiJing


8 rows selected.


06:04:42 SQL> commit;


Commit complete.


06:04:55 SQL> select * from dept1;


   DEPTNO DNAME                        LOC

---------- ---------------------------- --------------------------

       50 Account                      Beijing

       60 Market                       ShangHai

       70 Study                        BeiJing

       10 ACCOUNTING                   NEW YORK

       20 RESEARCH                     DALLAS

       30 SALES                        CHICAGO

       40 OPERATIONS                   BOSTON

       90 Market                       BeiJing


8 rows selected.


06:04:58 SQL> delete from dept1 where deptno=90;


1 row deleted.


06:05:12 SQL> commit;


Commit complete.


06:05:19 SQL> alter system switch logfile;

alter system switch logfile

*

ERROR at line 1:

ORA-01031: insufficient privileges



06:05:40 SQL> conn /as sysdba

Connected.

06:05:46 SQL> alter system switch logfile;


System altered.


06:05:52 SQL> select * from v$log;


   GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIV STATUS                           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- ------------

        1          1         14   52428800          2 YES    ACTIVE                                 1748577 02-APR-11

        2          1         15   52428800          2 NO     CURRENT                                1756744 07-APR-11

        3          1         10   52428800          2 YES    INACTIVE                               1663012 31-MAR-11

        4          1         11   52428800          2 YES    INACTIVE                               1673418 01-APR-11

        5          1         12   52428800          2 YES    INACTIVE                               1705162 02-APR-11

        6          1         13   52428800          2 YES    INACTIVE                               1727817 02-APR-11


6 rows selected.

06:06:25 SQL> select name,sequence# from v$archived_log;


NAME                                                SEQUENCE#

-------------------------------------------------- ----------

/disk1/arch/43_1_741450701.log                             43

/disk1/arch/44_1_741450701.log                             44

/disk1/arch/45_1_741450701.log                             45

/disk1/arch/46_1_741450701.log                             46

/disk1/arch/47_1_741450701.log                             47

/disk1/arch/48_1_741450701.log                             48

/disk1/arch/49_1_741450701.log                             49

/disk1/arch/50_1_741450701.log                             50

/disk1/arch/47_1_741450701.log                             47

/disk1/arch/48_1_741450701.log                             48

/disk1/arch/46_1_741450701.log                             46

/disk1/arch/49_1_741450701.log                             49

/disk1/arch/50_1_741450701.log                             50

/disk1/arch/51_1_741450701.log                             51

/disk1/arch/1_1_746079267.log                               1

/disk1/arch/2_1_746079267.log                               2

/disk1/arch/3_1_746079267.log                               3


NAME                                                SEQUENCE#

-------------------------------------------------- ----------

/disk1/arch/4_1_746079267.log                               4

/disk1/arch/5_1_746079267.log                               5

/disk1/arch/6_1_746079267.log                               6

/disk1/arch/7_1_746079267.log                               7

/disk1/arch/8_1_746079267.log                               8

/disk1/arch/9_1_746079267.log                               9

/disk1/arch/10_1_746079267.log                             10

/disk1/arch/11_1_746079267.log                             11

/disk1/arch/12_1_746079267.log                             12

/disk1/arch/13_1_746079267.log                             13

/disk1/arch/14_1_746079267.log                             14


28 rows selected.


06:07:01 SQL> execute dbms_logmnr.add_logfile(logfilename=>'/disk1/arch/14_1_746079267.log',options=>dbms_logmnr.new);


PL/SQL procedure successfully completed.


06:08:19 SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);


PL/SQL procedure successfully completed.


06:09:08 SQL> col username for a8

06:09:26 SQL> col sql_redo for a50

06:09:36 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';


Session altered.


06:10:03 SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='SCOTT.DEPT1';

                                                                                                                          no rows selected

06:14:38 SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='DEPT1';


USERNAME        SCN TIMESTAMP    SQL_REDO

-------- ---------- ------------ --------------------------------------------------

           1756706 07-APR-11    delete from "SCOTT"."DEPT1" where "DEPTNO" = '80'

                                and "DNAME" = 'Technolygy' and "LOC" = 'BeiJing' a

                                nd ROWID = 'AAANaPAAEAAAAAcAAD';


           1756707 07-APR-11    delete from "SCOTT"."DEPT1" where "DEPTNO" = '80'

                                and "DNAME" = 'Sales' and "LOC" = 'BeiJing' and RO

                                WID = 'AAANaPAAEAAAAAgAAC';


           1756707 07-APR-11    delete from "SCOTT"."DEPT1" where "DEPTNO" = '80'

                                and "DNAME" = 'Sales' and "LOC" = '£?£?£?£?£?£?' a

                                nd ROWID = 'AAANaPAAEAAAAAgAAD';


           1756728 07-APR-11    delete from "SCOTT"."DEPT1" where "DEPTNO" = '90'

                                and "DNAME" = 'Market' and "LOC" = 'BeiJing' and R

                                OWID = 'AAANaPAAEAAAAAgAAA';



06:15:09 SQL>


結束日誌分析


09:18:14 SQL>  execute dbms_logmnr.end_logmnr;


PL/SQL procedure successfully completed.


2)DDL 操做分析

06:20:46 SQL> conn  scott/tiger

Connected.

06:20:54 SQL> select * from tab;


TNAME                                                        TABTYPE         CLUSTERID

------------------------------------------------------------ -------------- ----------

EMP                                                          TABLE

DEPT                                                         TABLE

BONUS                                                        TABLE

SALGRADE                                                     TABLE

QUEST_SL_TEMP_EXPLAIN1                                       TABLE

EMP1                                                         TABLE

ERRLOG                                                       TABLE

PART_SALES                                                   TABLE

T01                                                          TABLE

DEPT1                                                        TABLE

TT01                                                         TABLE

USERLOG                                                      TABLE

ERRORS                                                       TABLE

EMP_HIS                                                      TABLE


14 rows selected.


06:21:02 SQL> drop table emp_his purge;


Table dropped.


06:21:21 SQL> drop table tt01 purge;


Table dropped.


06:21:32 SQL> drop table t01 purge;


Table dropped.


06:21:38 SQL> select * from tab;


TNAME                                                        TABTYPE         CLUSTERID

------------------------------------------------------------ -------------- ----------

EMP                                                          TABLE

DEPT                                                         TABLE

BONUS                                                        TABLE

SALGRADE                                                     TABLE

QUEST_SL_TEMP_EXPLAIN1                                       TABLE

EMP1                                                         TABLE

ERRLOG                                                       TABLE

PART_SALES                                                   TABLE

DEPT1                                                        TABLE

USERLOG                                                      TABLE

ERRORS                                                       TABLE


11 rows selected.



06:22:17 SQL> conn /as sysdba

Connected.

06:22:21 SQL> alter system switch logfile;


System altered.


06:22:23 SQL> show parameter utl


NAME                                 TYPE                   VALUE

------------------------------------ ---------------------- ------------------------------

create_stored_outlines               string

utl_file_dir                         string

06:22:33 SQL> alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;


System altered.


shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

06:23:59 SQL> startup

ORACLE instance started.


Total System Global Area  524288000 bytes

Fixed Size                  1220360 bytes

Variable Size             188743928 bytes

Database Buffers          331350016 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

06:24:24 SQL> show parameter utl


NAME                                 TYPE                   VALUE

------------------------------------ ---------------------- ------------------------------

create_stored_outlines               string

utl_file_dir                         string                 /home/oracle/logmnr


06:26:28 SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);

PL/SQL procedure successfully completed.


06:27:46 SQL> select name,sequence# from v$archived_log;


NAME                                                SEQUENCE#

-------------------------------------------------- ----------

/disk1/arch/44_1_741450701.log                             44

/disk1/arch/45_1_741450701.log                             45

/disk1/arch/46_1_741450701.log                             46

/disk1/arch/47_1_741450701.log                             47

/disk1/arch/48_1_741450701.log                             48

/disk1/arch/49_1_741450701.log                             49

/disk1/arch/50_1_741450701.log                             50

/disk1/arch/47_1_741450701.log                             47

/disk1/arch/48_1_741450701.log                             48

/disk1/arch/46_1_741450701.log                             46

/disk1/arch/49_1_741450701.log                             49

/disk1/arch/50_1_741450701.log                             50

/disk1/arch/51_1_741450701.log                             51

/disk1/arch/1_1_746079267.log                               1

/disk1/arch/2_1_746079267.log                               2

/disk1/arch/3_1_746079267.log                               3

/disk1/arch/4_1_746079267.log                               4


NAME                                                SEQUENCE#

-------------------------------------------------- ----------

/disk1/arch/5_1_746079267.log                               5

/disk1/arch/6_1_746079267.log                               6

/disk1/arch/7_1_746079267.log                               7

/disk1/arch/8_1_746079267.log                               8

/disk1/arch/9_1_746079267.log                               9

/disk1/arch/10_1_746079267.log                             10

/disk1/arch/11_1_746079267.log                             11

/disk1/arch/12_1_746079267.log                             12

/disk1/arch/13_1_746079267.log                             13

/disk1/arch/14_1_746079267.log                             14

/disk1/arch/15_1_746079267.log                             15


28 rows selected.


06:28:09 SQL>execute dbms_logmnr.add_logfile(logfilename=>'/disk1/arch/15_1_746079267.log',options=>dbms_logmnr.new);


PL/SQL procedure successfully completed.


06:28:58 SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);


PL/SQL procedure successfully completed.


06:30:58 SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents

06:31:24   2   where lower(sql_redo) like '%table%';


USERNAME        SCN TIMESTAMP    SQL_REDO

-------- ---------- ------------ --------------------------------------------------

           1757390 07-APR-11    drop table emp_his purge;

           1757409 07-APR-11    drop table tt01 purge;

           1757425 07-APR-11    drop table t01 purge;


06:31:45 SQL>  

結束日誌分析

SQL> execute dbms_logmnr.end_logmnr;

PL/SQL procedure successfully completed.



oracle視頻教程請關注:http://down.51cto.com/4202939/up

相關文章
相關標籤/搜索