Oracle LogMiner用于讀取重做/歸檔日志文件的內容。您可以運行 LogMiner 來讀取同一數據庫或完全獨立的數據庫上的重做/歸檔日志文件的內容!在本文中,我們將了解 Oracle LogMiner 配置和查詢重做/存檔日志文件的內容。

概述
我們知道oracle的redo和歸檔日志,記錄了數據庫的事務的相關信息。在日常的數據庫管理過程中,我們有時需要,查看特定時刻特定用戶在數據庫上執行的操作。這時我們可以通過用logminer分析日志文件獲取相關信息。 logminer分析歸檔日志文件所獲得的信息并不是原始的操作信息,而是等價的原子操作信息,譬如用一條delete語句刪除兩百萬條信息,原始操作只需一條命令,但是分析歸檔文件會獲得兩百萬條delete命令信息。Oracle LogMiner用于讀取重做/歸檔日志文件的內容。您可以運行 LogMiner 來讀取同一數據庫或完全獨立的數據庫上的重做/歸檔日志文件的內容!在本文中,我們將了解 Oracle LogMiner 配置和查詢重做/存檔日志文件的內容。
解決方案
步驟一:啟用補充日志記錄
補充日志將有關每個事務的附加信息記錄到重做日志文件中。在生成將由 Oracle LogMiner 分析的重做日志文件之前,您必須啟用補充日志記錄。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
步驟二:添加日志文件
Oracle LogMiner 可以挖掘重做/存檔日志文件。讓我們假設我們想分析數據庫中的所有重做日志。
請注意 : DBMS_LOGMNR.NEW 參數指定要分析的第一個日志文件。后續日志文件使用 DBMS_LOGMNR.ADDFILE 選項定義。
情景1:REDO LOG
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/db_files/testdb/redo01.log', -
OPTIONS => DBMS_LOGMNR.NEW);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/db_files/testdb/redo01.log', -
OPTIONS => DBMS_LOGMNR.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/db_files/testdb/redo01.log', -
OPTIONS => DBMS_LOGMNR.ADDFILE);
情景2: ARCHIVE LOG
獲取所要分析時間段歸檔日志文件信息。
SELECT 'dbms_logmnr.add_logfile(LogFileName=>'''
|| name
|| ''', Options=>dbms_logmnr.addfile);'
FROM v$archived_log
WHERE first_time > To_date('2023-03-30 13:30', 'yyyy-mm-dd hh24:mi')
AND first_time < To_date('2023-03-30 13:50', 'yyyy-mm-dd hh24:mi')
AND dest_id = 1
ORDER BY first_time;
保存好輸出信息,并將輸出信息第一條中的dbms_logmnr.addfile改成dbms_logmnr.new,即:
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/FRA/TESTDB/archivelog/o1_mf_1_3027_k6dcc33y_.arc', -
OPTIONS => DBMS_LOGMNR.NEW);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/FRA/TESTDB/archivelog/o1_mf_1_3028_k6dcc33y_.arc', -
OPTIONS => DBMS_LOGMNR.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/FRA/TESTDB/archivelog/o1_mf_1_3029_k6dcc33y_.arc', -
OPTIONS => DBMS_LOGMNR.ADDFILE);
步驟三:啟動 LogMiner
如果您在同一個源數據庫上啟動 LogMiner,那么只需發出。
EXECUTE DBMS_LOGMNR.START_LOGMNR( -
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
現在您已準備好查詢V$LOGMNR_CONTENTS視圖,該視圖允許您查看重做/存檔日志文件的內容。
步驟四:查詢 V$LOGMNR_CONTENTS
讓我們檢查重做日志文件以查找針對 EMPLOYEES 表運行的任何查詢。
SELECT username , SQL_REDO , SQL_UNDO FROM V $ LOGMNR_CONTENTS
WHERE seg_owner = 'HR' and seg_name like 'EMPLOYEES' ;
每次查詢 V$LOGMNR_CONTENTS 視圖時,Oracle LogMiner 都必須運行以呈現數據。當您查詢 V$LOGMNR_CONTENTS 時,數據不會存儲在數據庫中的任何位置。
步驟五:結束 LogMiner
Oracle LogMiner 占用系統資源并且在您停止它之前不會釋放這些資源。
EXECUTE DBMS_LOGMNR.END_LOGMNR
步驟六:過濾 LogMiner 內容
當您添加日志文件并啟動LogMiner時,您可以查看日志文件的所有內容。如果日志文件很大,那么最好使用一些過濾器來找出特定的事務。
情景1:使用 SCN 號碼過濾
您可以過濾特定 SCN 編號之間的日志文件內容(如果您知道)。
EXECUTE DBMS_LOGMNR.START_LOGMNR( -
STARTSCN => 280389, -
ENDSCN => 351390, -
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
情景2:按日期和時間過濾
您可以過濾特定日期和時間之間的日志文件內容。
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
EXECUTE DBMS_LOGMNR.START_LOGMNR( -
STARTTIME => '23-Nov-2022 11:23:00', -
ENDTIME => '23-Nov-2022 11:43:00'-
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
情景3:僅顯示已提交的事務
默認情況下,LogMiner 將顯示日志文件中已提交和未提交的事務。以防萬一您想過濾并僅查看已提交的事務。
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -
DBMS_LOGMNR.COMMITTED_DATA_ONLY);