Oracle 启用 Sql 跟踪的方式

发布于:2025-03-21 ⋅ 阅读:(29) ⋅ 点赞:(0)

启用 SQL 跟踪的方式

一、跟踪自己的会话或者是别人的会话
1、跟踪自己当前会话
exec dbms_session.set_sql_trace(true/false);

2、跟踪其他的会话
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false);

二、整个数据库系统开启跟踪
1、开启全库跟踪,不建议
alter system set events '10046 trace name context forever,level 1';

2、关闭跟踪
alter system set events '10046 trace name context off';

3、10046 跟踪级别
level 1:跟踪SQL语句,等于sql_trace=true,level 0 相当于 sql_trace=false
level 4:包括变量的详细信息
level 8:包括等待事件
level 12:包括绑定变量与等待事件

注意:在11g以及后续版本中已经不推荐使用
alter system set sql_trace=true;
alter system set sql_trace= false;

三、查看跟踪文件
1、查看跟踪文件位置(当前会话)
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 SYS.V$THREAD T, SYS.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; 

2、tkprof 格式化跟踪文件
tkprof trace_file_name out_file

其他启用方式

一、通过 oradebug 跟踪其他会话
查出spid和pid
select spid,pid from v$process where addr in (select paddr from v$session where sid=(613));
选定pid
oradebug setospid 5024
取消对trace文件大小的限制
oradebug unlimit;
开启10046
oradebug event 10046 trace name context forever,level 12;
查看trace地址
oradebug tracefile_name;
格式化trace文件
tkprof zzh_ora_5024.trc zzh_ora_5024.txt
关闭10046(一定要关闭)
oradebug event 10046 trace name context off;

参数介绍:
count = OCI过程执行的次数
CPU   = CPU时间,以秒为单位执行
Elapsed =以秒为单位的执行时间
Disk    =从磁盘读取缓冲区的物理次数
Query   =为一致性读取而获得的缓冲区数量
Current =在当前模式下获得的缓冲区数量(通常用于更新)
Rows    =由取回或执行调用处理的行数

二、通过 dbms_system.set_ev 启用会话跟踪

使用 dbms_system.set_ev 系统包根据 SID,SERIAL# 跟踪其他会话事件,如10046等
exec dbms_system.set_ev(sid,serial#,10046,trace_level,'');

根据 sid 查看会话跟踪文件位置
SELECT pa.value || '/' || LOWER(SYS_CONTEXT('userenv', 'instance_name')) ||
       '_ora_' || p.spid || '.trc' AS trace_file
  FROM v$session s, v$process p, v$parameter pa
 WHERE pa.name = 'user_dump_dest'
   AND s.paddr = p.addr
   AND s.sid = 979;