如何查看连接Oracle的Java黑盒所执行的SQL/PLSQL?AWR可行吗?
可以通过AWR查看黑盒Java代码执行的SQL/PLSQL内容
*AWR(Automatic Workload Repository)*会自动捕获数据库中资源消耗较高或执行次数较多的SQL语句及PL/SQL调用信息,只要你的Java代码执行的SQL/PLSQL满足AWR的采样条件,就能通过AWR获取到具体执行内容。以下是具体操作步骤:
一、生成AWR报告(支持命令行/图形化方式)
1. 命令行方式(服务器端操作)
- 登录Oracle数据库服务器,使用
sqlplus以DBA权限用户(如sys)登录:sqlplus / as sysdba - 执行AWR报告生成脚本:
@?/rdbms/admin/awrrpt.sql - 按提示选择报告格式(HTML/TEXT),指定要分析的快照时间范围(需输入起始、结束快照ID,可通过
DBA_HIST_SNAPSHOT视图查询快照列表)。
2. 图形化方式(Oracle Enterprise Manager,OEM)
- 登录OEM控制台,导航至性能 -> AWR报告,选择目标数据库,指定时间范围后生成报告即可。
二、在AWR报告中定位目标SQL/PLSQL
生成报告后,重点查看以下核心板块:
- Top SQL Statements:按CPU、逻辑读等资源消耗排序的SQL列表,找到与Java代码执行时间匹配的条目,查看完整SQL文本(若为PL/SQL,会显示调用的存储过程/函数名,甚至完整块内容)。
- SQL Details:单条SQL的详细信息,包含执行计划、绑定变量值(若AWR已捕获)。
- PL/SQL Statistics:若执行的是PL/SQL块,这里会列出执行过的存储过程、函数及其调用次数、资源消耗数据。
三、直接查询AWR视图(精准定位)
若无需完整报告,可直接查询AWR底层视图获取目标内容:
- 查询指定时间范围内的SQL文本:
替换SELECT sql_id, sql_text, executions_total, cpu_time_total FROM dba_hist_sqltext t JOIN dba_hist_sqlstat s ON t.sql_id = s.sql_id WHERE s.snap_id BETWEEN &start_snap AND &end_snap ORDER BY cpu_time_total DESC;&start_snap和&end_snap为实际快照ID,按资源消耗排序后,优先级最高的SQL大概率是Java代码执行的内容。 - 查询PL/SQL执行信息:
SELECT plsql_name, executions_total, cpu_time_total FROM dba_hist_plsql_stat WHERE snap_id BETWEEN &start_snap AND &end_snap ORDER BY cpu_time_total DESC;
注意事项
- AWR默认采样周期为1小时,快照保留时间为8天;若Java代码执行的SQL/PLSQL资源消耗极低,可能无法被AWR捕获,此时可考虑开启SQL Trace或使用ASH(Active Session History)补充排查。
- 操作需具备
SELECT_CATALOG_ROLE或DBA权限。
内容的提问来源于stack exchange,提问作者mikcutu
相关产品推荐
相关产品推荐

