使用LOGMNR檢視資料庫日誌

yhou31發表於2015-04-27

    如果被人不小心刪除了資料庫的表物件裡面的資料,而我們又不知道準確的操作時間,這時,就可以使用oracle的LOGMNR工具,分析查詢資料庫的歸檔日誌,從而查詢該誤操作的內容和時間,有些直接呼叫LOG_UNDO就可以恢復。

  

    1、使用ORACLE使用者登入,進入$ORACLE_HOME/dbs,找到裡面的initSID.ora這個檔案,這是資料庫啟動的引數文 件,使用VI工具,手動在裡面新增一個引數utl_file_dir='/u01/arch',utl_file_dir在資料庫裡預設為空,大家可以使 用SHOW PARAMETER UTL來檢視系統裡是否已經設定過該引數。

       或者在啟動的SERVER裡面使用ALTER來修改該引數。

       alter system set utl_file_dir='/u01/arch' scope=spfile;

 

   2、重啟服務,讓我們剛剛的修改生效。

 

   3、接著,我們來生成用於分析的資料字典

       在SQLPLUS裡呼叫資料庫的工具包DBMS_LOGMNR_D.BUILD

       BEGIN

       dbms_logmnr_d.build(

          dictionary_name => 'logmnr_dict.dat',

          dictionary_location=>'/u01/arch'

       );

       END;

       /

       操作完成後,會再/u01/arch裡面出現一個名為logmnr_dict.dat的檔案。

       上面的dictionary_location的地址可以隨便設,不過一定要和utl_file_dir的值一樣,否則出錯。

 

   4、下面我們要做的重啟服務,然後裝入我們要分析的日誌檔案。

        shutdown immediate

        startup mount

 

        下面的操作需要在mount狀態下操作

        BEGIN

        dbms_logmnr.add_logfile(

           options=>dbms_logmnr.new,

           logfilename=>'/u01/arch/o1_mf_1_37_57scllcl_.arc'

        );

        END;

        /

        options是用來指定檔案操作:new為新增新的用於分析的日誌檔案;removefile用來移除不需要分析的日誌。

        logfilename為需要新增進入分析的日誌的檔案路徑,我這個是把歸檔的日誌檔案從flash_recovery_area裡面複製過來的。

 

   5、再接著我們就要啟動分析了

       因為使用LOGMNR分析需要些檔案,而剛剛我們的SERVER是在MOUNT狀態下的,無法寫檔案,因此我們需要做的是:

       alter database open

       將資料庫的狀態修改為OPEN

 

       BEGIN

       dbms_logmnr.start_logmnr(

          dictfilename => '/u01/arch/logminer_dict.dat',
          starttime => to_date('20090808 22:00:00','yyyymmdd hh24:mi:ss'),
          endtime => to_date('20090808 23:40:00','yyyymmdd hh24:mi:ss')

       );

       END;

       /

       dictfilename為我們剛剛建立的資料字典檔案。

       starttime,endtime為分析的時間範圍。

     

      如果大家使用PL/SQL DEVELOPER上面的這些過程的呼叫就不用像我這樣還要手動寫了。

 

    6、查詢日誌內容

       進過上面的辛苦的工作,下面就是我們收穫的時候了,先介紹幾個資料字典檢視。

       v$logmnr_dictionary  顯示用來決定物件ID名稱的字典檔案的資訊
       v$logmnr_logs  在LogMiner啟動時顯示被分析的日誌列表
       v$logmnr_contents LogMiner啟動後,可以使用這個檢視在sql提示符下輸入sql語句來查詢重做日誌的內容。

 

       select scn ,seq_name,timestamp,seq_owner,operation from v$logmnr_contents where sql_name='your object'

       我們可以看到幾條關於OBJECT的記錄,operation顯示的該操作的型別(DDL,DELETE,INSERT,UPDATE),沒有SELECT,因為SELECT是不寫REDO LOG的(美中不足!!)。

       我們如果想看看操作的具體內容可以接著查詢:

       select scn,sql_redo,sql_undo from v$logmnr_contents where scn='192838718'

    

       就可以顯示你要檢視的操作的內容,以及它對應的UNDO操作,可以呼叫SQL_UNDO在ROLLBACK。

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

相關文章