oracle 10g logmnr使用

來源:互聯網
上載者:User
 一.安裝LogMiner

$ sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Apr 15 12:30:58 2008

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.

SQL> conn / as sysdba;
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area 1392508928 bytes
Fixed Size                  2072808 bytes
Variable Size             738201368 bytes
Database Buffers          637534208 bytes
Redo Buffers               14700544 bytes
Database mounted.
Database opened.

SQL>@?/rdbms/admin/dbmslm.sql

Package created.

Grant succeeded.

--dbmslm.sql是用來建立DBMS_LOGMNR的package,這個包是用來分析日誌的.

SQL>@?/rdbms/admin/dbmslmd.sql

Package created.

--dbmslmd.sql是用來建立DBMS_LOGMNR_D的package的,這個包是用來建立資料字典檔案的.

注意以上兩個包都是需要在sysdba許可權的user下建立.

二.使用LogMiner

安裝LogMiner確實很簡單,現在來看看如何使用我們安裝好的東東

1.首先需要建立資料字典檔案(data-dictionary):

為什麼要建立資料字典檔案呢?
引用一位網友的話就是:讓LogMiner引用涉及到內部資料字典中的部分時為他們實際的名字,而不是系統內部的16進位。資料字典檔案是一個文字檔,使用包 DBMS_LOGMNR_D來建立。如果我們要分析的資料庫中的表有變化,影響到庫的資料字典也發生變化,這時就需要重新建立該字典檔案。另外一種情況是在分析另外一個資料庫檔案的重作日誌時,也必須要重建一遍被分析資料庫的資料字典檔案。 在使用LogMiner工具分析redo log檔案之前,可以使用DBMS_LOGMNR_D 包將資料字典匯出為一個文字檔。該字典檔案是可選的,但是如果沒有它,LogMiner解釋出來的語句中關於資料字典中的部分(如表名、列名等)和數值都將是16進位的形式,我們是無法直接理解的。

在pfile或者spfile中,我們通過設定UTL_FILE_DIR參數來指定資料字典檔案的位置目錄

對於UTL_FILE_DIR參數在10g的文檔中有這樣的解釋:
----------------------------------------------
UTL_FILE_DIR lets you specify one or more directories that Oracle should use for PL/SQL file I/O. If you are specifying multiple directories, you must repeat the UTL_FILE_DIR parameter for each directory on separate lines of the initialization parameter file.
All users can read or write to all files specified by this parameter. Therefore all PL/SQL users must be trusted with the information in the directories specified by this parameter.
Note:
If you list multiple values, all entries of this parameter must be on contiguous lines of the parameter file. If you separate them with other parameters, Oracle will read only the last (contiguous) lines.

開始設定UTL_FILE_DIR參數並建立資料字典檔案:
SQL> show parameter spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /opt/oracle/product/10g/dbs/sp
                                                 fileirmdb.ora

SQL> alter system set UTL_FILE_DIR='/opt/oracle/product/10g/logmnr' scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1392508928 bytes
Fixed Size                  2072808 bytes
Variable Size             738201368 bytes
Database Buffers          637534208 bytes
Redo Buffers               14700544 bytes
Database mounted.
Database opened.

SQL> show parameter UTL_FILE_DIR

NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------------------------
utl_file_dir                         string      /opt/oracle/product/10g/logmnr

現在開始建立資料字典:
SQL> show user;
USER is "SYS"

SQL>exec dbms_logmnr_d.build(dictionary_filename=>'alan_dict.ora',dictionary_location=>'/opt/oracle/product/10g/logmnr');

PL/SQL procedure successfully completed.

SQL> !
$ cd $ORACLE_HOME/logmnr
$ ls
alan_dict.ora

2.其次需要建立分析的記錄檔列表:
首先看一下dbms_logmnr包的內容:
SQL> desc dbms_logmnr;
PROCEDURE ADD_LOGFILE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 LOGFILENAME                    VARCHAR2                IN
 OPTIONS                        BINARY_INTEGER          IN     DEFAULT
FUNCTION COLUMN_PRESENT RETURNS BINARY_INTEGER
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SQL_REDO_UNDO                  NUMBER                  IN     DEFAULT
 COLUMN_NAME                    VARCHAR2                IN     DEFAULT
PROCEDURE END_LOGMNR
FUNCTION MINE_VALUE RETURNS VARCHAR2
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SQL_REDO_UNDO                  NUMBER                  IN     DEFAULT
 COLUMN_NAME                    VARCHAR2                IN     DEFAULT
