Oracle 所有資料變更皆記錄於 Redo Log,但原始格式不可讀。LogMiner 為官方唯一解讀工具,類似 TKPROF 之於 Trace 檔。透過 LogMiner 可達成:
日誌記錄包含:變更類型 (INSERT/UPDATE/DELETE/DDL)、SCN 號、操作使用者等。LogMiner 重構「等價 SQL」 (記錄於 V$LOGMNR_CONTENTS.SQL_REDO) 與「UNDO SQL」 (記錄於 SQL_UNDO),而非原始 SQL。例如 DELETE FROM a WHERE c1 <> 'cyx' 可能重構為多條單筆 DELETE,因實際影響筆數隨環境而異,記錄元操作更具確定性。
因 Redo Log 僅存物件內部 ID (OBJ#, COL#),需透過資料字典轉換為可讀名稱。LogMiner 利用 DBMS_LOGMNR_D.BUILD() 擷取字典資訊。
COMMITTED_DATA_ONLY 選項,依 SCN 順序回傳已提交交易。DDL_DICT_TRACKING 選項,自動比對初始日誌流與當前字典,修正 DDL 語句,標記差異。SQL> SHOW PARAMETER utl_file_dir
NAME TYPE VALUE
utl_file_dir string /data6/cyx/logmnr
目錄需與後續字典檔路徑完全一致 (含尾端斜線)。
EXEC DBMS_LOGMNR_D.BUILD(DICTIONARY_FILENAME => 'dic.ora',
DICTIONARY_LOCATION => '/data6/cyx/logmnr');
Windows 8.1.7 可能遇 ORA-06532,需修改 dbmslmd.sql 將 VARRAY(513) 改為 VARRAY(700) 重編譯套件。
EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/path/arch_1_197.arc', OPTIONS => DBMS_LOGMNR.NEW);
EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/path/arch_2_86.arc', OPTIONS => DBMS_LOGMNR.ADDFILE);
Options:NEW 建立新清單、ADDFILE 追加、REMOVEFILE 移除。
-- 使用字典檔
EXEC DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => '/data6/cyx/logmnr/dic.ora');
-- 不使用字典檔 (僅顯示內部 ID)
EXEC DBMS_LOGMNR.START_LOGMNR();
-- 指定時間窗口
EXEC DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => '...',
STARTTIME => TO_DATE('2003-09-21 09:39:00','YYYY-MM-DD HH24:MI:SS'),
ENDTIME => TO_DATE('2003-09-21 09:45:00','YYYY-MM-DD HH24:MI:SS'));
可查詢 SELECT DISTINCT TIMESTAMP FROM V$LOGMNR_CONTENTS 確認有效日誌時間範圍。日期格式建議設定 NLS_DATE_FORMAT 或使用 TO_DATE。
V$LOGMNR_LOGS:目前分析的日誌清單 (RAC 環境顯示 THREAD_ID)。V$LOGMNR_CONTENTS:核心分析結果,含 SQL_REDO、SQL_UNDO、OPERATION、SCN、USERNAME 等。EXEC DBMS_LOGMNR.END_LOGMNR();
或直接離開 SQL*Plus 自動釋放資源。
-- 原始 SQL
DELETE FROM "C"."A" WHERE "C1" = 'gototop' AND ROWID = 'AAABg1AAFAAABQaAAH';
-- LogMiner 無字典輸出
DELETE FROM "UNKNOWN"."OBJ# 6197" WHERE "COL 1" = HEXTORAW('d6a7d4ae') AND ROWID = 'AAABg1AAFAAABQaAAH';
可見物件名、欄位名皆轉為內部編號,難以辨識,強烈建議配合字典檔使用。