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

概述
我們知道oracle的redo和歸檔日志,記錄了數(shù)據(jù)庫的事務(wù)的相關(guān)信息。在日常的數(shù)據(jù)庫管理過程中,我們有時需要,查看特定時刻特定用戶在數(shù)據(jù)庫上執(zhí)行的操作。這時我們可以通過用logminer分析日志文件獲取相關(guān)信息。 logminer分析歸檔日志文件所獲得的信息并不是原始的操作信息,而是等價的原子操作信息,譬如用一條delete語句刪除兩百萬條信息,原始操作只需一條命令,但是分析歸檔文件會獲得兩百萬條delete命令信息。Oracle LogMiner用于讀取重做/歸檔日志文件的內(nèi)容。您可以運行 LogMiner 來讀取同一數(shù)據(jù)庫或完全獨立的數(shù)據(jù)庫上的重做/歸檔日志文件的內(nèi)容!在本文中,我們將了解 Oracle LogMiner 配置和查詢重做/存檔日志文件的內(nèi)容。
解決方案
步驟一:啟用補(bǔ)充日志記錄
補(bǔ)充日志將有關(guān)每個事務(wù)的附加信息記錄到重做日志文件中。在生成將由 Oracle LogMiner 分析的重做日志文件之前,您必須啟用補(bǔ)充日志記錄。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
步驟二:添加日志文件
Oracle LogMiner 可以挖掘重做/存檔日志文件。讓我們假設(shè)我們想分析數(shù)據(jù)庫中的所有重做日志。
請注意 : DBMS_LOGMNR.NEW 參數(shù)指定要分析的第一個日志文件。后續(xù)日志文件使用 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
如果您在同一個源數(shù)據(jù)庫上啟動 LogMiner,那么只需發(fā)出。
EXECUTE DBMS_LOGMNR.START_LOGMNR( -
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
現(xiàn)在您已準(zhǔn)備好查詢V$LOGMNR_CONTENTS視圖,該視圖允許您查看重做/存檔日志文件的內(nèi)容。
步驟四:查詢 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 都必須運行以呈現(xiàn)數(shù)據(jù)。當(dāng)您查詢 V$LOGMNR_CONTENTS 時,數(shù)據(jù)不會存儲在數(shù)據(jù)庫中的任何位置。
步驟五:結(jié)束 LogMiner
Oracle LogMiner 占用系統(tǒng)資源并且在您停止它之前不會釋放這些資源。
EXECUTE DBMS_LOGMNR.END_LOGMNR
步驟六:過濾 LogMiner 內(nèi)容
當(dāng)您添加日志文件并啟動LogMiner時,您可以查看日志文件的所有內(nèi)容。如果日志文件很大,那么最好使用一些過濾器來找出特定的事務(wù)。
情景1:使用 SCN 號碼過濾
您可以過濾特定 SCN 編號之間的日志文件內(nèi)容(如果您知道)。
EXECUTE DBMS_LOGMNR.START_LOGMNR( -
STARTSCN => 280389, -
ENDSCN => 351390, -
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
情景2:按日期和時間過濾
您可以過濾特定日期和時間之間的日志文件內(nèi)容。
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:僅顯示已提交的事務(wù)
默認(rèn)情況下,LogMiner 將顯示日志文件中已提交和未提交的事務(wù)。以防萬一您想過濾并僅查看已提交的事務(wù)。
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -
DBMS_LOGMNR.COMMITTED_DATA_ONLY);