oracle sql_trace

一 sql_trace 一般不会在全局启用,除非有特别需要
二 sql_trace 一般用来跟踪某个会话的执行步骤
    2.1 启用当前会话的
    alter session set sql_trace=true;
     查找相应的sql_trace文件
    --windows
    select c.value||'\ora'||to_char(a.spid,'fm00000')||'.trc' from v$process a,v$session b,v$parameter c where a.addr=b.paddr
    and b.audsid=userenv('sessionid') and c.name='user_dump_dest'
    --unix
     select c.value||'/'||lower(d.instance_name)||'_ora_'||to_char(a.spid,'fm0000')||'.trc' from v$process a,v$session b,v$parameter c ,v$instance d where a.addr=b.paddr and b.audsid=userenv('sessionid') and c.name='user_dump_dest'
     2.2跟踪他人会话的.估计这个是用的最多的
     这可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION来完成
   PROCEDURE SET_SQL_TRACE_IN_SESSION
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SID                            NUMBER                  IN
 SERIAL#                        NUMBER                  IN
 SQL_TRACE                      BOOLEAN                 IN 
这里需要从v$session中取出sid,serial#
 select sid,serial# from v$session where machine='snowhill';

设置跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,true)
停止跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,false)

---- 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';
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
---------- ---------- ------------------------------
      4302      13675 CCXE2
      4304        652 CCXE2
      4309      27062 CCXE2
      4311        779 CCXE2

执行跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,8,'CCXE');

PL/SQL procedure successfully completed.

结束跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,0,'CCXE');

PL/SQL procedure successfully completed.

----读取当前session设置的参数
当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取:

SQL> set feedback off

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


posted on 2011-09-11 10:57 snowhill 阅读(218) 评论(0)  编辑 收藏 引用 所属分类: 数据库-oracle


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

公告

又一年...........

留言簿(3)

随笔分类(13)

文章分类(131)

文章档案(124)

c++

java

linux

oracle

常用软件

其他

网络配置

系统安全

音乐

搜索

最新评论

阅读排行榜