oracle sql跟踪 event 10046 - 转

我们知道,Oracle提供了Internal Events以便Oracle Support人员利用其对Oracle的内部行为进行一些更为深入细致的记录与跟踪,从而分析查找并解决Oracle用户所遇到的棘手问题。对于大部分的Internal Events,Oracle是没有官方文档加以阐述的,不过,这些Events中有几个是被公认为非常重要并被广泛研究和采用的。这其中,最重要的就是在进行Sql Tuning时常利用的10046 event。

如果你对oracle性能调优很感兴趣或者比较专长,那么你对oracle的10046事件一定不会陌生。10046 event是对oracle进行系统性能分析时一个最重要的手段。当激活这个事件后,将通知oracle kernel追踪会话的相关即时信息,并写入到相应trace文件中。这些有用的信息主要包括:sql是如何进行解析及其执行计划,绑定变量的使用情况,会话中发生的等待事件等。

10046 event可分成不同的级别(level),分别追踪记录不同程度的有用信息。对于这些不同的级别,应当注意的是向下兼容的,即最高级的trace信息包含低于此级的所有信息。

[@more@]

10046 Event的追踪级别大致有:

level 1:跟踪sql语句,包括解析、执行、提取、提交和回滚等;

level 4:包括变量的详细信息;

level 8:包括等待事件;

level 12:包括绑定变量与等待事件。

其中,level 1相当于打开了sql_trace。

10046 Event启用前的准备:

前提条件:(先确保实例或会话的环境符合条件)

1、 必须确保timed_statistics为TRUE,这个参数可以在会话级上进行修改。

2、 为了确保Event的Trace输出能够完整进行,还要调整此会话对Trace文件大小的限制,一般地,将max_dump_file_size设置为一个很大的阙值,或者取消此限制,即设置为UNLIMITED。(不建议设置为UNLIMITED,因为有可能会造成磁盘空间使用异常)

在设置完了上述条件后,就可以启用Event进行后台跟踪了。

Oracle event的启用可以在实例级或者会话级上来进行。其中,实例级的启用方式是在初始化参数文件中设置event参数的值。

如果想要在实例级启用10046 event,则可在初始化参数文件pfile中增加如下一行:

event=’10046 event trace name context forever, level n’

或者:

SQL >alter system set events ‘10046 trace name context forever, leveln’;

由于event的启用对系统资源消耗很大,因此,一般不建议在生产运行库中启用实例级上的event。实际情况中,也是没有必要对整个实例进行event的TRACE。下面就主要针对会话级10046 event的情况进行大致阐述。

启用10046 Event的几种方式

一种是在当前会话启用event。可以利用alter session set events语句,如下:

SQL >alter session set events ‘10046 trace name context forever, leveln’;

一种是在当前会话中对别的会话启用event跟踪。可以利用oracle提供的包dbms_system来完成,如下:

SQL >exec dbms_system.set_ev(sid,serial#,10046,n,’’);

说明:

1、获取当前会话的sid和serial#可以通过下面语句来实现:

SQL >select sid, serial# from v$session where sid = (select sid from v$mystat where rownum=1);

2、SQL >exec dbms_system.set_sql_trace_in_session(sid,serial#,true);

相当于打开了sql_trace。

10046 Event的关闭:

可以通过下面的语句来关闭当前会话的event:

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

也可以利用dbms_system包来关闭某个会话的event:

SQL >execute dbms_system.set_ev(sid,serial#,10046,0,’’);

这里应当注意的是,TRACE将消耗相当的系统资源,因此我们在使用TRACE的时候应当慎重。对于在线的生产系统,在必要时应当选择合适的时候进行TRACE操作,并且应当及时关闭。

Trace文件的查找:

当利用事件trace完当前或某个session后,接下来我们的工作就是找到oracle生成的trace文件了。Oracle的初始化参数文件中user_dump_dest的设置将决定trace文件的生成位置。我们可以通过查看参数文件,或者借助sqlplus来查询得出user_dump_dest所设定的路径:

SQL> show parameter user_dump_dest

NAME TYPE VALUE

---------------------- ----------- ------------------------------

user_dump_dest string /oracle/app/oracle/admin/SIDDB/udump

SQL> col name format a20

SQL> col value format a50

SQL> select name,value from v$parameter where name='user_dump_dest';

NAME VALUE

-------------------- --------------------------------------------------

user_dump_dest /oracle/app/oracle/admin/ SIDDB /udump

unix下,trace文件的命名规则一般是sid_ora_spid.trc。spid为该session对应的外部进程号。

TKPROF的用途和使用:

oracle提供了一个工具tkprof来对trace文件进行格式的翻译,以便trace文件中记录的信息能够被我们容易获取和理解。

基本用法:

tkproftracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ]
table=schema.tablename Use 'schema.tablename' with 'explain=' option.
explain=user/password Connect to ORACLE and issue EXPLAIN PLAIN.
print=integer List only the first 'integer' SQL statements.
aggregate=yes|no
insert=filename List SQL statements and data inside INSERT statements.
sys=no tkprofdoes not list SQL statements run as user SYS.
record=filename Record non-recursive statements found in the trace file.
sort=option Set of zero or more of the following sort options:
prscnt number of times parse was called
prscpu cpu time parsing
prsela elapsed time parsing
prsdsk number of disk reads during parse
prsqry number of buffers for consistent read during parse

从Trace文件中发现有用的信息,寻找必要的性能调整点:

大部分情况下,通过10046事件trace到文件里的信息包含了此会话中存在的性能问题,可以根据trace到的等待事件、SQL语句执行情况以及绑定变量的使用情况来进行分析和查找。

这部分的内容就要结合实际应用情况,具体情况具体分析了。

小知识:

检查当前会话的sql_trace状态或级别:

SQL>set serveroutput on

2 declare i_event number;

3 begin

4 sys.dbms_system.read_ev(10046,i_event);

5 dbms_output.put_line(‘the session sql_trace level is: ‘||i_event);

6 end;

7 /


the session sql_trace level is: 12

PL/SQL 过程已成功完成。

****************************************************************

另类跟踪用户session 的方法:
1. top or sm50 --&gt PID

2. SELECT sid, serial#
FROM v$session s, v$process p
Where s.paddr = p.addr
AND p.spid = '&pid'

3. exec dbms_system.set_sql_trace_in_session(sid, serial#, true);

4. exec dbms_system.set_sql_trace_in_session(sid, serial#, false);

5. tkprof xxxx.trc session.txt explain=sapr3/xxxx aggregate=yes sys=no waits=yes sort=fchela;

转自:http://hi.baidu.com/%BC%FB%D6%A4my%B3%C9%B3%A4/blog/item/e5107dd03d51a0d2a8ec9a3c.html

http://hi.baidu.com/taojia/blog/item/d303d0c4bfbee8c339db49be.html

-------------------------

alter session set events '10046 trace name context forever, level 1';

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

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


ALTER SYSTEM SET EVENT='10046 trace name context forever,level 8';
ALTER SYSTEM SET EVENT='10046 trace name context off';

tkprof appstb_ora_1019924.trc session.txt explain=SYS/***** aggregate=yes waits=yes sort=fchela;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/789833/viewspace-1039970/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/789833/viewspace-1039970/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值