Oracle 8i 引入的免費內建工具,透過 PL/SQL 套件 (DBMS_LOGMNR, DBMS_LOGMNR_D) 與動態視圖 (V$LOGMNR_CONTENTS) 解析線上/歸檔 Redo Log,還原 DML (INSERT/UPDATE/DELETE) 及對應的回滾 SQL,適用於稽核、除錯、點時刻恢復、誤操作回復。
@$ORACLE_HOME/rdbms/admin/dbmslsm.sql -- 建立 DBMS_LOGMNR
@$ORACLE_HOME/rdbms/admin/dbmslsmd.sql -- 建立 DBMS_LOGMNR_D
否則物件名稱顯示為 16 進位 Object ID,難以閱讀。
-- 1. 設定 UTL_FILE_DIR (init.ora)
UTL_FILE_DIR = /u01/app/oracle/admin/logminer_dict
-- 2. 重啟資料庫生效
-- 3. 產生字典檔
EXEC DBMS_LOGMNR_D.BUILD(
dictionary_filename => 'dict_ora9i.ora',
dictionary_location => '/u01/app/oracle/admin/logminer_dict'
);
-- 線上日誌
EXEC DBMS_LOGMNR.ADD_LOGFILE(
logfilename => '/u01/oradata/ORCL/redo01.log',
options => DBMS_LOGMNR.NEW
);
-- 歸檔日誌 (可多次呼叫 ADD_LOGFILE 累加)
EXEC DBMS_LOGMNR.ADD_LOGFILE(
logfilename => '/u01/arch/arch_1_100.dbf',
options => DBMS_LOGMNR.ADDFILE
);
-- 無條件分析
EXEC DBMS_LOGMNR.START_LOGMNR(
options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
);
-- 有條件:時間範圍
EXEC DBMS_LOGMNR.START_LOGMNR(
starttime => TO_DATE('2023-07-15 00:00:00','YYYY-MM-DD HH24:MI:SS'),
endtime => TO_DATE('2023-07-15 23:59:59','YYYY-MM-DD HH24:MI:SS'),
options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
);
-- 有條件:SCN 範圍
EXEC DBMS_LOGMNR.START_LOGMNR(
startscn => 12345678,
endscn => 12345999,
options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
);
-- 查詢特定使用者對特定表的操作
SELECT sql_redo, sql_undo, operation, timestamp, username
FROM v$logmnr_contents
WHERE seg_owner = 'SCOTT' AND table_name = 'EMP'
ORDER BY timestamp;
-- 取得特定交易的完整 SQL
SELECT sql_redo FROM v$logmnr_contents
WHERE xidusn = 1 AND xidslt = 12 AND xidsqn = 3456
ORDER BY timestamp;
EXEC DBMS_LOGMNR.END_LOGMNR; -- 釋放 PGA 記憶體,結果視圖失效
| 場景 | 操作重點 |
|---|---|
| 誤刪資料回復 | 找出 DELETE SQL_UNDO,改寫為 INSERT 執行 |
| 誤更新回滾 | 取得 UPDATE 的 SQL_UNDO 直接執行 |
| 稽核敏感表異動 | 定期分析歸檔日誌,篩選關鍵表操作 |
| 應用除錯 | 追蹤特定 Session/交易的完整 SQL 序列 |
| 容量規劃 | 分析日誌產生量趨勢,預估儲存/備份需求 |
ADD_LOGFILE + START/ENDDDL (除非啟用 DBMS_LOGMNR.DDL_DICT_TRACKING)ALTER DATABASE ADD SUPPLEMENTAL LOG DATA) 可獲得完整欄位前後值