ORACLE 利用SQL_TRACE命令跟踪!

本文介绍如何利用Oracle的10046事件进行数据库性能诊断,包括不同级别的设置方法及其作用,适用于会话级和全局配置。文章还提供了如何启用和禁用跟踪,以及如何获取和解析跟踪文件的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

alter session set sql_trace=true;
alter session set events '10046 trace name context forever, level 8';
 
(b) 10046事件说明
10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.
10046事件可以设置以下四个级别:
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 加上绑定值(bind values)
8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8
类似sql_trace,10046事件可以在全局设置,也可以在session级设置。
1. 在全局设置
在参数文件中增加:

 

event="10046 trace name context forever,level 12"

 

此设置对所有用户的所有进程生效、包括后台进程.

 

2. 对当前session设置
通过alter session的方式修改,需要alter session的系统权限:

 

SQL> alter session set events '10046 trace name context forever';

Session altered.

SQL> alter session set events '10046 trace name context forever, level 8';

Session altered.

SQL> alter session set events '10046 trace name context off';

Session altered.

      

3. 对其他用户session设置
通过DBMS_SYSTEM.SET_EV系统包来实现:

 


SQL> desc dbms_system
...
PROCEDURE SET_EV
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SI                             BINARY_INTEGER          IN
 SE                             BINARY_INTEGER          IN
 EV                             BINARY_INTEGER          IN
 LE                             BINARY_INTEGER          IN
 NM                             VARCHAR2                IN

...

                      

其中的参数SI、SE来自v$session视图:


查询获得需要跟踪的session信息:
SQL> select sid,serial#,username from v$session where username is not null;

SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE


执行跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');

PL/SQL procedure successfully completed.

结束跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');

PL/SQL procedure successfully completed.

(c) 获取跟踪文件
以上生成的跟踪文件位于user_dump_dest目录中,位置及文件名可以通过以下SQL查询获得:


SQL> select
2 d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
3 from
4 ( select p.spid
5 from sys.v$mystat m,sys.v$session s,sys.v$process p
6 where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
7 ( select t.instance from sys.v$thread t,sys.v$parameter v
8 where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
9 ( select value from sys.v$parameter where name = 'user_dump_dest') d
10 /

 

TRACE_FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc

 
                        


(d) 读取当前session设置的参数
当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取:


SQL> set feedback off
SQL> set serveroutput on

SQL> declare
2 event_level number;
3 begin
4 for event_number in 10000..10999 loop
5 sys.dbms_system.read_ev(event_number, event_level);
6 if (event_level > 0) then
7 sys.dbms_output.put_line(
8 'Event ' ||
9 to_char(event_number) ||
10 ' is set at level ' ||
11 to_char(event_level)
12 );
13 end if;
14 end loop;
15 end;
16 /
Event 10046 is set at level 1

 
                        
org.apache.jasper.JasperException: 无法为JSP编译类: 在生成的java文件中的第:[15]行发生错误:[C:\Users\19653\AppData\Local\JetBrains\IntelliJIdea2024.3\tomcat\Unnamed_meeting\work\Catalina\localhost\ROOT\org\apache\jsp\html\article_jsp.java] The type jdk.jfr.internal.tool.Command.title is not visible Stacktrace: org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:72) org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:192) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:542) org.apache.jasper.compiler.Compiler.compile(Compiler.java:371) org.apache.jasper.compiler.Compiler.compile(Compiler.java:343) org.apache.jasper.compiler.Compiler.compile(Compiler.java:329) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51此为错误,以下为jsp代码<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.sql.*" %> <%@ page import="static jdk.jfr.internal.tool.Command.title" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>文章</title> </head> <body> <jsp:include page="/incloud/header.jsp" /> <div class="d-flex align-items-stretch"> <!-- Sidebar Navigation--> <jsp:include page="/incloud/sidebar.jsp" /> <% boolean browseCount; %> <!-- Sidebar Navigation end--> <div class="page-content"> <div class="page-header"> <div class="container-fluid"> <h2 class="h5 no-margin-bottom">发布文章</h2> </div> </div> <li class="no-padding-bottom"> <div class="list-group myList"> <!--搜索文章的条件--> <div class="myTitle"> <form class="form-inline" action="article.jsp" method="get"> <div class="form-group"> <label for="inlineFormInput" class="sr-only">Name</label> <input id="inlineFormInput" name="title" type="text" placeholder="按标题名字查找" class="mr-sm-3 form-control"> </div> <div class="form-group"> <input type="submit" value="查询" class="btn btn-primary"> </div> </form> <input id = "addArt" type="submit" value="发布文章" class="btn btn-primary"> </div> <ul> <li class="list-group-item" action="/article/findAll" method="get"> <table> <thead> <tr> <span>收藏数:100</span> <span> </span> <span> </span> <span> </span> <span>浏览数:<th> </th></span> <p class="h6">作者:<th> </th></p> <p class="h6">时间:<th></th></p> <p style="white-space:nowrap;overflow:hidden;text-overflow: ellipsis"><th></th></p> </tr> </thead> <tbody> <tr> <th scope="row">${article.user_id}</th> <td>${article.browse_count}</td> <td>${article.publish_realname}</td> <td>${publish_date}</td> </tr> </tbody> </table> </li> </ul> <nav class="text-center" aria-label="Page navigation"> <ul class="pagination"> <li> <a href="javascript:" onclick="pre()" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li> <c:forEach begin="1" end="${pageData.totalPage}" varStatus="i"> <li><a href="/article/findAll?currPage=${i.count}&Title=${Title}">${i.count}</a></li> </c:forEach> <li> <a href="javascript:" onclick="next()" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul> </nav> </div> </li> </section> <jsp:include page="/incloud/footer.jsp" /> </div> </div> </body> </html> <script type="text/javascript"> function pre() { if (${pageData.currPage-1<=0}) { layer.msg('已经到顶啦!'); return; } window.location.href = "/user/findAll?currPage=${pageData.currPage - 1}&realName=${realName}" } //添加文章跳转链接 $("#addArt").click(function () { window.location.href = '/html/article_add.jsp' }); </script>
最新发布
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值