当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
  oracle综合:使用SQL_TRACE进行数据库诊断(2)
发布时间:2010/11/27 14:11:40 来源:www.xue.net 编辑:城市总裁吧

  -

  停止跟踪:

  SQL> exec dbms_system.set_sql_trace_in_session(9,437,false)

  PL/SQL procedure successfully completed.

  (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 offSQL> 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

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved