一、如何分析即LogMiner解釋
從目前來看,分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner來進行, Oracle數據庫的所有更改都記錄在日志中,但是原始的日志信息我們根本無法看懂,而LogMiner就是讓我們看懂日志信息的工具。從這一點上看,它和tkprof差不多,一個是用來分析日志信息,一個則是格式化跟蹤文件。通過對日志的分析我們可以實現下面的目的:
1、查明數據庫的邏輯更改;
2、偵察並更正用戶的誤操作;
3、執行事後審計;
4、執行變化分析。
另外由於Oracle重做日志中記錄的並非原始的對象(如表以及其中的列)名稱,而只是它們在Oracle數據庫中的內部編號(對於表來說是它們在數據庫中的對象ID,而對於表中的列來說,對應的則是該列在表中的排列序號:COL 1, COL 2 等),因此為了使LogMiner重構出的SQL語句易於識別,我們需要將這些編號轉化成相應的名稱,這就需要用到數據字典(也就說LogMiner本身是可以不用數據字典的,詳見下面的分析過程),LogMiner利用DBMS_LOGMNR_D.BUILD()過程來提取數據字典信息。
LogMiner包含兩個PL/SQL包和幾個視圖:
1、dbms_logmnr_d包,這個包只包括一個用於提取數據字典信息的過程,即dbms_logmnr_d.build()過程。
2、dbms_logmnr包,它有三個過程:
add_logfile(name varchar2, options number) - 用來添加/刪除用於分析的日志文件;
start_logmnr(start_scn number, end_scn number, start_time number,end_time number, dictfilename varchar2, options number) - 用來開啟日志分析,同時確定分析的時間/SCN窗口以及確認是否使用提取出來的數據字典信息。
end_logmnr() - 用來終止分析會話,它將回收LogMiner所占用的內存。
與LogMiner相關的數據字典。
1、v$logmnr_dictionary,LogMiner可能使用的數據字典信息,因logmnr可以有多個字典文件,該視圖用於顯示這方面信息。
2、v$logmnr_parameters,當前LogMiner所設定的參數信息。
3、v$logmnr_logs,當前用於分析的日志列表。
4、v$logmnr_contents,日志分析結果。
delete from "C"."A" where "C1" = ‘gototop’ and ROWID = 'AAABg1AAFAAABQaAAH'; 如果沒有字典文件,LogMiner分析出來的結果將是: delete from "UNKNOWN"."OBJ# 6197" where "COL 1" = HEXTORAW('d6a7d4ae') and ROWID = 'AAABg1AAFAAABQaAAH';
SQL> show parameter utl NAME TYPE VALUE ------------------------ ----------- ------------------------------ utl_file_dir string /data6/cyx/logmnr
_CODE>
exec dbms_logmnr_d.build(dictionary_filename =>' dic.ora',dictionary_location => '/data6/cyx/logmnr');
exec dbms_logmnr_d.build('dic.ora','/data6/cyx/logmnr');
ERROR at line 1: ORA-01308: initialization parameter utl_file_dir is not set ORA-06512: at "SYS.DBMS_LOGMNR_D", line 923 ORA-06512: at "SYS.DBMS_LOGMNR_D", line 1938 ORA-06512: at line 1
14:26:05 SQL> execute dbms_logmnr_d.build('oradict.ora','c:\oracle\admin\ora\log'); BEGIN dbms_logmnr_d.build('oradict.ora','c:\Oracle\admin\ora\log'); END; * ERROR at line 1: ORA-06532: Subscript outside of limit ORA-06512: at "SYS.DBMS_LOGMNR_D", line 793 ORA-06512: at line 1
cellPadding=2 width=400 align=center borderColorLight=black border=1>
編輯"$Oracle_HOME/rdbms/admindbmslmd.sql"文件,把其中的 TYPE col_desc_array IS VARRAY(513) OF col_description; 改成: TYPE col_desc_array IS VARRAY(700) OF col_description;
15:09:06 SQL> @c:\Oracle\ora81\rdbms\admin\dbmslmd.sql Package created. Package body created. No errors. Grant succeeded.
15:09:51 SQL> alter package DBMS_LOGMNR_D compile body; Package body altered. 之後重新執行dbms_logmnr_d.build即可: 15:10:06 SQL> execute dbms_logmnr_d.build('oradict.ora','c:\Oracle\admin\ora\log'); PL/SQL procedure successfully completed.
SQL>exec dbms_logmnr.add_logfile( logfilename=>' /data6/cyx/rac1arch/arch_1_197.arc', options=>dbms_logmnr.new); PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.add_logfile( logfilename=>' /data6/cyx/rac1arch/arch_2_86.arc',
options=>dbms_logmnr.addfile); PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora'); PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.start_logmnr(); PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora' , - starttime => '2003-09-21 09:39:00',endtime => '2003-09-21 09:45:00'); PL/SQL procedure successfully completed.
SQL> select distinct timestamp from v$logmnr_contents; TIMESTAMP ------------------- 2003-09-21 09:40:02 2003-09-21 09:42:39
SQL> !env grep NLS NLS_LANG=american_america.zhs16cgb231280 NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS ORA_NLS33=/oracle/oracle9/app/Oracle/product/9.2.0/ocommon/nls/admin/data 使用to_date的格式如下: exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora',- starttime => to_date('2003-09-21 09:39:00','YYYY-MM-DD HH24:MI:SS'),- endtime => to_date('2003-09-21 09:45:00','YYYY-MM-DD HH24:MI:SS'));