分类: Oracle
2008-04-17 08:55:32
1.sql_trace
a. 全局
在 pfile/spfile 中使用
sql_trace=true
导致所有进程的活动都被跟踪,后台进程和用户SESSION ,导致严重的性能问题。慎重使用
b.当前SESSION
alter session set sql_trace=true ;
alter session set sql_trace=flase ;
c.跟踪指定的SESSION
DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,SQL_TRACE);
EXP:
select sid,serial#,username from v$session ;
exec dbms_system.set_sql_trace_in_session(sid,s#,true);
2.autotrace
autotrace 只能用于sqlplus
set autotrace [on|state|traceonly]
set timming on
3.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级设置。
全局
pfile文件中加
event ="10046 trace name context forever,level 12"
包括所有进程后台进程
当前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.
对其他用户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 test
执行跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,8,'test');
PL/SQL procedure successfully completed.
结束跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,0,'test');
PL/SQL procedure successfully completed.
(c) 获取跟踪文件
以上生成的跟踪文件位于user_dump_dest目录中,位置及文件名可以通过以下SQL查询获得:
--获取trace文件名称的脚本
select 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