如何通过Oracle SQL查询prod环境近3个月package的运行使用情况
Oracle 检测近3个月PACKAGE运行情况的实现方案
Oracle 不会默认永久存储所有 PL/SQL 对象的执行历史,能否查询到对应记录取决于数据库的审计、统计数据保留配置,以下是三种可落地的实现方式:
1. 审计记录查询(结果最准确)
如果生产环境开启了审计功能,优先用审计视图查询:
- 12c 及以上版本(默认启用统一审计)查询SQL:
SELECT DISTINCT object_schema, object_name, event_timestamp FROM unified_audit_trail WHERE object_type = 'PACKAGE' AND event_timestamp >= ADD_MONTHS(SYSDATE, -3) AND action_name IN ('EXECUTE', 'CALL') ORDER BY event_timestamp DESC;
- 开启传统标准审计的场景查询SQL:
SELECT DISTINCT owner, obj_name, timestamp FROM dba_audit_trail WHERE obj_type = 'PACKAGE' AND timestamp >= ADD_MONTHS(SYSDATE, -3) AND action_name = 'EXECUTE PROCEDURE' ORDER BY timestamp DESC;
2. AWR 历史性能视图查询(无审计时的备选方案)
注意:该方案仅当你提前调整过 AWR 保留周期≥3个月时有效,Oracle 默认 AWR 仅保留8天的统计数据
可以通过历史活跃会话采样数据追溯PACKAGE调用记录,查询SQL如下:
SELECT DISTINCT p.owner, p.object_name, s.sample_time FROM dba_hist_active_sess_history s JOIN dba_objects p ON s.plsql_entry_object_id = p.object_id WHERE p.object_type = 'PACKAGE' AND s.sample_time >= ADD_MONTHS(SYSDATE, -3) ORDER BY s.sample_time DESC;
该方案的结果仅作参考:查询到记录可以证明PACKAGE确实被运行过,未查询到记录不能100%证明PACKAGE未运行,因为极短时间运行的PACKAGE可能未被会话采样捕获。
3. 静态依赖查询(仅用于排查对象调用关系)
如果你只需要确认是否有其他数据库对象(存储过程、函数、触发器、其他PACKAGE等)静态依赖目标PACKAGE,可使用如下查询:
SELECT DISTINCT owner, name, type FROM dba_dependencies WHERE referenced_type = 'PACKAGE' AND referenced_owner = 'PACKAGE所属的用户名' AND referenced_name = '目标PACKAGE名称';
该方案无法覆盖动态调用、应用端直接调用PACKAGE的场景。
补充说明
以上所有查询都需要DBA权限才能访问对应的系统视图。如果既未开启审计,AWR保留周期也不足3个月,无法从数据库层面追溯到3个月前的PACKAGE运行记录。
内容的提问来源于stack exchange,提问作者TBose
相关产品推荐
相关产品推荐

