四如何利用LogMiner分析Oracle的日志文件 雖然說LogMiner是Oracle
i才推出來
但我們同樣可以用它來分析Oracle
的日志文件
只不過稍微麻煩了一點
並且有一定的限制
下面是具體做法
我們首先復制Oracle
i的$ORACLE_HOME/rdbms/admin/dbmslmd
sql腳本到Oracle
數據庫所在主機的同樣目錄
這個腳本用於創建dbms_logmnr_d包(注意
Oracle
i中還將創建dbms_logmnr包)
如果是
腳本名字為dbmslogmnrd
sql
然後在Oracle
的數據庫上運行這個腳本
之後使用dbms_logmnr_d
build過程創建字典信息文件
現在我們就可以把Oracle
的歸檔日志連同這個字典信息文件復制到Oracle
i數據庫所在的主機上
之後在Oracle
i數據庫中從上面分析過程的第三步開始分析Oracle
的日志
不過
dbms_logmnr
start_logmnr()中使用的是Oracle
的字典信息文件
按照我前面所說的那樣
如果不是字典文件
我們則可以直接將Oracle
的歸檔日志復制到Oracle
i數據庫所在主機
然後對它進行分析
其實這裡涉及到了一個跨平台使用LogMiner的問題
筆者做過試驗
也可以在Oracle
i中來分析Oracle
i的日志
但這些都是有所限制的
主要表現在
LogMiner所使用的字典文件必須和所分析的日志文件是同一個數據庫所產生的
並且該數據庫的字符集應和執行LogMiner數據庫的相同
這很好理解
如果不是同一個數據庫所產生就不存在對應關系了
生成日志的數據庫硬件平台和執行LogMiner數據庫的硬件平台要求一致
操作系統版本可以不一致
筆者做試驗時(如果讀者有興趣可以到我網站上下載試驗全過程
因為太長就不放在這裡了)
所用的兩個數據庫操作系統都是Tru
UNIX
但一個是 V
A
另一個則是V
F
如果操作系統不一致則會出現下面的錯誤
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
SYS
DBMS_LOGMNR
line
ORA
: at line
五分析v$logmnr_contents 前面我們已經知道了LogMiner的分析結果是放在v$logmnr_contents中
這裡面有很多信息
我們可以根據需要追蹤我們感興趣的信息
那麼我們通常感興趣的有哪些呢?
追蹤數據庫結構變化情況
即DDL操作
如前所述
這個只有Oracle
i才支持
SQL> select timestamp
sql_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 V
V
)
雖然其中信息已經很多了
但在我們的業務數據庫中
程序是通過相同的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_info
set_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=sz
xjs
chengyx Machine_name
=GDTEL\SZ
XJS
CHENGYX
update
C
HMLX
set
NAME
=
free
where
NAME
=
and ROWID =
AAABhTAA
FAAABRaAAE
;
From:http://tw.wingwit.com/Article/program/Oracle/201311/17810.html