天天看點

使用LogMiner分析oracle的redo日志和歸檔

  Oracle LogMiner 是Oracle公司從産品8i以後提供的一個實際非常有用的分析工具,使用該工具可以輕松獲得Oracle 線上/歸檔日志檔案中的具體内容,特别是該工具可以分析出所有對于資料庫操作的DML和DDL語句。該工具特别适用于調試、審計或者回退某個特定的事務。

  LogMiner分析工具實際上是由一組PL/SQL包和一些動态視圖(Oracle8i内置包的一部分)組成,它作為Oracle資料庫的一部分來釋出是8i産品提供的一個完全免費的工具。但該工具和其他Oracle内建工具相比使用起來顯得有些複雜,主要原因是該工具沒有提供任何的圖形使用者界面(GUI)。

1、安裝LogMiner

在使用LogMiner之前需要确認Oracle是否帶有進行LogMiner分析包,一般來說Windows作業系統Oracle10g以上都預設包含。如果不能确認,可以DBA身份登入系統,檢視系統中是否存在運作LogMiner所需要的dbms_logmnr、dbms_logmnr_d包,如果沒有需要安裝LogMiner工具,必須首先要運作下面這樣兩個腳本:

a.$ORACLE_HOME/rdbms/admin/dbmslm.sql

b.$ORACLE_HOME/rdbms/admin/dbmslmd.sql

這兩個腳本必須均以DBA使用者身份運作。其中第一個腳本用來建立DBMS_LOGMNR包,該包用來分析日志檔案。第二個腳本用來建立DBMS_LOGMNR_D包,該包用來建立資料字典檔案。

2、修改資料庫參數

--資料庫版本
sys@ORCL>select * from v$version;

BANNER
-----------------------------------------------------------
CORE	11.2.0.4.0	Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
--為資料庫添加最小附加日志
sys@ORCL>alter database add supplemental log data;

Database altered.

sys@ORCL>select supplemental_log_data_min from v$database;

SUPPLEMENTAL_LOG_DATA_MI
------------------------
YES
--設定utl_file_dir參數
sys@ORCL>alter system set utl_file_dir='/home/oracle/logminer' scope=spfile;

System altered.
--重新開機資料庫
sys@ORCL>shutdown immediate
sys@ORCL>startup
sys@ORCL>show parameter utl_file_dir

NAME				     TYPE			       VALUE
------------------------------------ --------------------------------- ------------------------------
utl_file_dir			     string			       /home/oracle/logminer      

3、準備測試資料

sys@ORCL>conn zx/zx
Connected.
zx@ORCL>create table log_miner (id number,name varchar2(10));

Table created.

zx@ORCL>insert into log_miner values(1,'zx');

1 row created.

zx@ORCL>insert into log_miner values(1,'lx');

1 row created.

zx@ORCL>insert into log_miner values(1,'xx');

1 row created.

zx@ORCL>commit;

Commit complete.      

4、建立資料字典

zx@ORCL>conn / as sysdba
Connected.
sys@ORCL>desc dbms_logmnr_d
PROCEDURE BUILD
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 DICTIONARY_FILENAME		VARCHAR2		IN     DEFAULT
 DICTIONARY_LOCATION		VARCHAR2		IN     DEFAULT
 OPTIONS			NUMBER			IN     DEFAULT
PROCEDURE SET_TABLESPACE
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 NEW_TABLESPACE 		VARCHAR2		IN

sys@ORCL>exec dbms_logmnr_d.build(DICTIONARY_FILENAME=>'dictionary.ora',DICTIONARY_LOCATION=>'/home/oracle/logminer');
LogMnr Dictionary Procedure started
LogMnr Dictionary File Opened
Procedure executed successfully - LogMnr Dictionary Created

PL/SQL procedure successfully completed.

sys@ORCL>!ls -l /home/oracle/logminer/dictionary.ora
-rw-r--r-- 1 oracle oinstall 41483316 Nov 11 21:08 /home/oracle/logminer/dictionary.ora      

