SQL_TRACE工具主要用于SQL跟踪,是DBA常用的诊断工具。
SQL_TRACE可以设置为全局启动,也可以仅对某个会话的进行跟踪。
全局启用
在pfile/spfile中指明sql_trace=true
也可以在启动数据库后修改:
alter system set sql_trace=true scope=both;
当前会话启用
alter session set sql_trace=true scope=both;
但实际维护过程总我们常常需要跟踪其它用户的进程,Oracle提供DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION系统包完成这一任务。
SQL> desc dbms_system 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#信息
SQL> col username for a15 SQL> select sid,serial#,username from v$session where username is not null; SID SERIAL# USERNAME ---------- ---------- --------------- 6 579 SYS 66 4 SYS 96 5 SCOTT 98 27 SYS 222 85 SYS 对某个会话进行跟踪: SQL> exec dbms_system.set_sql_trace_in_session(96,5,true)
10046事件说明:
10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强。
10046事件可以设置以下四个级别:
level 1 启用标准的SQL_TRACE功能。
level 4 在level 1的基础上加上绑定值(bind value)
level 8 在level 1的基础上加上等待事件跟踪
level 12 level 1 + level 4 + level 8
全局设置
同样在pfile/spfile中加入配置参数
event="10046 trace name context forever,level 12"
会话级别设置
alter session set events'10046 trace name context forever,level 12';
关闭跟踪
alter session set events‘10046 trace name context off’;
对其它用户会话设置
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表示SID和SERIAL#,来自于V$SESSION,EV表示EVENTS 事件号,LE表示LEVEL,NM表示用户名。
exec dbms_system.set_ev(222,85,10046,12,'SYS')
查看当前会话设置的跟踪等级:
set feedback off set serveroutput on declare event_level number; event_number number; begin for event_number in 10000 .. 10999 loop sys.dbms_system.read_ev(event_number, event_level); if (event_level > 0) then sys.dbms_ouput.put_line('Event' || to_char(event_number) || 'is set to level' || to_char(event_level)); end if; end loop; end;
获取事件信息后如何查看呢?从11G以后Oracle引入新的查案跟踪文件的方式:
SQL> show parameter diagnostic_dest NAME TYPE VALUE ----------------- -------------- ---------------------- diagnostic_dest string /DBBK/oracle
11g以前的查看方式
SELECT a.VALUE || b.SYMBOL || c.instance_name || '_ora_' || d.spid || '.trc' trace_file FROM (SELECT VALUE FROM V$PARAMETER WHERE NAME = 'user_dump_dest') a, (SELECT SUBSTR(VALUE, -6, 1) SYMBOL FROM V$PARAMETER WHERE NAME = 'user_dump_dest') b, (SELECT INSTANCE_NAME FROM V$INSTANCE) c, (SELECT SPID FROM v$SESSION S, V$PROCESS P, V$MYSTAT M WHERE S.PADDR = P.ADDR AND S.SID = M.SID AND M.STATISTIC# = 0) d; 或通过 SQL> show parameter user_dump_dest NAME TYPE VALUE ---------------- ------------------- ------------------------------ user_dump_dest string /DBBK/oracle/diag/rdbms/orcl/o rcl/trace
参数方式
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 events '10046 trace name context forever,level 12'; alter session set events '10046 trace name context off';
获取会话的进程ID
select p.PID, p.SPID, s.SID from v$process p, v$session s where s.paddr = p.addr and s.sid = &SESSION_ID;
通过登录SQLPLUS执行以下语句
oradebug setospid SPID/oradebug setorapid PID oradebug unlimit oradebug event 10046 trace name context forever,level12 oradebug event 10046 trace name context off
通过初始化参数设置实例跟踪
event="10046 trace name context forever,level 12"
通过logon trigger设置跟踪
CREATE OR REPLACE TRIGGER SYS.SET_TRACE AFTER LOGON ON DATABASE WHEN (USER LIKE '&USERNAME') DECLARE L_CMD VARCHAR2(200); BEGIN EXECUTE IMMEDIATE 'ALTER SESSION SET TARCEFILE_IDENTIFIER=''From_Trigger'''; 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;
参考文章:http://blog.sina.com.cn/s/blog_61cd89f60102edlx.html