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

Oracle LogMiner深度實戰:從Redo日志挖掘歷史操作

     編輯:Oracle 資料庫基礎

LogMiner核心價值

無需啟用審計即可事後分析:誰在什麼時間執行了什麼DML/DDL、數據如何變更、事務提交/回滾細節。支援Online Redo Log與Archived Redo Log。

環境準備(以11g/12c/19c為例)

-- 1. 設置UTL_FILE目錄權限(需重啟實例生效)
-- init.ora / spfile
utl_file_dir = '/u01/app/oracle/logminer'
-- 或 12c+ 使用目錄對象
CREATE DIRECTORY logminer_dir AS '/u01/app/oracle/logminer';
GRANT READ, WRITE ON DIRECTORY logminer_dir TO SYSTEM;

-- 2. 構建數據字典文件(離線模式,推薦)
-- 需以SYSDBA執行
EXEC DBMS_LOGMNR_D.BUILD(
  dictionary_filename => 'dict_orcl.ora',
  dictionary_location => '/u01/app/oracle/logminer'
);
-- 生成 dict_orcl.ora,可重複使用,但不可跨庫共享

添加待分析日志文件

-- 查看可用日志
SELECT * FROM v$logfile;
SELECT * FROM v$archived_log WHERE first_time > SYSDATE-1;

-- 添加日志(同一會話內操作)
EXEC DBMS_LOGMNR.ADD_LOGFILE(
  logfilename => '/u01/app/oracle/oradata/ORCL/redo01.log',
  options => DBMS_LOGMNR.NEW  -- 首個文件用NEW建立列表
);
EXEC DBMS_LOGMNR.ADD_LOGFILE(
  logfilename => '/u01/app/oracle/oradata/ORCL/redo02.log',
  options => DBMS_LOGMNR.ADDFILE
);
-- 移除文件
EXEC DBMS_LOGMNR.ADD_LOGFILE(
  logfilename => '/u01/app/oracle/oradata/ORCL/redo03.log',
  options => DBMS_LOGMNR.REMOVEFILE
);

-- 查看已添加列表
SELECT * FROM v$logmnr_logs;

啟動挖掘會話

-- 設置會話時間格式(必須與查詢格式一致)
ALTER SESSION SET nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

-- 查詢日志SCN/時間範圍
SELECT low_time, high_time, low_scn, next_scn FROM v$logmnr_logs;

-- 啟動(四選一:SCN範圍 / 時間範圍 / 字典文件 / 在線字典)
EXEC DBMS_LOGMNR.START_LOGMNR(
  dictfilename => '/u01/app/oracle/logminer/dict_orcl.ora',
  startscn => 12345678,
  endscn   => 12345999
  -- 或 starttime => TO_DATE('2024-01-15 10:00:00','YYYY-MM-DD HH24:MI:SS'),
  --    endtime   => TO_DATE('2024-01-15 12:00:00','YYYY-MM-DD HH24:MI:SS'),
  --  options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG  -- 使用在線字典(無需構建文件)
);

核心查詢:還原SQL與數據變更

-- 標準查詢:SCN、時間、會話、回滾/重做SQL
SELECT scn,
       timestamp,
       session#,
       username,
       sql_redo,
       sql_undo,
       operation,
       seg_owner,
       seg_name
FROM v$logmnr_contents
WHERE seg_owner IN ('SCOTT','HR','APP_USER')  -- 過濾目標Schema
  AND operation IN ('INSERT','UPDATE','DELETE','DDL')
ORDER BY scn, timestamp;

-- 統計高頻操作用戶
SELECT username, operation, COUNT(*)
FROM v$logmnr_contents
GROUP BY username, operation
ORDER BY COUNT(*) DESC;

結束挖掘與清理


EXEC DBMS_LOGMNR.END_LOGMNR;
-- 會話結束自動清理v$logmnr_logs/v$logmnr_contents

常見問題排查

現象原因與對策
ORA-01310: dictionary mismatch字典文件與日志來源庫版本/Schema不匹配 → 重新BUILD字典
查詢v$logmnr_logs無數據必須在同一會話內ADD_LOGFILE並查詢,新會話列表為空
中文亂碼確保NLS_LANG、數據庫字符集、會話NLS_DATE_FORMAT一致
性能極慢日志量過大 → 縮小SCN/時間範圍、過濾SEG_OWNER、使用在線字典避免文件I/O
最佳實踐:
• 關鍵業務庫常態化開啟SUPPLEMENTAL LOGGING(ALTER DATABASE ADD SUPPLEMENTAL LOG DATA),確保LogMiner能完整還原UPDATE前值。
• 結合DBMS_LOGMNR.CONTINUOUS_MINE實時挖掘在線日志,構建低延遲數據同步/審計平台。
• 12c+支援DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS)直接從Redo日志提取字典,無需預構建文件。
• 生產環境嚴禁長時間運行LogMiner會話佔用共享池,用完即END_LOGMNR。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved