Oracle数据库中是否存在存储用户执行的历史SQL查询的表?
Oracle中存储用户历史SQL查询的相关对象
v$sql和v$sqlstats属于内存级视图,仅保留当前在共享池中的SQL语句。一旦SQL因内存压力被置换出共享池,就无法在这两个视图中查询到——这大概率是你没找到有效信息的原因。若需长期存储的历史SQL记录,依赖AWR(自动工作负载库)相关视图:
DBA_HIST_SQLTEXT:存储AWR快照捕获的SQL文本,默认每小时生成一次快照,数据保留8天(可通过修改AWR配置调整周期)。查询示例:SELECT sql_id, sql_text FROM dba_hist_sqltext WHERE parsing_schema_name = '目标用户名' ORDER BY snap_id DESC;DBA_HIST_SQLSTAT:关联DBA_HIST_SQLTEXT的sql_id,可获取对应SQL的历史执行统计数据。
ASH(活动会话历史)相关视图也能记录会话级SQL活动:
V$ACTIVE_SESSION_HISTORY:内存级视图,记录最近的会话活动(默认保留约1小时);DBA_HIST_ACTIVE_SESS_HISTORY:AWR持久化的ASH数据,保留周期和AWR一致,适合查看近期会话的SQL执行情况。
若需更细粒度或自定义的长期SQL记录,可通过以下方式实现:
- 开启Fine-Grained Auditing(FGA),使用
DBMS_FGA包创建审计策略,捕获特定用户、表或操作的SQL; - 自定义触发器或使用
DBMS_MONITOR包,将SQL记录到自定义表中。
- 开启Fine-Grained Auditing(FGA),使用
补充:查询上述视图需要
SELECT_CATALOG_ROLE权限,若权限不足也会导致无法获取有效数据。
内容的提问来源于stack exchange,提问作者user1929905
相关产品推荐
相关产品推荐

