logmnr可以對用戶發出的sql語句進行跟蹤例如由於某個管理員修改數據時錯誤地把張三的工資修改了這時使用logmnr可以知道張三的工資在修改前的值和修改後的值通過logmnr可以把張三的工資恢復到修改前的狀態
安裝LogMiner
$oracle_home/rdbms/admin/dbmslmsql 用來創建dbms_logmnr包該包分析日志文件
$oracle_home/rdbms/admin/dbmslmdsql 用來創建dbms_logmnr_d包創建數據字典文件
在運行這兩個腳本的時候要以sys用戶身份運行
LogMiner使用產生日志文件的服務器來分析重做日志文件重做日志文件來自當前數據庫
LogMiner不解釋重做日志的DDL語句如drop table這樣的ddl語句
LogMiner將不會重構原始的無日志的sql操作如果在數據字典上的DML操作結果將被記錄到日志文件裡
使用LogMiner分析龐大數據的重做信息是一件非常耗費時間的事情
無論源數據還是被分析的數據庫都必須同時使用相同的操作硬件平台系統都必須使用相同的字符集
LogMiner將顯示未提交的事務因為重做日志包含提交的和未提交的數據
LogMiner分析重做日志文件的操作
使用LogMiner存儲過程創建一個外部數據字典文件
然後使用另一個存儲過程創建一個被分析的重做文件的列表
最後執行另一個存儲過程來啟動LogMiner
LogMiner重要的過程和視圖
過程
dbms_logmnr_dbuild 創建一個數據字典文件
dbms_logmnradd_logfile 在列表中增加日志文件以供分析
dbms_logmnrstart_logmnr 使用一個個可選的字典文件和前面確定要分析的日志文件來啟動LogMiner
dbms_logmnrend_logmnr 停止LogMiner分析
視圖
v$logmnr_dictionary 顯示用來決定對象ID名稱的字典文件的信息
v$logmnr_logs 在LogMiner啟動時顯示被分析的日志列表
v$logmnr_contents LogMiner啟動後可以使用這個視圖在sql提示符下輸入sql語句來查詢重做日志的內容
執行任務
創建數據字典
產生確定數據字典的重要性LogMiner將使用這個文件將對象標識轉化成一個為意義的名字它的信息保存到PGA內存區應該確保系統必須有足夠的內存空間因為這種操作需要很大的內存如果沒有數據字典則需要較少的PGA內存空間
sql> execute dbms_logmnr_dbuild(dictionary_filename => dictionaryora dictionary_location => c:\oracle\rman\ch);
產生數據庫操作
比如對一個表進行增刪查改的操作
這些操作語句的重做信息將被保存在當前聯機重做日志文件中可以從v$log視圖裡面找出日志seq號然後進行一個強制日志切換使當前聯機日志歸檔運行logMiner分析這個新歸檔的日志文件(如arc是新歸檔的日志文件)
sql> select sequence# from v$log where status = CURRENT
sql> alter system switch logfile;
為分析指定日志文件
LogMiner將分析一個指定的日志文件所以必須創建一個可供分析的日志文件列表增加的日志文件將顯示在v$logmnr_logs視圖裡
sql> select db_name thread_sqnfilename from v$logmnr_logs;
前一個任務中sql所做的改變保存在序號為的日志文件裡那麼這裡在logminer分析前添加這個日志文件和前面的兩個文件
begin
dbms_logmnradd_logfile(logfilename => /oradata/dba/backup/ch/arc options => dbms_logmnrNEW);
dbms_logmnradd_logfile(logfilename => /oradata/dba/backup/ch/arc options => dbms_logmnrADDFILE);
dbms_logmnradd_logfile(logfilename => /oradata/dba/backup/ch/arc options => dbms_logmnrADDFILE);
end;
/
dbms_logmnrnew 用於建一個日志分析表
dbms_logmnraddfile 用於加入用於分析的日志文件
dbms_logmnrremovefile 用於移出用於分析的日志文件
查看sql> select db_name thread_sqnfilename from v$logmnr_logs;
可以刪除裡面的文件如arc沒有包含我們想要的信息可以用REMOVEFILE選項來刪除
sql> execute dbms_logmnradd_logfile(logfilename => d:\oradata\dba\archive\arc option => dbms_logmnrREMOVEFILE);
啟動LogMiner
准備好字典文件和日志文件列表後就可以准備啟動LogMiner了
execute dbms_logmnrstart_logmnr(dictfilename => c:\oracle\rman\ch\dictionaryora);
可以指定分析開始的SCN和或結束的SCN開始的時間和或結束時間
execute dbms_logmnrstart_logmnr(dictfilename => c:\oracle\rman\ch\dictionaryorastartime => to_date( ::yyyymmdd hh:mi:ss)endtime => to_date( ::yyyymmdd hh:mi:ss));
分析日志文件內容
檢查數據庫更改的細節sql> select operation timestampscn from v$logmnr_contents where seg_name = EMP and seg_owner=SCOTT and seg_type_name = TABLE;
select sql_redosql_undo from v$logmnr_contents where seg_name=EMP and seg_owner=SCOTT and seg_type_name = TABLE;
select usrnamen session_info from logmnr_contents where seg_name = EMP and seg_owner=SCOTT and seg_type_name=TABLE;
執行容量分析使用LogMiner不會降低運行時間而使用表審計則會導致運行時間性能開銷過大
下面為分析數據庫表上DML操作提供一些思路與方法
select operation to_char(timestampHH) hourcount(*) total from v$logmnr_contents where seg_name =DATE_LOG and seg_owner=TINA and seg_type_name=TABLE group by operation to_char(timestampHH);
尋找DDL命令的細節
select seg_nameoperationscntimestampcount(*) from v$logmnr_contents where operation=DELETE group by seg_nameoperationscntimestamp order by scn;
關閉LogMiner
可以把v$logmnr_contents視圖的內容創建一個永久的數據庫表將非常有幫助
sql> create table logmnr_contents as select * from v$logmnr_contents;
當完成了重做日志的檢查運行dbms_logmnr 中的end_logmnr
execute dbms_logmnrend_logmnr();
From:http://tw.wingwit.com/Article/program/Oracle/201311/17867.html