oralce資料庫日誌檢視方法(整理轉載自網路)

浪漫雙魚發表於2007-12-21

如何分析即LogMiner解釋

分析Oracle日誌的方法就是使用Oracle公司提供的LogMiner來進行, Oracle資料庫的所有更改都記錄在日誌中,但是原始的日誌資訊我們根本無法看懂,而LogMiner就是讓我們看懂日誌資訊的工具。從這一點上看,它和tkprof差不多,一個是用來分析日誌資訊,一個則是格式化跟蹤檔案。通過對日誌的分析我們可以實現下面的目的:
  1、查明資料庫的邏輯更改;
  2、偵察並更正使用者的誤操作;
  3、執行事後審計;
  4、執行變化分析。
  不僅如此,日誌中記錄的資訊還包括:資料庫的更改歷史、更改型別(INSERTUPDATEDELETEDDL等)、更改對應的SCN號、以及執行這些操作的使用者資訊等,LogMiner在分析日誌時,將重構等價的SQL語句和UNDO語句(分別記錄在V$LOGMNR_CONTENTS檢視的SQL_REDOSQL_UNDO)。這裡需要注意的是等價語句,而並非原始SQL語句,例如:我們最初執行的是“delete a where c1 <>'cyx';”,而LogMiner重構的是等價的6DELETE語句。所以我們應該意識到V$LOGMNR_CONTENTS檢視中顯示的並非是原版的現實,從資料庫角度來講這是很容易理解的,它記錄的是元操作,因為同樣是“delete a where c1 <>'cyx';”語句,在不同的環境中,實際刪除的記錄數可能各不相同,因此記錄這樣的語句實際上並沒有什麼實際意義,LogMiner重構的是在實際情況下轉化成元操作的多個單條語句。
  另外由於Oracle重做日誌中記錄的並非原始的物件(如表以及其中的列)名稱,而只是它們在Oracle資料庫中的內部編號(對於表來說是它們在資料庫中的物件ID,而對於表中的列來說,對應的則是該列在表中的排列序號:COL 1, COL 2 等),因此為了使LogMiner重構出的SQL語句易於識別,我們需要將這些編號轉化成相應的名稱,這就需要用到資料字典(也就說LogMiner本身是可以不用資料字典的,詳見下面的分析過程),LogMiner利用DBMS_LOGMNR_D.BUILD()過程來提取資料字典資訊。
  LogMiner包含兩個PL/SQL包和幾個檢視:

1dbms_logmnr_d包,這個包只包括一個用於提取資料字典資訊的過程,即dbms_logmnr_d.build()過程。
  2dbms_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相關的資料字典。
  1v$logmnr_dictionaryLogMiner可能使用的資料字典資訊,因logmnr可以有多個字典檔案,該檢視用於顯示這方面資訊。
  2v$logmnr_parameters,當前LogMiner所設定的引數資訊。
  3v$logmnr_logs,當前用於分析的日誌列表。
  4v$logmnr_contents,日誌分析結果。
  二、Oracle9i LogMiner的增強:
  1、支援更多資料/儲存型別:連結/遷移行、CLUSTER表操作、DIRECT PATH插入以及DDL操作。在V$LOGMNR_CONTENTSSQL_REDO中可以看到DDL操作的原句(CREATE USER除外,其中的密碼將以加密的形式出現,而不是原始密碼)。如果TX_AUDITING初始化引數設為TRUE,則所有操作的資料庫賬號將被記錄。
  2、提取和使用資料字典的選項:現在資料字典不僅可以提取到一個外部檔案中,還可以直接提取到重做日誌流中,它在日誌流中提供了操作當時的資料字典快照,這樣就可以實現離線分析。
  3、允許對DML操作按事務進行分組:可以在START_LOGMNR()中設定COMMITTED_DATA_ONLY選項,實現對DML操作的分組,這樣將按SCN的順序返回已經提交的事務。
  4、支援SCHEMA的變化:在資料庫開啟的狀態下,如果使用了LogMinerDDL_DICT_TRACKING選項,Oracle9iLogMiner將自動對比最初的日誌流和當前系統的資料字典,並返回正確的DDL語句,並且會自動偵察並標記當前資料字典和最初日誌流之間的差別,這樣即使最初日誌流中所涉及的表已經被更改或者根本已經不存在,LogMiner同樣會返回正確的DDL語句。
  5、在日誌中記錄更多列資訊的能力:例如對於UPDATE操作不僅會記錄被更新行的情況,還可以捕捉更多前影資訊。
  6、支援基於數值的查詢:Oracle9i LogMiner在支援原有基於後設資料(操作、物件等)查詢的基礎上,開始支援基於實際涉及到的資料的查詢。例如涉及一個工資表,現在我們可以很容易地查出員工工資由1000變成2000的原始更新語句,而在之前我們只能選出所有的更新語句。
具體操作步驟如下:

一、安裝LogMiner工具,以下兩個指令碼以SYSDBA身份執行

@$ORACLE_HOME\rdbms\admin\dbmslm.sql;

@ $ORACLE_HOME\rdbms\admin\dbmslmd.sql; 

第一個指令碼用來建立DBMS_LOGMNR包,該包用來分析日誌檔案。
第二個指令碼用來建立DBMS_LOGMNR_D包,該包用來建立資料字典檔案。 

$oracle_home\rdbms\admin\catproc.sql建立所有的東西。

二、使用LogMiner工具 
    
LogMiner
只要在例項起來的情況下都可以執行,LogMiner使用一個字典檔案來實現Oracle內部物件名稱的轉換,如果沒有這個字典檔案,則直接顯示內部物件編號,例如我們執行下面的語句:
  delete from "C"."A" where "C1" = ‘gototop’ and ROWID = 'AAABg1AAFAAABQaAAH';
  如果沒有字典檔案,LogMiner分析出來的結果將是:
  delete from "UNKNOWN"."OBJ# 6197" where "COL 1" = HEXTORAW('d6a7d4ae') and ROWID
  = 'AAABg1AAFAAABQaAAH';
  如果想要使用字典檔案,資料庫至少應該處於MOUNT狀態。然後執行dbms_logmnr_d.build過程將資料字典資訊提取到一個外部檔案中。
下面將詳細介紹如何使用LogMiner工具。 

1
、建立資料字典檔案(data-dictionary 
  
  1).
首先在init.ora初始化引數檔案中,指定資料字典檔案的位置,也就是新增一個引數UTL_FILE_DIR,該引數值為伺服器中放置資料字典檔案的目錄。如:UTL_FILE_DIR = ($ORACLE_HOME\logs) ,重新啟動資料庫,使新加的引數生效: 

  2).
然後建立資料字典檔案
  exec dbms_logmnr_d.build(dictionary_filename =>'dic.ora',dictionary_location => '/data6/cyx/logmnr');
  其中dictionary_location指的是字典資訊檔案的存放位置,它必須完全匹配UTL_FILE_DIR的值,例如:假設UTL_FILE_DIR=/data6/cyx/logmnr/,則上面這條語句會出錯,只因為UTL_FILE_DIR後面多了一個“/”,而在很多其它地方對這一“/”是不敏感的。
  dictionary_filename的是放於字典資訊檔案的名字,可以任意取。當然我們也可以不明確寫出這兩個選項,即寫成:
  exec dbms_logmnr_d.build('dic.ora','/data6/cyx/logmnr');
  如果你第一步的引數沒有設,而直接開始這一步,Oracle會報下面的錯誤:
  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
2
、建立要分析的日誌檔案列表 

  1).
建立分析列表,即所要分析的日誌
    SQL> execute dbms_logmnr.add_logfile(LogFileName => 'G:\ORACLE\ORADATA\ORADBSP\REDO04.LOG',Options => dbms_logmnr.new);

    PL/SQL procedure successfully completeds
    
這裡的options選項有三個引數可以用:
  NEW - 表示建立一個新的日誌檔案列表
  ADDFILE - 表示向這個列表中新增日誌檔案,如下面的例子
  REMOVEFILE - addfile相反。
  2).
新增分析日誌檔案,一次新增1個為宜
    SQL> execute dbms_logmnr.add_logfile(LogFileName => 'G:\ORACLE\ORADATA\ORADBSP\REDO05.LOG',Options => dbms_logmnr.ADDFILE);

    PL/SQL procedure successfully completed

3
、使用logMiner進行日誌分析

   1).
無限制條件,即用資料字典檔案對要分析的日誌檔案所有內容做分析
     SQL> execute dbms_logmnr.start_logmnr(DictFileName => 'G:\oracle\logs\dict.ora');

     PL/SQL procedure successfully completed
     
   2).
帶限制條件,可以用scn號或時間做限制條件,也可組合使用
     --
分析日誌列表中時間從07.02.2810:0015:00的內容
     SQL> execute dbms_logmnr.start_logmnr(startTime => to_date('20070228100000','yyyy-mm-dd hh24:mi:ss'),endTime => to_date('20070228150000','yyyy-mm-dd hh24:mi:ss'),DictFileName => 'G:\oracle\logs\dict.ora');

    PL/SQL procedure successfully completed

  dbms_logmnr.start_logmnr
函式的原型為:
  PROCEDURE start_logmnr(
     startScn           IN  NUMBER default 0 ,
     endScn  IN  NUMBER default 0,
     startTime       IN  DATE default '',
     endTime         IN  DATE default '',
     DictFileName     IN  VARCHAR2 default '',
     Options IN  BINARY_INTEGER default 0 ); 
4.
分析後釋放記憶體
   SQL> execute dbms_logmnr.end_logmnr;
5.

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

相關文章