作為 DBA,面對數據誤刪、惡意篡改、審計追蹤等場景,最直接、低成本且原生的手段是分析 REDO 日志。Oracle 提供的 LogMiner 是唯一官方工具,能將二進制日志重構為可讀 SQL。本文系統講解 LogMiner 原理、9i 增強、8i/9i 完整操作流程、跨版本/平台限制、V$LOGMNR_CONTENTS 實戰查詢模式,並給出 IP 追蹤實戰技巧。
V$LOGMNR_CONTENTS 視圖。DELETE FROM t WHERE c1<>'x' 可能重構為 6 條單行 DELETE,因不同環境下影響行數不同,記錄元操作才具備確定性。| 特性 | 說明 |
|---|---|
| 支援更多類型 | 鏈接/遷移行、叢集表、Direct Path Insert、DDL 操作 (CREATE USER 密碼加密顯示) |
| 字典提取選項 | 除外部文件,可直接提取至 REDO 日志流 (日志流含字典快照),支援離線分析 |
| 事務級分組 | COMMITTED_DATA_ONLY 選項,按 SCN 返回已提交事務,過濾未提交/回滾 |
| DDL 字典追蹤 | DDL_DICT_TRACKING 自動對比初始日志流與當前字典,即使表已修改/刪除仍能還原正確 DDL |
| 前影信息增強 | UPDATE 操作捕獲更多舊值列 |
| 基於值查詢 | 可直接按數據值過濾 (如薪資 1000→2000),而非僅按元數據 (操作類型/對象) |
-- 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;
-- 建立新列表
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
-- 使用字典文件 + 時間窗口
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 定位
V$LOGMNR_LOGS:當前分析日志列表 (含 THREAD_ID,RAC 多實例區分)V$LOGMNR_CONTENTS:分析結果主表,關鍵欄位:OPERATION (INSERT/UPDATE/DELETE/DDL)SQL_REDO, SQL_UNDOSEG_NAME, SEG_OWNERTIMESTAMP, SCNSESSION_INFO (含登錄用戶、OS用戶、機器名、終端、進程、程序、**客戶端 IP** — 需觸發器注入)V$LOGMNR_DICTIONARY、V$LOGMNR_PARAMETERS:輔助信息EXEC DBMS_LOGMNR.END_LOGMNR(); -- 釋放記憶體,或直接退出 SQL*Plus 自動清理
dbmslmd.sql (8.1.5 為 dbmslogmnrd.sql) 複製到 8.0/8i 庫建立 DBMS_LOGMNR_D 包。BUILD 生成字典文件。START_LOGMNR 指定源庫字典文件。硬性限制:
① 字典必須與日志同源庫、同字符集。
② 硬體平台必須一致 (如同為 Tru64/SPARC/x86);OS 版本可不同。跨平台會報 ORA-01284/ORA-27048: file header information is invalid。
SELECT TIMESTAMP, SQL_REDO
FROM V$LOGMNR_CONTENTS
WHERE UPPER(SQL_REDO) LIKE '%CREATE%';
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。
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。
LogMiner 是 DBA 手中的「時光機」,無需額外授權、無侵入式審計、支援事後取證。掌握字典提取、日志添加、時間/SCN 窗口、SESSION_INFO IP 注入技巧,配合 V$LOGMNR_CONTENTS 靈活查詢,即可在數據變更的汪洋大海中精準捕撈真相。建議生產庫常態化啟用歸檔、保留足夠日志、部署登錄觸發器,讓取證能力常備不懈。