现在的位置: 首页 > 综合 > 正文

10046 Event漫步

2014年02月03日 ⁄ 综合 ⁄ 共 3856字 ⁄ 字号 评论关闭

10046 Event漫步:

 

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

如果你对oracle性能调优很感兴趣或者比较专长,那么你对oracle10046事件一定不会陌生。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_statisticsTRUE,这个参数可以在会话级上进行修改。

2、  为了确保EventTrace输出能够完整进行,还要调整此会话对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, level n’;

 

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

 

 

 

启用10046 Event的几种方式

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

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

 

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

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

 

说明:

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

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

2SQL >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.trcspid为该session对应的外部进程号。

 

TKPROF的用途和使用:

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

基本用法:

tkprof tracefile 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           
tkprof does 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 过程已成功完成。

(启用Event的手段还有:利用SQLPLUS里的oradebug和dbms_support包,这里不再加以详述。)

抱歉!评论已关闭.