LogMiner工具實際上是由兩個新的PL/SQL内建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動态性能視圖(視圖是在利用過程DBMS_LOGMNR.START_LOGMNR啟動LogMiner時建立)組成。在使用LogMiner工具分析redo log檔案之前,可以使用DBMS_LOGMNR_D 包将資料字典導出為一個文本檔案。該字典檔案是可選的,但是如果沒有它,LogMiner解釋出來的語句中關于資料字典中的部分(如表名、列名等)和數值都将是16進制的形式,我們是無法直接了解的。例如,下面的sql語句:

INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '張三');

LogMiner解釋出來的結果将是下面這個樣子:

insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65'));

建立資料字典的目的就是讓LogMiner引用涉及到内部資料字典中的部分時為他們實際的名字,而不是系統内部的16進制。資料字典檔案是一個文本檔案,使用包DBMS_LOGMNR_D來建立。如果我們要分析的資料庫中的表有變化,影響到庫的資料字典也發生變化,這時就需要重新建立該字典檔案。另外一種情況是在分析另外一個資料庫檔案的重作日志時,也必須要重新生成一遍被分析資料庫的資料字典檔案。

5、确認目前處理聯機狀态的redo日志

sys@ORCL>select group#,status from v$log;

    GROUP# STATUS
---------- ------------------------------------------------
	 1 INACTIVE
	 2 CURRENT
	 3 INACTIVE
sys@ORCL>select group#,member from v$logfile;

    GROUP# MEMBER
---------- ----------------------------------------------------------------------------------------------------
	 3 /u02/app/oracle/oradata/orcl/redo03.log
	 2 /u02/app/oracle/oradata/orcl/redo02.log
	 1 /u02/app/oracle/oradata/orcl/redo01.log      

可以看出redo02處于current狀态

6、加入需要分析的日志

--第一個日志檔案使用dbms_logmnr.new
sys@ORCL>exec dbms_logmnr.add_logfile(LOGFILENAME=>'/u02/app/oracle/oradata/orcl/redo02.log',OPTIONS=>dbms_logmnr.new);

PL/SQL procedure successfully completed.
--如果需要加入其他的日志使用如下語句
exec dbms_logmnr.add_logfile(LOGFILENAME=>'/u02/app/oracle/oradata/orcl/redo03.log',OPTIONS=>dbms_logmnr.addfile);      

7、使用LogMiner進行分析

sys@ORCL>exec dbms_logmnr.start_logmnr(DICTFILENAME=>'/home/oracle/logminer/dictionary.ora');

PL/SQL procedure successfully completed.

sys@ORCL>col seg_name for a15
sys@ORCL>col seg_owner for a15
sys@ORCL>col operation for a20
sys@ORCL>col sql_redo for a180
sys@ORCL>set linesize 200
sys@ORCL>select seg_owner,seg_name,operation,sql_redo from v$logmnr_contents where seg_owner='ZX' and seg_name='LOG_MINER';

SEG_OWNER	SEG_NAME	OPERATION	     SQL_REDO
--------------- --------------- -------------------- --------------------------------------------------------------------------------
ZX		LOG_MINER	DDL		     create table log_miner (id number,name varchar2(10));
ZX		LOG_MINER	INSERT		     insert into "ZX"."LOG_MINER"("ID","NAME") values ('1','zx');
ZX		LOG_MINER	INSERT		     insert into "ZX"."LOG_MINER"("ID","NAME") values ('1','lx');
ZX		LOG_MINER	INSERT		     insert into "ZX"."LOG_MINER"("ID","NAME") values ('1','xx');      

以上為分析線上redo日志的過程,分析歸檔日志的步驟同樣,隻是在添加日志檔案的時候把線上redo日志換為歸檔日志即可。歸檔日志也可以傳輸到其他資料庫伺服器上進行資料分析,但分析時需要使用源庫的字典檔案。

LogMiner使用注意事項:

  1. 源庫與Mining資料庫必須運作在同樣的硬體平台上,windows的不可以傳到Linux上進行分析
  2. Mining資料庫的版本大于等于源庫的資料庫版本