一 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