研究了好幾天
終於有了一個比較完整查看oracle的數據日志方法
oracle沒有想sqlserver那樣有sqlE工具來輔助查詢
只能利用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
表示向這個列表中添加日志文件
如下面的例子
REMOVEFILE
和addfile相反
SQL> exec dbms_logmnr
add_logfile( logfilename=>
/data
/cyx/rac
arch/arch_
_
arc
options=>dbms_logmnr
addfile);
From:http://tw.wingwit.com/Article/program/Oracle/201311/18613.html