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

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