優點:可還原完整 SQL 文本、綁定變數、執行用戶、時間點,甚至 DML 逐行變更(補充日誌)。
缺點:需啟用歸檔模式、配置補充日誌、掌握較複雜的 DBMS_LOGMNR 套件操作;若無歸檔僅能挖掘線上日誌(時間窗極短)。
-- 1. 啟用補充日誌(一次性)
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
-- 2. 建立 LogMiner 字典(選項:線上目錄 / 扁平檔 / 歸檔中)
EXEC DBMS_LOGMNR_D.BUILD(OPTIONS => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE, DICTIONARY_FILENAME => 'dict.ora', DICTIONARY_LOCATION => '/u01/logmnr');
-- 3. 添加要挖掘的日誌檔
EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/arch/arch_1_1234.dbf', OPTIONS => DBMS_LOGMNR.NEW);
EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/arch/arch_1_1235.dbf', OPTIONS => DBMS_LOGMNR.ADDFILE);
-- 4. 啟動挖掘
EXEC DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => '/u01/logmnr/dict.ora', OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);
-- 5. 查詢 V$LOGMNR_CONTENTS
SELECT TIMESTAMP, USERNAME, SQL_REDO, SEG_OWNER, SEG_NAME, OPERATION
FROM V$LOGMNR_CONTENTS
WHERE SEG_OWNER = 'SCOTT' AND OPERATION IN ('INSERT','UPDATE','DELETE')
ORDER BY TIMESTAMP;
-- 6. 結束
EXEC DBMS_LOGMNR.END_LOGMNR();
優點:Enterprise Edition + Diagnostic Pack 授權即可用,標準 SQL 查詢,保留期可配置(預設 8 天)。
缺點:僅捕捉高負載 SQL(Top SQL),非全量 SQL;綁定變數可能被隱藏;保留期過後不可查。
SELECT
c.USERNAME,
a.PROGRAM,
b.SQL_TEXT,
b.COMMAND_TYPE,
a.SAMPLE_TIME
FROM DBA_HIST_ACTIVE_SESS_HISTORY a
JOIN DBA_HIST_SQLTEXT b ON a.SQL_ID = b.SQL_ID
JOIN DBA_USERS c ON a.USER_ID = c.USER_ID
WHERE a.SAMPLE_TIME BETWEEN SYSDATE - 3 AND SYSDATE
AND b.COMMAND_TYPE IN (7, 85) -- 7=DELETE, 85=TRUNCATE TABLE
ORDER BY a.SAMPLE_TIME DESC;
| Code | Operation |
|---|---|
| 1 | CREATE TABLE |
| 2 | INSERT |
| 3 | SELECT |
| 6 | UPDATE |
| 7 | DELETE |
| 9 | CREATE INDEX |
| 12 | DROP TABLE |
| 15 | ALTER TABLE |
| 21 | CREATE VIEW |
| 24 | CREATE PROCEDURE |
| 44 | COMMIT |
| 45 | ROLLBACK |
| 47 | PL/SQL EXECUTE |
| 85 | TRUNCATE TABLE |
| 91 | CREATE FUNCTION |
| 94 | CREATE PACKAGE |
| 100 | LOGON |
| 101 | LOGOFF |
| 157 | CREATE DIRECTORY |
| 160 | CREATE JAVA |
| 170 | CALL METHOD |
| 180 | CREATE OUTLINE |
-- 當前庫存 SQL(含完整文本、執行計劃、綁定變數)
SELECT SQL_ID, SQL_FULLTEXT, EXECUTIONS, ELAPSED_TIME/1E6 ELAPSED_SEC
FROM V$SQLAREA
WHERE PARSING_SCHEMA_NAME = 'SCOTT'
AND SQL_TEXT LIKE '%SENSITIVE_TABLE%'
ORDER BY LAST_ACTIVE_TIME DESC;
DBA_HIST_SQLTEXT 定時快照腳本或使用 Statspack。掌握雙軌查詢能力,從「發生了什麼 SQL」到「SQL 執行了什麼效果」全鏈路可視。