使用 oracle 10046 event

描述

遇到sql语句查询出错的问题.Yong Huang版提示做10046事件.对这个事件以前一直是模糊概念.想理清楚,所以写成这个文档.供以后使用.

环境

RHEL5.4 64 + 10.2.0.4

说明

10046 event 能干什么

目前知道这是一个系统性能分析事件,这个事件可以告诉oracle内核把相应session的详细时间信息输出到trace文件中.

10046 event level (不翻译了,水平有限,翻了半天还是觉得原文好)

You can think of the event 10046 “level” attribute associated with an Oracle session as a 4-bit flag whose bits have the following meanings:

Level
Function
DecimalBinary
10001Emit statistics for parse, execute, fetch, commit, and rollback database calls (standard sql_trace)
20010Unknown
30100Emit values for SQL bind variables (also called “placeholders”)
41000Emit statistics for Oracle kernel internal function calls (also called “wait events”) listed in v$event_name

For example, a level-12 trace combines the effects of level-4  and level-8 tracing. Strangely, activating any non-zero tracing level also activates level-1 tracing. Therefore, tracing at levels 4, 8, and 12 are exactly equivalent to tracing at levels 5, 9, and 13, respectively: all these levels include the standard sql_trace output.

trace 文件位置

11gR1 或 11gR1 以上版本

SQL> show parameter diagnostic_dest

11gR1以前版本

SQL> show parameter user_dump_dest

trace 文件命名规则

tracefile 命名规则 :_ora__.trc

其中pid为相应session所对应的OS PID,tracedid 跟session的TRACEFILE_IDENTIFIER参数相关,默认TRACEFILE_IDENTIFIER为null.

eg.

给当前session设置TRACEFILE_IDENTIFIER

_ora__.trctracedid.

定位trace文件(10g版本测试通过)

1.自己当前session的trace file (需要有查询 v$mystat, v$session ,v$process 的权限)

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEselect d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
       p.spid || '.trc' trace_file_name
  from (select p.spid
          from v$mystat m, v$session s, v$process p
         where m.statistic# = 1
           and s.sid = m.sid
           and p.addr = s.paddr) p,
       (select t.instance
          from v$thread t, v$parameter v
         where v.name = 'thread'
           and (v.value = 0 or t.thread# = to_number(v.value))) i,
       (select value from v$parameter where name = 'user_dump_dest') d;

2.以sys用户查找其他session的trace file (需要知道其他session sid)

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

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

会提示输入sid的数值.嘿嘿,就是把1给小小的改动了下.sid到v$session视图中查询.这里面的trace file名字是拼出来的.所以仅仅符合trace命名规则的_ora_.trc部分


步骤

session级的trace

1.10046 trace 自己的 session

 
     
alter session set tracefile_identifier='10046';
alter session set timed_statistics = true;
alter session set statistics_level=all;
alter session set max_dump_file_size = unlimited;
--alter session set max_dump_file_size =
2147483647 ;
alter session set events '10046 trace name context forever,level 12';

-- Execute the queries or operations to be traced here --

select * from dual;
  alter session set events '10046 trace name context off';
exit;

2. dbms_system包 10046 trace 指定的session (Oracle release 8.1.6 and newer)

  conn / as sysdba
exec sys.dbms_system.set_bool_param_in_session(sid,serial#,'timed_statistics',true);
exec sys.dbms_system.set_int_param_in_session(sid,serial#,'max_dump_file_size',2147483647);
exec sys.dbms_system.set_ev(sid,serial#,10046,12,'');

-- Execute the queries or operations to be traced here --

select * from dual;

exec sys.dbms_system.set_ev(sid,serial#,10046,0,'');
exit;

3.oradebug

查询出session的SID,SERIAL#,PID和SPID(OS PID)
  conn / as sysdba
select p.PID,p.SPID,s.SID,s.SERIAL#
from v$process p,v$session s
where s.paddr = p.addr
and s.sid = &SESSION_ID;
通过OS的PID生成10046 trace
  connect / as sysdba
oradebug setospid 9834
oradebug unlimit
oradebug event 10046 trace name context forever,level 12
oradebug event 10046 trace name context off
记得把9834换成自己查询出来的OS PID
通过数据库的PID生成10046 trace
  connect / as sysdba
oradebug setorapid 9834
oradebug unlimit
oradebug event 10046 trace name context forever,level 12
oradebug event 10046 trace name context off

记得把9834换成自己查询出来的OS PID

instance级的10046 trace

Note: Please be cautious when setting system wide, as this will impact performance due to every session being traced.

修改参数文件 events参数实现instance级的10046
1.只对参数修改后新连接的session生效.
  alter system set events '10046 trace name context forever,level 12';
alter system set events '10046 trace name context off';
2.重启数据库后生效
  alter system set events '10046 trace name context forever,level 12' scope=spfile;
关闭也用 alter system set events '10046 trace name context off';

通过 Logon Trigger 做10046 trace

有些情况我们需要trace一个登录用户.这时可以通过trigger完成.

  CREATE OR REPLACE TRIGGER SYS.set_trace
AFTER LOGON ON DATABASE
WHEN (USER like '&USERNAME')
DECLARE
lcommand varchar(200);
BEGIN
EXECUTE IMMEDIATE 'alter session set statistics_level=ALL';
EXECUTE IMMEDIATE 'alter session set max_dump_file_size=UNLIMITED';
EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever, level 12''';
END set_trace;
  /

注意登录用户必须拥有alter session权限才能成功trace.

grant alter session to  ;
通过trace文件命名规则,我们可以知道,oracle kernel只在process生命期内写trace.所以,当session自然断开后,trace的工作也自然停止,而不必显式的敲入关闭trace命令.


个人总结

生成10046 trace仅仅是分析的第一步.后面还有好多分析要去学习.

疑问:

1.TRACEFILE_IDENTIFIER在某一个session中设置后,其他session怎么才能知道设置的TRACEFILE_IDENTIFIER值? session设置TRACEFILE_IDENTIFIER后,会在trace目录下有两个trace文件,一个含tracedid,一个不含.

2.dbms_system包的用法没找到.待解决.


参考文档

Oracle System Performance Analysis Using Oracle Event 10046

How To Collect 10046 Trace (SQL_TRACE) Diagnostics for Performance Issues [ID 376442.1]

如何快速获取trace文件名

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

转载于:http://blog.itpub.net/11780477/viewspace-712623/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值