LogMiner 是 Oracle 內建的日誌分析工具,可讀取線上/歸檔 Redo Log,重建 DML/DDL 操作的 SQL 陳述式,協助 DBA 定位誤操作時間點、進行時間點恢復 (PITR) 或審計追蹤。
| 版本 | 支援功能 |
|---|---|
| 8i | 僅分析 DML (INSERT/UPDATE/DELETE) |
| 9i+ | 支援 DML + DDL (CREATE/ALTER/DROP/TRUNCATE 等) |
不支援物件:Index-Organized Table (IOT)、LONG、LOB、Collection 型別、MTS (Shared Server) 環境。
DIRECTORY 物件 (9i+) 指定字典檔與日誌檔存放路徑。
-- 9i+ 建議使用 DIRECTORY
CREATE DIRECTORY logminer_dir AS '/u01/arch';
GRANT READ, WRITE ON DIRECTORY logminer_dir TO dba_user;
ARCHIVELOG 模式並已產生歸檔日誌。BEGIN
DBMS_LOGMNR_D.BUILD(
dictionary_filename => 'logminer_dict.dat',
dictionary_location => 'logminer_dir' -- DIRECTORY 物件名
);
END;
/
-- 產生的字典檔包含物件名稱、欄位定義,供後續解析 Redo 記錄使用
-- 首次加入使用 NEW 選項
BEGIN
DBMS_LOGMNR.ADD_LOGFILE(
options => DBMS_LOGMNR.NEW,
logfilename => 'logminer_dir/arc_20240115.arc'
);
END;
/
-- 後續加入使用 ADDFILE
BEGIN
DBMS_LOGMNR.ADD_LOGFILE(
options => DBMS_LOGMNR.ADDFILE,
logfilename => 'logminer_dir/arc_20240116.arc'
);
END;
/
-- 移除檔案使用 REMOVEFILE
BEGIN
DBMS_LOGMNR.ADD_LOGFILE(
options => DBMS_LOGMNR.REMOVEFILE,
logfilename => 'logminer_dir/arc_20240115.arc'
);
END;
/
BEGIN
DBMS_LOGMNR.START_LOGMNR(
dictfilename => 'logminer_dir/logminer_dict.dat',
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')
-- 也可使用 startscn/endscn 指定 SCN 範圍
);
END;
/
SELECT operation, sql_redo, sql_undo, timestamp, scn, username, table_name
FROM v$logmnr_contents
WHERE table_name = 'EMPLOYEES'
AND operation IN ('INSERT','UPDATE','DELETE')
ORDER BY timestamp;
關鍵欄位說明:
OPERATION:INSERT/UPDATE/DELETE/DDLSQL_REDO:正向重做 SQL(可直接執行復原)SQL_UNDO:反向回滾 SQL(可撤銷操作)TIMESTAMP、SCN:操作時間與系統變更號USERNAME:執行使用者SELECT timestamp, sql_redo, username
FROM v$logmnr_contents
WHERE operation = 'DDL'
AND UPPER(sql_redo) LIKE '%TRUNCATE%'
ORDER BY timestamp;
BEGIN
DBMS_LOGMNR.END_LOGMNR;
END;
/
| 視圖 | 用途 |
|---|---|
V$LOGMNR_LOGS | 目前已加入分析的日誌檔清單 |
V$LOGMNR_DICTIONARY | 已載入的字典檔資訊 |
V$LOGMNR_PARAMETERS | 目前啟動參數 (時間範圍、SCN 範圍、字典來源) |
V$LOGMNR_CONTENTS | 分析結果主視圖,含重建 SQL |
WHERE operation='DELETE' AND table_name='ORDERS'SQL_UNDO 取得 INSERT 陳述式,直接執行即可恢復資料。TIMESTAMP/SCN 作為 PITR 恢復依據。ADDFILE、查詢、REMOVEFILE 避免 PGA 爆量。DBMS_LOGMNR.START_LOGMNR(..., options => DBMS_LOGMNR.SKIP_CORRUPTION + DBMS_LOGMNR.NO_SQL_DELIMITER) 配合 WHERE owner='SCOTT' 過濾。LogMiner 是 DBA 從 Redo Log 還原真相的關鍵工具。熟練掌握字典建立、日誌加入、時間/SCN 範圍過濾、SQL_REDO/UNDO 應用,可將誤操作損失降至最低。