ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10046 Event

10046 Event

原创 Linux操作系统 作者:syzxlyx_cu 时间:2009-09-28 11:13:44 0 删除 编辑

10046 Event:
 
我们知道,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信息包含低于此级的所有信息。

 
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   --> 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;

 

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

请登录后发表评论 登录
全部评论

注册时间:2009-09-28

  • 博文量
    125
  • 访问量
    124038