PROCEDURE REMOVE_LOGFILE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 LOGFILENAME                    VARCHAR2                IN
PROCEDURE START_LOGMNR
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 STARTSCN                       NUMBER                  IN     DEFAULT
 ENDSCN                         NUMBER                  IN     DEFAULT
 STARTTIME                      DATE                    IN     DEFAULT
 ENDTIME                        DATE                    IN     DEFAULT
 DICTFILENAME                   VARCHAR2                IN     DEFAULT
 OPTIONS                        BINARY_INTEGER          IN     DEFAULT

SQL> select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/opt/oracle/oradata/irmdb/redo03.log
/opt/oracle/oradata/irmdb/redo02.log
/opt/oracle/oradata/irmdb/redo01.log

建立分析列表:
SQL>exec dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/oradata/irmdb/redo01.log',Options=>dbms_logmnr.new);

PL/SQL procedure successfully completed.

SQL>exec dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/oradata/irmdb/redo02.log',Options=>dbms_logmnr.ADDFILE);

PL/SQL procedure successfully completed.

SQL>exec dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/oradata/irmdb/redo03.log',Options=>dbms_logmnr.ADDFILE);

PL/SQL procedure successfully completed.
這樣不僅僅建立了日誌分析列表,同時還添加了兩個日誌成員檔案。

通過觀察v$logmnr_logs動態效能檢視我們可以看到分析列表中目前的日誌成員:
SQL>select filename from v$logmnr_logs;

FILENAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/irmdb/redo02.log
/opt/oracle/oradata/irmdb/redo03.log
/opt/oracle/oradata/irmdb/redo01.log

SQL> exec dbms_logmnr.remove_logfile('/opt/oracle/oradata/irmdb/redo02.log');

PL/SQL procedure successfully completed.

SQL> select filename from v$logmnr_logs;

FILENAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/irmdb/redo03.log
/opt/oracle/oradata/irmdb/redo01.log

SQL> exec dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/oradata/irmdb/redo02.log',Options=>dbms_logmnr.ADDFILE);

PL/SQL procedure successfully completed.

3.利用LogMnr進行日誌挖掘和分析:
挖掘和分析分為兩種情況,一種是利用資料字典檔案對所有分析列表中的日誌內容進行分析,另外一種是利用資料字典檔案並帶有某種的限制條件對日誌內容進行分析,比如從某個時間點到某個時間點日誌內容的分析:

這裡列出一下dbms_logmnr.start_logmnr的結構:
PROCEDURE START_LOGMNR
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 STARTSCN                       NUMBER                  IN     DEFAULT
 ENDSCN                         NUMBER                  IN     DEFAULT
 STARTTIME                      DATE                    IN     DEFAULT
 ENDTIME                        DATE                    IN     DEFAULT
 DICTFILENAME                   VARCHAR2                IN     DEFAULT
 OPTIONS                        BINARY_INTEGER          IN     DEFAULT

對第一種情況進行分析:
-----------------------------------------
SQL>exec dbms_logmnr.start_logmnr(DictFileName=>'/opt/oracle/product/10g/logmnr/alan_dict.ora');

PL/SQL procedure successfully completed.
分析完畢後所有分析的內容都儲存到了GV$LOGMNR_CONTENTS動態效能檢視裡面,我們可以通過如下SQL來查詢我們感興趣的內容。

select scn,timestamp,log_id,seg_owner,seg_type,
table_space,data_blk#,data_obj#,data_objd#,
session#,serial#,username,session_info,
sql_redo,sql_undo from GV$LOGMNR_CONTENTS t
where t.sql_redo like 'create%';

最後我們可以釋放記憶體:
SQL> exec dbms_logmnr.end_logmnr;

PL/SQL procedure successfully completed.

對第二種情況進行分析:
----------------------------------------
同時我們可以利用scn或time做為分析的限制條件,比如我們要分析日誌列表中時間從08.04.13從10:00到15:00的內容。
SQL>exec dbms_logmnr.start_logmnr
(startTime => to_date('20080413100000','yyyy-mm-dd hh24:mi:ss'),
endTime => to_date('20080413150000','yyyy-mm-dd hh24:mi:ss'),
DictFileName=>'/opt/oracle/product/10g/logmnr/alan_dict.ora');

PL/SQL procedure successfully completed

之後的操作就是查詢v$logmnr_contents或者gv$logmnr_contents視圖並進一步的分析

同時不要忘記最後釋放記憶體:
SQL>exec dbms_logmnr.end_logmnr;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.