日誌分析logmnr (Logminer) 使用方法

tolywang發表於2011-06-27

注意: 

使用logminer查詢表v$logmnr_contents必須在同一個會話中進行,因為分析的那些
資訊儲存在這個session 的PGA中,在別的session 裡面是查不到的。


檢視v$logmnr_contents中的分析結果僅在我們執行過程'dbms_logmrn.start_logmnr'這個
會話的生命期中存在。這是因為所有的LogMiner儲存都在PGA記憶體中,所有其他的程式是看
不到它的,同時隨著程式的結束,分析結果也隨之消失。 最後,使用過程DBMS_LOGMNR.END_LOGMNR
終止日誌分析事務,此時PGA記憶體區域被清除,分析結果也隨之不再存在。

 

----------------------------------------------------------------------------------------  


0, 安裝LogMiner工具,以下兩個指令碼以SYSDBA身份執行

SQL>@?/rdbms/admin/dbmslm.sql
dbmslm.sql是用來建立DBMS_LOGMNR的package,這個包是用來分析日誌的

SQL>@?/rdbms/admin/dbmslmd.sql
dbmslmd.sql是用來建立DBMS_LOGMNR_D的package的,這個包是用來建立資料字典檔案的

 


1、備份原表
create table dfms.aab_bak as SELECT * from  dfms.aab ;


2. 建同樣架構新表,準備將恢復的資料匯入
create table dfms.aac ;


3. 設定UTL_FILE_DIR引數來指定資料字典檔案的位置目錄
alter system set UTL_FILE_DIR='/u01/logmnr' scope=spfile;
關閉資料庫,並開啟使之生效。

SQL> show parameter utl_file
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      /u01/logmnr

 

4. 以sysdba許可權登入,生成資料字典
exec dbms_logmnr_d.build('dictionary.ora','/u01/logmnr');

我們可以看到在/u01/logmnr目錄下生成了一個檔案。

lhtestdb01$ls -al
total 26060
drwxr-xr-x  2 oracle dba     4096 Jun 23 15:10 .
drwxrwxr-x  6 oracle dba     4096 Jun 23 15:03 ..
-rw-r--r--  1 oracle dba 26632605 Jun 27 14:42 dictionary.ora

 

5. 新增歸檔日誌或連線日誌檔案

exec dbms_logmnr.add_logfile

(LogFileName=>'/u01/product/oradata/mxdell/redo04.log',Options=>dbms_logmnr.new);

exec dbms_logmnr.add_logfile

(LogFileName=>'/u01/product/oradata/mxdell/redo05.log',Options=>dbms_logmnr.addfile);

 

6、開始挖掘日誌
exec dbms_logmnr.start_logmnr(dictfilename=>'/u01/logmnr/dictionary.ora');


7. 生成臨時儲存表
因為檢視Logmnr的結果需要在同一個session, 所以我們可以將session PGA中的挖掘的
內容儲存在實體表中,這樣其他使用者也可以查詢,且不會因為session的消失資料也消失。

SQL> create table dfms.logmnr_temp01 as select * from GV$LOGMNR_CONTENTS;

 

8. 結束挖掘日誌
execute dbms_logmnr.end_logmnr;


9. 刪除日誌分析檔案
exec dbms_logmnr.add_logfile('/u01/product/oradata/mxdell/redo04.log',dbms_logmnr.removefile);

exec dbms_logmnr.add_logfile('/u01/product/oradata/mxdell/redo05.log',dbms_logmnr.removefile);

 

10. 查詢sql_redo及sql_undo . 

select * from  dfms.logmnr_temp01 ;

select scn,timestamp,log_id,seg_owner,seg_type,table_space,data_blk#,data_obj#,data_objd#,
       session#,serial#,username,session_info,sql_redo,sql_undo 
from  dfms.LOGMNR_TEMP01  t   where   SEG_OWNER='DFMS' ;

 

 


8、匯出指令碼,用指令碼做回滾,注意SQL_UNDO中的delete語句末尾有rowid,不能直接用,需要用正規表示式替換掉。

spool TA_ABSDOCS_undosql.txt
select regexp_replace(replace(SQL_UNDO,'"HR_TTM"','"HR_TTM2"'),'and ROWID.+;',';')
from hjm_logmnr
WHERE
SEG_NAME = 'TA_ABSDOCS' AND
SEG_OWNER = 'HR_TTM'
order by to_char(TIMESTAMP,'yyyy-mm-dd hh24:mi:ss') desc;
spool off
 

 

 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-700811/,如需轉載,請註明出處,否則將追究法律責任。

相關文章