在 Oracle 数据库中查询执行过的 SQL 语句,可以通过以下几种方法实现。需要注意的是,某些方法需要特定权限(如 DBA 权限)或审计配置。
方法 1:使用动态性能视图V$SQL或V$SQLAREA
这些视图记录了当前在共享池中缓存的 SQL 语句(数据库重启后可能丢失)。
sql
复制
-- 查询最近执行的 SQL(按执行时间排序)
SELECT
sql_id,
sql_text,
executions,
last_active_time,
elapsed_time/1000000 AS elapsed_seconds
FROM
v$sql
WHERE
sql_text LIKE 'SELECT%' -- 按需过滤
ORDER BY
last_active_time DESC;
字段说明:
- sql_id:SQL 的唯一标识符。
- sql_text:SQL 文本(可能截断)。
- executions:执行次数。
- last_active_time:最后一次执行时间。
- elapsed_time:总耗时(微秒,需转换为秒)。
方法 2:使用DBA_HIST_SQLTEXT(需 AWR 支持)
如果启用了 AWR(Automatic Workload Repository),可以查询历史 SQL 语句(需 Oracle Diagnostic Pack 许可)。
sql
复制
-- 查询历史 SQL 语句(按时间范围)
SELECT
sql_id,
sql_text,
dbms_lob.substr(sql_text, 1000, 1) AS partial_text
FROM
dba_hist_sqltext
WHERE
sql_text LIKE 'SELECT%' -- 按需过滤
AND sql_id IN (
SELECT sql_id
FROM dba_hist_sqlstat
WHERE snap_id BETWEEN 100 AND 200 -- 指定 AWR 快照范围
);
方法 3:通过审计日志(需启用审计)
如果启用了数据库审计,可以通过审计表查询历史 SQL。
步骤 1:启用审计
sql
复制
-- 启用审计(需 SYSDBA 权限)
AUDIT SELECT TABLE, INSERT TABLE, UPDATE TABLE, DELETE TABLE BY ACCESS;
步骤 2:查询审计记录
sql
复制
-- 查询审计日志中的 SQL 操作
SELECT
username,
sql_text,
timestamp
FROM
dba_audit_trail
WHERE
sql_text IS NOT NULL
ORDER BY
timestamp DESC;
方法 4:使用 LogMiner 分析归档日志
通过 LogMiner 解析归档日志中的 SQL 操作(需归档日志和补充日志)。
步骤 1:添加补充日志
sql
复制
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
步骤 2:使用 LogMiner 工具
sql
复制
-- 配置 LogMiner
EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/path/to/archive_log_1.arc', OPTIONS => DBMS_LOGMNR.NEW);
EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
-- 查询日志中的 SQL
SELECT
sql_redo,
timestamp,
username
FROM
v$logmnr_contents
WHERE
sql_redo LIKE '%DELETE%'; -- 按需过滤
方法 5:通过触发器捕获 SQL(自定义跟踪)
创建一个数据库触发器,记录用户执行的 SQL(需谨慎使用,可能影响性能)。
sql
复制
CREATE OR REPLACE TRIGGER capture_sql_trigger
AFTER LOGON ON DATABASE
DECLARE
v_sql_text CLOB;
BEGIN
SELECT sys_context('USERENV', 'CURRENT_SQL') INTO v_sql_text FROM dual;
INSERT INTO sql_audit_table (username, sql_text, timestamp)
VALUES (USER, v_sql_text, SYSTIMESTAMP);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
注意事项
- 权限要求:
- 查询 V$SQL、DBA_HIST_SQLTEXT 等视图需要 SELECT_CATALOG_ROLE 或 DBA 权限。
- 审计功能需要 AUDIT_ADMIN 权限。
- 数据保留时间:
- V$SQL 中的数据在数据库重启后会丢失。
- DBA_HIST_SQLTEXT 的保留时间取决于 AWR 快照配置。
- 性能影响:
- 频繁审计或使用触发器可能影响数据库性能。
总结
- 实时查询:使用 V$SQL 或 V$SQLAREA。
- 历史分析:使用 DBA_HIST_SQLTEXT(需 AWR 许可)。
- 安全审计:通过数据库审计表 DBA_AUDIT_TRAIL。
- 深度分析:使用 LogMiner 解析归档日志。
根据需求选择合适的方法,并确保符合许可和权限要求。