LogMiner詳解

達芬奇的夢發表於2017-03-29

-、基本介紹

        LogMiner工具可以分析所有對於資料庫的DML操作語句,另外還可以分析得到一些必要的回滾SQL。該工具特別適用於除錯、審計或回退特定事務。LogMiner既可以分析線上日誌,也可以分析離線日誌;既可以分析本身資料庫的redo Log,也可以分析其他資料庫的redo log.利用這些資料,DBA可以:

       *發現使用者的誤操作

       *確定如何在事務級別上進行最精細的還原操作

       *透過趨向分析,進行資料庫的調優和規劃

       *進行崗位審計

二、基本組成

    2個PL/SQL包:

      DBMS_LOGMNR_D:

      包含一個用於提取資料字典的過程,即DBSM_LOGMNR_D.build()。還 包含一個重建LogMiner的過程,DBMS_LOGMNR_D.set_tablespace(),預設logminer的表是建在system表空間下。

       提取資料字典方式:

          1、提取為flat file

              需要設定UTL_FILE_DIR引數(需重啟資料庫)

        alter system set UTL_FILE_DIR='/logminer' scope=spfile

              exec DBMS_LOGMNR_build        (dictionary_filename=>'logmnr.ora',dictionary_location=>'/logminer',【options=>DBMS_LOGMNR_D.STORE_IN_FLAT_FILE】)

          2、提取為redo日誌

             必須執行在歸檔模式

             exec DBMS_LOGMNR_D.build(options=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS)

             當這些資料字典的redo日誌被歸檔後,可以透過查詢V$ARCHIVE_LOG檢視來查詢:

select name from v$archive_log where dictionary_begin='YES';

select name from v$archive_log where dictionary_end='YES';

              如果將字典資訊提取為redo檔案,在使用DBMS_LOGMNR.add_logfile新增分析的日誌檔案時,需要將這些包含字典資訊的redo檔案也新增進去。同時在使用start_logmnr開始分析時,需要制定DICT_FROM_REDO_LOGS引數。

          3、使用online catalog

             exec DBMS_LOGMNR_start_logmnr(options=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

      DBMS_LOGMNR:

        add_logfile(options=> ,logfilename=> )用於新增刪除用於分析的日誌。options:dbms_logmnr.new/addfile/removefile

        start_logmnr(options=> ,dictfilename=> , [starttime/endtime/startscn/endscn]):用來開啟日誌分析,同時確定資料提取條件

        end_logmnr():終止分析

     與logminer相關檢視:

        v$logmnr_dictionary:logminer資料字典資訊

        v$logmnr_parameters:引數資訊

        v$logmnr_logs:當前用於分析的日誌列表

        v$logmnr_contents:日誌分析結果

三、例項

    1、建立DBMS_LOGMNR包和相關資料字典

       @$ORACLE_HOME\rdbms\admin\dbmslm.sql

       @$ORACLE_HOME\rdbms\admin\dbmslmd.sql

    2、初始化設定

       a:建議開啟最小補充日誌

          alter database add supplemental log data;

       b:可以制定logminer表空間

          exec DBMS_LOGMNR_D.set_tablespace('logminer');

     3、提取字典

        如前所述,分別將字典檔案提取為flat file或redo log,或直接使用online catalog

        a:alter system set UTL_FILE_DIR='' scope=spfile;

           exec DBMS_LOGMNR_D.build(dictionary_filename=>'',dictionary_location=>'',options=>DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);

        b:exec DBMS_LOGMNR_D.build(options=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

        c:exec DBMS_LOGMNR_D.build(options=>DBMS_LOGMNR_D.DICT_FROM_ONLINE_CATALOG);

           4、制定需要分析的日誌

                exec DBMS_LOGMNR.add_logfile(options=>DBMS_LOGMNR.NEW,logfilename=>'/oracle/logs/redo01.log');

                exec DBMS_LOGMNR.add_logfile(options=>DBMS_LOGMNR.ADDFILE,logfilename=>'/oralce/logs/redo02.log');

                exec DBMS_LOGMNR.add_logfile(options=>DBMS_LOGMNR.REMOVEFILE,logfilename=>'/oracle/logs/redo3.log')

            5、啟動LogMiner

                 若字典提取為flat file,需指定Dictionary引數,若沒有字典,需指定DICT_FROM_REDO_LOGS或DICT_FROM_ONLINE_CATALOG引數。

                exec DBMS_LOGMNR.start_logmnr(dictfilename=>'',options=>)

                過濾LogMiner返回的資料:

                    a:只顯示已提交的事務

                          exec DBMS_LOGMNR.start_logmnr(options=>DBMS_LOGMNR.COMMITED_DATAONLY,dictfilename=>'');

                    b:忽略redo錯誤

                          exec DBMS_LOGMNR.start_logmnr(options=>DBMS_LOGMNR.SKIP_CORRUPTION,dictfilename=>'');

                    c:按時間過濾

                          exec DBMS_LOGMNR.start_logmnr(dictfilename=>'',starttime=>to_date('',''),endtime=>to_date('',''));

                     d:按SCN過濾

                           exec DBMS_LOGMNR.start_logmnr(dictfilename=>'',startscn=>1,endscn=>5);

                      e:跟蹤DDL語句(預設是關閉的,當字典使用ONLINE CATALOG時不能使用該選項)

                            exec DBMS_LOGMNR.start_logmnr(options=>DBMS_LOGMNR.DDL_DICT_TRACKING,dictfilename=>'');

              6、查詢分析結果

                    select * from v$logmnr_contents;

                    seg_name:物件名

                   scn:scn號

                  sql_redo:所操作的sql

                  sql_undo:恢復用的sql

                  timestamp:sql發出的時間

                  operation:sql的型別(insert、update、delete、DDL等)

                  session#:發出該操作的session

           7、結束分析

                exec DBMS_LOGMNR.end_logmnr():一旦結束分析,v$logmnr_contents中的分析結果也隨之不再存在,因為分析資訊存放在PGA中。

 

注意:

        1、logminer日誌分析工具僅能夠分析oracle8以後的產品

         2、在查詢v$logmnr_contents時,where後條件一定要大寫

         3、當用logminer分析其他資料庫例項產生的redo log檔案時

                a:logminer必須使用被分析資料庫例項產生的字典檔案,而不是安裝logminer的資料庫產生的字典檔案

                b:必須保證安裝logminer資料庫的字符集和被分析資料庫的字符集相同

                c:被分析資料庫所在平臺必須和安裝logminer資料庫所在平臺一樣

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31444259/viewspace-2136306/,如需轉載,請註明出處,否則將追究法律責任。