首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

分析 Oracle 資料庫日誌檔案 (1):LogMiner 核心原理、9i 增強功能與完整操作流程指南

     編輯:Oracle 資料庫基礎

一、LogMiner 核心原理與應用價值

Oracle 所有資料變更皆記錄於 Redo Log,但原始格式不可讀。LogMiner 為官方唯一解讀工具,類似 TKPROF 之於 Trace 檔。透過 LogMiner 可達成:

  1. 釐清資料庫邏輯變更歷程。
  2. 偵測並修正使用者誤操作。
  3. 執行事後稽核。
  4. 進行資料變更趨勢分析。

日誌記錄包含:變更類型 (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() 擷取字典資訊。

二、Oracle 9i LogMiner 重大增強

  1. 支援更多資料/儲存類型: 鏈結/遷移行、Cluster 表、Direct Path Insert、DDL 操作 (CREATE USER 密碼加密顯示)。
  2. 字典擷取選項擴充: 除外部檔案,可直接寫入 Redo Log 流中,提供操作當時的字典快照,支援離線分析。
  3. DML 依交易分組: COMMITTED_DATA_ONLY 選項,依 SCN 順序回傳已提交交易。
  4. Schema 變更自動追蹤: DDL_DICT_TRACKING 選項,自動比對初始日誌流與當前字典,修正 DDL 語句,標記差異。
  5. 擷取更多欄位前影資訊: UPDATE 不僅記錄新值,可捕捉舊值。
  6. 支援基於資料值的查詢: 可直接查「薪資從 1000 改為 2000」的更新語句,而非撈出所有 UPDATE 再篩選。

三、Oracle 8i/9i 日誌分析完整操作步驟

1. 設定 UTL_FILE_DIR 並啟動實例

SQL> SHOW PARAMETER utl_file_dir
NAME                 TYPE   VALUE
utl_file_dir         string /data6/cyx/logmnr

目錄需與後續字典檔路徑完全一致 (含尾端斜線)。

2. 產生字典資訊檔

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) 重編譯套件。

3. 添加待分析日誌檔

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 移除。

4. 啟動 LogMiner 分析

-- 使用字典檔
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。

5. 查詢分析結果

  • V$LOGMNR_LOGS:目前分析的日誌清單 (RAC 環境顯示 THREAD_ID)。
  • V$LOGMNR_CONTENTS:核心分析結果,含 SQL_REDO、SQL_UNDO、OPERATION、SCN、USERNAME 等。

6. 結束分析會話

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';

可見物件名、欄位名皆轉為內部編號,難以辨識,強烈建議配合字典檔使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved