作為Oracle DBA
我們有時候需要追蹤數據誤刪除或用戶的惡意操作情況
此時我們不僅需要查出執行這些操作的數據庫賬號
還需要知道操作是由哪台客戶端(IP地址等)發出的
針對這些問題
一個最有效實用而又低成本的方法就是分析Oracle數據庫的日志文件
本文將就Oracle日志分析技術做深入探討
一如何分析即LogMiner解釋 從目前來看
分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner來進行
Oracle數據庫的所有更改都記錄在日志中
但是原始的日志信息我們根本無法看懂
而LogMiner就是讓我們看懂日志信息的工具
從這一點上看
它和tkprof差不多
一個是用來分析日志信息
一個則是格式化跟蹤文件
通過對日志的分析我們可以實現下面的目的
查明數據庫的邏輯更改
偵察並更正用戶的誤操作
執行事後審計
執行變化分析
不僅如此
日志中記錄的信息還包括
數據庫的更改歷史
更改類型(INSERT
UPDATE
DELETE
DDL等)
更改對應的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_D
BUILD()過程來提取數據字典信息
LogMiner包含兩個PL/SQL包和幾個視圖
dbms_logmnr_d包
這個包只包括一個用於提取數據字典信息的過程
即dbms_logmnr_d
build()過程
dbms_logmnr包
它有三個過程
add_logfile(name varchar
options number)
用來添加/刪除用於分析的日志文件
start_logmnr(start_scn number
end_scn number
start_time number
end_time number
dictfilename varchar
options number)
用來開啟日志分析
同時確定分析的時間/SCN窗口以及確認是否使用提取出來的數據字典信息
end_logmnr()
用來終止分析會話
它將回收LogMiner所占用的內存
與LogMiner相關的數據字典
v$logmnr_dictionary
LogMiner可能使用的數據字典信息
因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選項
Oracle
i的LogMiner將自動對比最初的日志流和當前系統的數據字典
並返回正確的DDL語句
並且會自動偵察並標記當前數據字典和最初日志流之間的差別
這樣即使最初日志流中所涉及的表已經被更改或者根本已經不存在
LogMiner同樣會返回正確的DDL語句
在日志中記錄更多列信息的能力
例如對於UPDATE操作不僅會記錄被更新行的情況
還可以捕捉更多前影信息
支持基於數值的查詢
Oracle
i LogMiner在支持原有基於元數據(操作
對象等)查詢的基礎上
開始支持基於實際涉及到的數據的查詢
例如涉及一個工資表
現在我們可以很容易地查出員工工資由
變成
的原始更新語句
而在之前我們只能選出所有的更新語句
三Oraclei/i的日志分析過程 LogMiner只要在實例起來的情況下都可以運行
LogMiner使用一個字典文件來實現Oracle內部對象名稱的轉換
如果沒有這個字典文件
則直接顯示內部對象編號
例如我們執行下面的語句
delete from
C
A
where
C
=
gototop
and ROWID =
AAABg
AAFAAABQaAAH
;
如果沒有字典文件
LogMiner分析出來的結果將是
delete from
UNKNOWN
OBJ#
where
COL
= HEXTORAW(
d
a
d
ae
) and ROWID
=
AAABg
AAFAAABQaAAH
;
如果想要使用字典文件
數據庫至少應該出於MOUNT狀態
然後執行dbms_logmnr_d
build過程將數據字典信息提取到一個外部文件中
下面是具體分析步驟
確認設置了初始化參數
UTL_FILE_DIR
並確認Oracle對改目錄擁有讀寫權限
然後啟動實例
示例中UTL_FILE_DIR參數如下
SQL> show parameter utl
NAME TYPE value
utl_file_dir string /data
/cyx/logmnr
這個目錄主要用於存放dbms_logmnr_d
build過程所產生的字典信息文件
如果不用這個
則可以不設
也就跳過下面一步
生成字典信息文件
exec dbms_logmnr_d
build(dictionary_filename =>
dic
ora
dictionary_location =>
/data
/cyx/logmnr
);
其中dictionary_location指的是字典信息文件的存放位置
它必須完全匹配UTL_FILE_DIR的值
例如
假設UTL_FILE_DIR=/data
/cyx/logmnr/
則上面這條語句會出錯
只因為UTL_FILE_DIR後面多了一個
/
而在很多其它地方對這一
/
是不敏感的
dictionary_filename指的是放於字典信息文件的名字
可以任意取
當然我們也可以不明確寫出這兩個選項
即寫成
exec dbms_logmnr_d
build(
dic
ora
/data
/cyx/logmnr
);
如果你第一步的參數沒有設
而直接開始這一步
Oracle會報下面的錯誤
ERROR at line
:
ORA
: initialization parameter utl_file_dir is not set
ORA
: at
SYS
DBMS_LOGMNR_D
line
ORA
: at
SYS
DBMS_LOGMNR_D
line
ORA
: at line
需要注意的是
在oracle
for Windows版中會出現以下錯誤
:
:
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
:
ORA
: Subscript outside of limit
ORA
: at
SYS
DBMS_LOGMNR_D
line
ORA
: at line
解決辦法
編輯
$ORACLE_HOME/rdbms/admindbmslmd
sql
文件
把其中的
TYPE col_desc_array IS VARRAY(
) OF col_description;
改成
TYPE col_desc_array IS VARRAY(
) OF col_description;
保存文件
然後執行一遍這個腳本
:
:
SQL> @c:\oracle\ora
\rdbms\admin\dbmslmd
sql
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_d
build即可
:
:
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=>
/data
/cyx/rac
arch/arch_
_
arc
options=>dbms_logmnr
new);
PL/SQL procedure successfully completed
這裡的options選項有三個參數可以用
NEW
表示創建一個新的日志文件列表
ADDFILE
表示向這個列表中添加日志文件
如下面的例子
REMOV
From:http://tw.wingwit.com/Article/program/Oracle/201311/18949.html