为何昨日执行的SQL未在DBA_HIST_SQLTEXT中找到?如何追踪?
追踪未出现在DBA_HIST_SQLTEXT中的SQL语句
先确认SQL是否仍在内存缓存中
直接查询内存中的SQL视图V$SQL,如果SQL还没被共享池刷出,这里能找到记录:SELECT sql_text, sql_id FROM V$SQL WHERE sql_text LIKE '%你的查询关键词%';若
V$SQL中也无结果,说明SQL已被清除,需用历史追踪手段。临时开启SQL Trace捕获执行过程
若能重新执行目标SQL,可先给自己的会话开启Trace:ALTER SESSION SET SQL_TRACE = TRUE;执行目标SQL后关闭Trace:
ALTER SESSION SET SQL_TRACE = FALSE;然后到服务器trace文件目录(通过
SELECT value FROM V$PARAMETER WHERE name = 'user_dump_dest';查看路径)找到对应trace文件,用tkprof工具分析:tkprof trace_file.trc output.txt explain=用户名/密码检查并调整AWR快照设置
DBA_HIST_SQLTEXT的数据来自AWR快照,若快照间隔过长或保留期不足,SQL可能未被捕获。先查看当前AWR配置:SELECT snap_interval, retention FROM DBA_HIST_WR_CONTROL;若需要更频繁的快照,可调整参数(需SYSDBA权限):
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(snap_interval => INTERVAL '30' MINUTE, retention => INTERVAL '7' DAY);借助ASH追踪会话历史
ASH记录了近期会话活动,即使SQL不在AWR中,也可能在ASH里留下痕迹:SELECT sql_id, sql_text, sample_time FROM V$ACTIVE_SESSION_HISTORY WHERE sample_time BETWEEN TO_DATE('YYYY-MM-DD HH24:MI:SS', '你的查询开始时间') AND TO_DATE('YYYY-MM-DD HH24:MI:SS', '你的查询结束时间') AND sql_text LIKE '%你的查询关键词%';也可查询
DBA_HIST_ACTIVE_SESS_HISTORY(ASH的历史快照),如果SQL在快照周期内执行过,可能存在于此。开启SQL审计长期追踪
若需要持续监控特定SQL,可开启审计功能:AUDIT SELECT TABLE BY 目标用户名 BY ACCESS; -- 根据需求调整审计范围之后通过审计视图查看记录:
SELECT sql_text, timestamp FROM DBA_AUDIT_TRAIL WHERE timestamp BETWEEN 时间范围 AND sql_text LIKE '%查询关键词%';
内容的提问来源于stack exchange,提问作者Astitva
相关产品推荐
相关产品推荐

