SQL_TRACE诊断

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

你可能感兴趣的:(oracle,sql_trace)