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

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

2013-11-13 16:06:06  來源: Oracle 

  如何利用LogMiner分析Oracle的日志文件
  雖然說LogMiner是Oraclei才推出來但我們同樣可以用它來分析Oracle的日志文件只不過稍微麻煩了一點並且有一定的限制下面是具體做法
  
  我們首先復制Oraclei的$ORACLE_HOME/rdbms/admin/dbmslmdsql腳本到Oracle數據庫所在主機的同樣目錄這個腳本用於創建dbms_logmnr_d包(注意Oraclei中還將創建dbms_logmnr包)如果是腳本名字為dbmslogmnrdsql然後在Oracle的數據庫上運行這個腳本之後使用dbms_logmnr_dbuild過程創建字典信息文件現在我們就可以把Oracle的歸檔日志連同這個字典信息文件復制到Oraclei數據庫所在的主機上之後在Oraclei數據庫中從上面分析過程的第三步開始分析Oracle的日志不過
  
  dbms_logmnrstart_logmnr()中使用的是Oracle的字典信息文件
  
  按照我前面所說的那樣如果不是字典文件我們則可以直接將Oracle的歸檔日志復制到Oraclei數據庫所在主機然後對它進行分析
  
  其實這裡涉及到了一個跨平台使用LogMiner的問題筆者做過試驗也可以在Oraclei中來分析Oraclei的日志但這些都是有所限制的主要表現在
  
  LogMiner所使用的字典文件必須和所分析的日志文件是同一個數據庫所產生的並且該數據庫的字符集應和執行LogMiner數據庫的相同這很好理解如果不是同一個數據庫所產生就不存在對應關系了
  
  生成日志的數據庫硬件平台和執行LogMiner數據庫的硬件平台要求一致操作系統版本可以不一致筆者做試驗時(如果讀者有興趣可以到我網站上下載試驗全過程因為太長就不放在這裡了)所用的兩個數據庫操作系統都是Tru UNIX但一個是 VA另一個則是VF如果操作系統不一致則會出現下面的錯誤
  
  ORA: file /data/cyx/logmnr/arch__arc cannot be opened
  ORA: cannot open archived log /data/cyx/logmnr/arch__arc
  ORA: skgfifi: file header information is invalid
  ORA: at SYSDBMS_LOGMNR line
  ORA: at line
  
  分析v$logmnr_contents
  前面我們已經知道了LogMiner的分析結果是放在v$logmnr_contents中這裡面有很多信息我們可以根據需要追蹤我們感興趣的信息那麼我們通常感興趣的有哪些呢?
  
  追蹤數據庫結構變化情況即DDL操作如前所述這個只有Oraclei才支持
  
  SQL> select timestampsql_redo from v$logmnr_contents
  where upper(sql_redo) like %CREATE%;
  TIMESTAMP
  
  SQL_REDO
  
   ::
  create table t (c number);
  
  追蹤用戶誤操作或惡意操作
  
  例如我們現實中有這樣需求有一次我們發現一位員工通過程序修改了業務數據庫信息把部分電話的收費類型改成免費了現在就要求我們從數據庫中查出到底是誰干的這件事?怎麼查?LogMiner提供了我們分析日志文件的手段其中v$logmnr_contents的SESSION_INFO列包含了下面的信息
  
  login_username=NEW_
  client_info= OS_username=oracle Machine_name=phoenix
   OS_terminal=ttyp OS_process_id= OS_program name=sqlplus@phoenix
   (TNS VV)
  
  雖然其中信息已經很多了但在我們的業務數據庫中程序是通過相同的login_username登錄數據庫的這樣單從上面的信息是很難判斷的
  
  不過我們注意到因為公司應用服務器不是每個人都有權限在上面寫程序的一般惡意程序都是直接通過他自己的PC連到數據庫的這就需要一個准確的定位IP追蹤是我們首先想到的並且也滿足我們的實際要求因為公司內部IP地址分配是統一管理的能追蹤到IP地址我們就可以准確定位了但從面的SESSION_INFO中我們並不能直接看到IP不過我們還是有辦法的因為這個SESSION_INFO裡面的內容其實是日志從V$SESSION視圖裡提取的我們可以在生產數據庫中創建一個追蹤客戶端IP地址的觸發器
  
  create or replace trigger on_logon_trigger
  after logon on database
  begin
   dbms_application_infoset_client_info(sys_context(userenv ip_address));
  end;
  /
  
  現在我們就可以在V$SESSION視圖的CLIENT_INFO列中看到新登錄的客戶端IP地址了那麼上面的提出的問題就可以迎刃而解了假如被更新的表名為HMLX我們就可以通過下面的SQL來找到所需信息
  
  SQL > select session_info sql_redo from v$logmnr_contents
   where upper(operation) = UPDATE and upper(sql_redo) like %HMLX%
   /
  SESSION_INFO
  
  SQL_REDO
  
  login_username=C client_info= OS_username=szxjschengyx Machine_name
  =GDTEL\SZXJSCHENGYX
  update CHMLX set NAME = free where NAME = and ROWID = AAABhTAA
  FAAABRaAAE;
From:http://tw.wingwit.com/Article/program/Oracle/201311/17810.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.