Oracle 8i 引入 LogMiner,一組 PL/SQL 套件(DBMS_LOGMNR、DBMS_LOGMNR_D)與動態效能視圖(V$LOGMNR_*),可離線/線上分析 Redo/Archive Log,解析出完整 DML(INSERT/UPDATE/DELETE)甚至反向 SQL,適用於除錯、審計、特定交易回滾、資料增長趨勢分析。完全免費、無 GUI、命令列操作,功能極強。
@$ORACLE_HOME/rdbms/admin/dbmslsm.sql -- 建立 DBMS_LOGMNR 套件 @$ORACLE_HOME/rdbms/admin/dbmslsmd.sql -- 建立 DBMS_LOGMNR_D 套件
無字典檔時,LogMiner 輸出物件名/欄位名為十六進位(如 Object#308(col#1, col#2)),難以閱讀。建立字典檔讓輸出還原真實名稱:
-- 1. init.ora 設定 UTL_FILE_DIR
UTL_FILE_DIR = '/oracle/logs'
-- 2. 重啟資料庫生效
-- 3. 產生字典檔
CONNECT SYS
EXECUTE dbms_logmnr_d.build(
dictionary_filename => 'v816dict.ora',
dictionary_location => '/oracle/logs'
);
注意:DDL 變更結構時、分析不同資料庫時,必須重新產生字典檔。
-- 加入要分析的 Redo Log 檔案
EXECUTE dbms_logmnr.add_logfile(
logfilename => '/oracle/archive/arch_1_100.dbf',
options => dbms_logmnr.NEW
);
-- 啟動會話(指定字典檔、線上/離線模式、時間/SCN 範圍)
EXECUTE dbms_logmnr.start_logmnr(
dictfilename => '/oracle/logs/v816dict.ora',
options => dbms_logmnr.DICT_FROM_FILE
);
-- 查詢分析結果
SELECT sql_redo, sql_undo, operation, seg_name, timestamp
FROM v$logmnr_contents
WHERE seg_owner = 'SCOTT'
AND timestamp BETWEEN SYSDATE-1 AND SYSDATE;
-- 結束會話
EXECUTE dbms_logmnr.end_logmnr;
DBMS_LOGMNR.START_LOGIMNR 選項:COMMITTED_DATA_ONLY(僅顯示已提交)、SKIP_CORRUPTION、CONTINUOUS_MINE(自動挖掘線上 Redo)XID(交易 ID)過濾特定交易SEG_NAME 針對特定表分析SQL_UNDO 可直接執行實現精準回滾| 問題 | 原因 | 對策 |
|---|---|---|
| 輸出全是十六進位 | 未提供/字典檔過期 | 重建字典檔並指定 DICT_FROM_FILE |
| 找不到預期 DML | Redo Log 已被覆寫/未加入 | 確認 V$ARCHIVED_LOG 並 ADD_LOGFILE |
| 效能極慢 | 分析大量 Redo 無過濾 | 加入時間/SCN/物件/交易過濾條件 |
LogMiner 是 DBA 工具箱中的「核磁共振」,雖無 GUI 但功能深度無可取代。熟練掌握字典檔管理、會話控制與結果查詢,能在關鍵時刻從 Redo Log 還原真相、精準修復。