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

Oracle LogMiner 深度實戰:從日志文件還原真相的完整指南

     編輯:Oracle 資料庫基礎

前言

作為 DBA,面對數據誤刪、惡意篡改、審計追蹤等場景,最直接、低成本且原生的手段是分析 REDO 日志。Oracle 提供的 LogMiner 是唯一官方工具,能將二進制日志重構為可讀 SQL。本文系統講解 LogMiner 原理、9i 增強、8i/9i 完整操作流程、跨版本/平台限制、V$LOGMNR_CONTENTS 實戰查詢模式,並給出 IP 追蹤實戰技巧。

一、核心原理:LogMiner 如何工作

  • 所有數據庫變更 (DML/DDL) 記錄於 REDO 日志 (聯機/歸檔)。
  • 原生日志為專有二進制格式,不可直接閱讀。
  • LogMiner 讀取指定日志文件,借助 數據字典 將內部對象 ID (OBJ#) 、欄位序號 (COL#) 解析為名稱,重構 等價 SQL_REDO (正向) 與 SQL_UNDO (反向) 語句,結果呈現在 V$LOGMNR_CONTENTS 視圖。
  • 關鍵認知:重構的是「等價元操作」,非原始 SQL。例:DELETE FROM t WHERE c1<>'x' 可能重構為 6 條單行 DELETE,因不同環境下影響行數不同,記錄元操作才具備確定性。

二、Oracle 9i LogMiner 關鍵增強

特性說明
支援更多類型鏈接/遷移行、叢集表、Direct Path Insert、DDL 操作 (CREATE USER 密碼加密顯示)
字典提取選項除外部文件,可直接提取至 REDO 日志流 (日志流含字典快照),支援離線分析
事務級分組COMMITTED_DATA_ONLY 選項,按 SCN 返回已提交事務,過濾未提交/回滾
DDL 字典追蹤DDL_DICT_TRACKING 自動對比初始日志流與當前字典,即使表已修改/刪除仍能還原正確 DDL
前影信息增強UPDATE 操作捕獲更多舊值列
基於值查詢可直接按數據值過濾 (如薪資 1000→2000),而非僅按元數據 (操作類型/對象)

三、Oracle 8i/9i 完整分析流程

3.1 環境準備

-- 1. 設置 UTL_FILE_DIR (需精確匹配,尾斜桿敏感)
ALTER SYSTEM SET UTL_FILE_DIR='/data6/cyx/logmnr' SCOPE=SPFILE;
-- 重啟實例生效

-- 2. 生成字典文件 (數據庫至少 MOUNT 狀態)
EXEC DBMS_LOGMNR_D.BUILD(
  DICTIONARY_FILENAME => 'dic.ora',
  DICTIONARY_LOCATION => '/data6/cyx/logmnr');
-- 8i Windows 可能報 ORA-06532,需修改 $OH/rdbms/admin/dbmslmd.sql
--   TYPE col_desc_array IS VARRAY(513) → VARRAY(700)
-- 重編譯包:ALTER PACKAGE DBMS_LOGMNR_D COMPILE BODY;

3.2 添加日志文件

-- 建立新列表
EXEC DBMS_LOGMNR.ADD_LOGFILE(
  LOGFILENAME => '/data6/cyx/rac1arch/arch_1_197.arc',
  OPTIONS => DBMS_LOGMNR.NEW);

-- 追加更多日志
EXEC DBMS_LOGMNR.ADD_LOGFILE(
  LOGFILENAME => '/data6/cyx/rac1arch/arch_2_86.arc',
  OPTIONS => DBMS_LOGMNR.ADDFILE);
-- 選項:NEW / ADDFILE / REMOVEFILE

3.3 啟動分析會話

-- 使用字典文件 + 時間窗口
EXEC DBMS_LOGMNR.START_LOGMNR(
  DICTFILENAME => '/data6/cyx/logmnr/dic.ora',
  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'));
-- 無字典:EXEC DBMS_LOGMNR.START_LOGMNR();
-- 亦可用 STARTSCN/ENDSCN 定位

3.4 核心視圖查詢

  • V$LOGMNR_LOGS:當前分析日志列表 (含 THREAD_ID,RAC 多實例區分)
  • V$LOGMNR_CONTENTS:分析結果主表,關鍵欄位:
     OPERATION (INSERT/UPDATE/DELETE/DDL)
     SQL_REDO, SQL_UNDO
     SEG_NAME, SEG_OWNER
     TIMESTAMP, SCN
     SESSION_INFO (含登錄用戶、OS用戶、機器名、終端、進程、程序、**客戶端 IP** — 需觸發器注入)
  • V$LOGMNR_DICTIONARY、V$LOGMNR_PARAMETERS:輔助信息

3.5 結束會話

EXEC DBMS_LOGMNR.END_LOGMNR(); -- 釋放記憶體,或直接退出 SQL*Plus 自動清理

四、跨版本/平台分析 8.0/8i 日志

  1. 將 8i 的 dbmslmd.sql (8.1.5 為 dbmslogmnrd.sql) 複製到 8.0/8i 庫建立 DBMS_LOGMNR_D 包。
  2. 在源庫執行 BUILD 生成字典文件。
  3. 將歸檔日志 + 字典文件複製到 8i/9i 分析庫。
  4. 在分析庫從「添加日志」步驟開始,START_LOGMNR 指定源庫字典文件。

硬性限制:
① 字典必須與日志同源庫、同字符集。
② 硬體平台必須一致 (如同為 Tru64/SPARC/x86);OS 版本可不同。跨平台會報 ORA-01284/ORA-27048: file header information is invalid。

五、V$LOGMNR_CONTENTS 實戰查詢模式

5.1 追蹤 DDL 變更 (僅 9i+)

SELECT TIMESTAMP, SQL_REDO
FROM V$LOGMNR_CONTENTS
WHERE UPPER(SQL_REDO) LIKE '%CREATE%';

5.2 追蹤惡意/誤操作 — 定位到人與機器

SESSION_INFO 默認含:
login_username=APP_USER client_info= OS_username=oracle Machine_name=appsrv OS_terminal=pts/3 OS_program=sqlplus@appsrv (TNS V1-V3)

問題:連接池/應用共用帳號,無法區分具體操作者。

解決方案:登錄觸發器注入客戶端 IP

CREATE OR REPLACE TRIGGER ON_LOGON_TRIGGER
AFTER LOGON ON DATABASE
BEGIN
  DBMS_APPLICATION_INFO.SET_CLIENT_INFO(
    SYS_CONTEXT('USERENV','IP_ADDRESS'));
END;
/

此后 V$SESSION.CLIENT_INFO 記錄真實 IP,LogMiner 同步捕獲至 SESSION_INFO。

5.3 實戰案例:誰把收費類型改成免費?

SELECT SESSION_INFO, SQL_REDO
FROM V$LOGMNR_CONTENTS
WHERE UPPER(OPERATION) = 'UPDATE'
  AND UPPER(SQL_REDO) LIKE '%HMLX%';
-- 結果示例
SESSION_INFO: login_username=C client_info=10.16.98.26 OS_username=sz-xjs-chengyx Machine_name=GDTEL\SZ-XJS-CHENGYX
SQL_REDO: UPDATE "C"."HMLX" SET "NAME"='free' WHERE "NAME"='ncn.cn' AND ROWID='AAABhTAAFAAABRaAAE';

精準定位到 IP 10.16.98.26、OS 用戶 sz-xjs-chengyx、機器 GDTEL\SZ-XJS-CHENGYX。

六、參考資源

  • Oracle Technical White Paper: Oracle9i LogMiner
  • Metalink Doc ID 111886.1: How to Setup LogMiner
  • 作者個人站:www.ncn.cn (含完整實驗下載)

結語

LogMiner 是 DBA 手中的「時光機」,無需額外授權、無侵入式審計、支援事後取證。掌握字典提取、日志添加、時間/SCN 窗口、SESSION_INFO IP 注入技巧,配合 V$LOGMNR_CONTENTS 靈活查詢,即可在數據變更的汪洋大海中精準捕撈真相。建議生產庫常態化啟用歸檔、保留足夠日志、部署登錄觸發器,讓取證能力常備不懈。

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