熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

深入分析Oracle數據庫日志文件(1)

2013-11-13 22:23:13  來源: Oracle 

  作為Oracle DBA我們有時候需要追蹤數據誤刪除或用戶的惡意操作情況此時我們不僅需要查出執行這些操作的數據庫賬號還需要知道操作是由哪台客戶端(IP地址等)發出的針對這些問題一個最有效實用而又低成本的方法就是分析Oracle數據庫的日志文件本文將就Oracle日志分析技術做深入探討
  
  如何分析即LogMiner解釋
  從目前來看分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner來進行 Oracle數據庫的所有更改都記錄在日志中但是原始的日志信息我們根本無法看懂而LogMiner就是讓我們看懂日志信息的工具從這一點上看它和tkprof差不多一個是用來分析日志信息一個則是格式化跟蹤文件通過對日志的分析我們可以實現下面的目的
  
  查明數據庫的邏輯更改
  
  偵察並更正用戶的誤操作
  
  執行事後審計
  
  執行變化分析
  
  不僅如此日志中記錄的信息還包括數據庫的更改歷史更改類型(INSERTUPDATEDELETEDDL等)更改對應的SCN號以及執行這些操作的用戶信息等LogMiner在分析日志時將重構等價的SQL語句和UNDO語句(分別記錄在V$LOGMNR_CONTENTS視圖的SQL_REDO和SQL_UNDO中)這裡需要注意的是等價語句而並非原始SQL語句例如我們最初執行的是delete a where c <>cyx;而LogMiner重構的是等價的條DELETE語句所以我們應該意識到V$LOGMNR_CONTENTS視圖中顯示的並非是原版的現實從數據庫角度來講這是很容易理解的它記錄的是元操作因為同樣是delete a where c <>cyx;語句在不同的環境中實際刪除的記錄數可能各不相同因此記錄這樣的語句實際上並沒有什麼實際意義LogMiner重構的是在實際情況下轉化成元操作的多個單條語句
  
  另外由於Oracle重做日志中記錄的並非原始的對象(如表以及其中的列)名稱而只是它們在Oracle數據庫中的內部編號(對於表來說是它們在數據庫中的對象ID而對於表中的列來說對應的則是該列在表中的排列序號COL COL 等)因此為了使LogMiner重構出的SQL語句易於識別我們需要將這些編號轉化成相應的名稱這就需要用到數據字典(也就說LogMiner本身是可以不用數據字典的詳見下面的分析過程)LogMiner利用DBMS_LOGMNR_DBUILD()過程來提取數據字典信息
  
  LogMiner包含兩個PL/SQL包和幾個視圖
  
  dbms_logmnr_d包這個包只包括一個用於提取數據字典信息的過程即dbms_logmnr_dbuild()過程
  
  dbms_logmnr包它有三個過程
  
  add_logfile(name varchar options number) 用來添加/刪除用於分析的日志文件
  
  start_logmnr(start_scn number end_scn number start_time numberend_time number dictfilename varchar options number) 用來開啟日志分析同時確定分析的時間/SCN窗口以及確認是否使用提取出來的數據字典信息
  
  end_logmnr() 用來終止分析會話它將回收LogMiner所占用的內存
  
  與LogMiner相關的數據字典
  
  v$logmnr_dictionaryLogMiner可能使用的數據字典信息因logmnr可以有多個字典文件該視圖用於顯示這方面信息
  
  v$logmnr_parameters當前LogMiner所設定的參數信息
  
  v$logmnr_logs當前用於分析的日志列表
  
  v$logmnr_contents日志分析結果
  
  Oraclei LogMiner的增強
  支持更多數據/存儲類型鏈接/遷移行CLUSTER表操作DIRECT PATH插入以及DDL操作在V$LOGMNR_CONTENTS的SQL_REDO中可以看到DDL操作的原句(CREATE USER除外其中的密碼將以加密的形式出現而不是原始密碼)如果TX_AUDITING初始化參數設為TRUE則所有操作的數據庫賬號將被記錄
  
  提取和使用數據字典的選項現在數據字典不僅可以提取到一個外部文件中還可以直接提取到重做日志流中它在日志流中提供了操作當時的數據字典快照這樣就可以實現離線分析
  
  允許對DML操作按事務進行分組可以在START_LOGMNR()中設置COMMITTED_DATA_ONLY選項實現對DML操作的分組這樣將按SCN的順序返回已經提交的事務
  
  支持SCHEMA的變化在數據庫打開的狀態下如果使用了LogMiner的DDL_DICT_TRACKING選項Oraclei的LogMiner將自動對比最初的日志流和當前系統的數據字典並返回正確的DDL語句並且會自動偵察並標記當前數據字典和最初日志流之間的差別這樣即使最初日志流中所涉及的表已經被更改或者根本已經不存在LogMiner同樣會返回正確的DDL語句
  
  在日志中記錄更多列信息的能力例如對於UPDATE操作不僅會記錄被更新行的情況還可以捕捉更多前影信息
  
  支持基於數值的查詢Oraclei LogMiner在支持原有基於元數據(操作對象等)查詢的基礎上開始支持基於實際涉及到的數據的查詢例如涉及一個工資表現在我們可以很容易地查出員工工資由變成的原始更新語句而在之前我們只能選出所有的更新語句
  
  Oraclei/i的日志分析過程
  LogMiner只要在實例起來的情況下都可以運行LogMiner使用一個字典文件來實現Oracle內部對象名稱的轉換如果沒有這個字典文件則直接顯示內部對象編號例如我們執行下面的語句
  
  delete from CA where C = gototop and ROWID = AAABgAAFAAABQaAAH;
  如果沒有字典文件LogMiner分析出來的結果將是
  delete from UNKNOWNOBJ# where COL = HEXTORAW(dadae) and ROWID
   = AAABgAAFAAABQaAAH;
  
  如果想要使用字典文件數據庫至少應該出於MOUNT狀態然後執行dbms_logmnr_dbuild過程將數據字典信息提取到一個外部文件中下面是具體分析步驟
  
  確認設置了初始化參數UTL_FILE_DIR並確認Oracle對改目錄擁有讀寫權限然後啟動實例示例中UTL_FILE_DIR參數如下
  
  SQL> show parameter utl
  NAME             TYPE    value
  
  utl_file_dir         string   /data/cyx/logmnr
  
  這個目錄主要用於存放dbms_logmnr_dbuild過程所產生的字典信息文件如果不用這個則可以不設也就跳過下面一步
  
  生成字典信息文件
  
  exec dbms_logmnr_dbuild(dictionary_filename =>
  dicoradictionary_location => /data/cyx/logmnr);
  
  其中dictionary_location指的是字典信息文件的存放位置它必須完全匹配UTL_FILE_DIR的值例如假設UTL_FILE_DIR=/data/cyx/logmnr/則上面這條語句會出錯只因為UTL_FILE_DIR後面多了一個/而在很多其它地方對這一/是不敏感的
  
  dictionary_filename指的是放於字典信息文件的名字可以任意取當然我們也可以不明確寫出這兩個選項即寫成
  
  exec dbms_logmnr_dbuild(dicora/data/cyx/logmnr);
  
  如果你第一步的參數沒有設而直接開始這一步Oracle會報下面的錯誤
  
  ERROR at line :
  ORA: initialization parameter utl_file_dir is not set
  ORA: at SYSDBMS_LOGMNR_D line
  ORA: at SYSDBMS_LOGMNR_D line
  ORA: at line
  
  需要注意的是在oracle for Windows版中會出現以下錯誤
  
  :: SQL> execute dbms_logmnr_dbuild(oradictorac:\oracle\admin\ora\log);
  BEGIN dbms_logmnr_dbuild(oradictorac:\oracle\admin\ora\log); END;
  *
  ERROR at line :
  ORA: Subscript outside of limit
  ORA: at SYSDBMS_LOGMNR_D line
  ORA: at line
  
  解決辦法
  
  編輯$ORACLE_HOME/rdbms/admindbmslmdsql文件把其中的
  TYPE col_desc_array IS VARRAY() OF col_description;
  改成
  TYPE col_desc_array IS VARRAY() OF col_description;
  
  保存文件然後執行一遍這個腳本
  
  :: SQL> @c:\oracle\ora\rdbms\admin\dbmslmdsql
  Package created
  Package body created
  No errors
  Grant succeeded
  
  然後重新編譯DBMS_LOGMNR_D包
  
  :: SQL> alter package DBMS_LOGMNR_D compile body;
  Package body altered
  之後重新執行dbms_logmnr_dbuild即可
  :: SQL> execute dbms_logmnr_dbuild(oradictorac:\oracle\admin\ora\log);
  PL/SQL procedure successfully completed
  
  添加需要分析的日志文件
  
  SQL>exec dbms_logmnradd_logfile( logfilename=>
  /data/cyx/racarch/arch__arc options=>dbms_logmnrnew);
  PL/SQL procedure successfully completed
  
  這裡的options選項有三個參數可以用
  
  NEW 表示創建一個新的日志文件列表
  
  ADDFILE 表示向這個列表中添加日志文件如下面的例子
  
  REMOV
From:http://tw.wingwit.com/Article/program/Oracle/201311/18949.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.