接上篇博文Oracle执行语句跟踪(1)——使用sql trace实现语句追踪,一旦我们通过会话追踪获取到超时事物的执行语句,就可以使用10046事件对语句进行追踪。
启用10046事件追踪的方式
SQL> alter session set events '10046 trace name context forever ,level 12' ;
SQL> alter session set events '10046 trace name context off' ;
从上面语句可以看出追踪的是当前正在使用的会话,在两个语句之间可以放入我们需要分析的语句。
获取trace文件
在当前sqlplus会话下,可以通过以下语句获得trace文件的数字编号。其中SPID即为trace文件的数字编号,一般的组成方式为实例名_ora_SPID.ora
select b.sid,b.SADDR,c.ADDR,c.PID,c.SPID from v$session b,v$process c
where b.SID=(select distinct sid from v$mystat)
and b.PADDR=c.ADDR;
trace文件的解析一样可以使用tkprof。
tkprof INST_ora_3370.trc INST_ora_3370.trc explain=test/test
用于监控的脚本
为了同时更好的分析查实事件,我写了一个脚本用于同时获取外部时间计时同时生成trace文件。
prompt written by camash
prompt Importing table ...
set trimspool on;
set linesize 120;
set pagesize 2000;
set newpage 1;
set heading off;
set term off;
spool test_formal_4.txt;
set feedback off
set define off
var t1 varchar2(20)
var t2 varchar2(20)
set timing on
alter session set events '10046 trace name context forever ,level 12' ;
exec :t1:=to_char(SYSTIMESTAMP,'hh24:mi:ss.ff3');
prompt written by camash
prompt Importing table ...
set trimspool on;
set linesize 120;
set pagesize 2000;
set newpage 1;
set heading off;
set term off;
spool test_formal_4.txt;
set feedback off
set define off
var t1 varchar2(20)
var t2 varchar2(20)
set timing on
alter session set events '10046 trace name context forever ,level 12' ;
exec :t1:=to_char(SYSTIMESTAMP,'hh24:mi:ss.ff3');
your sql script
alter session set events '10046 trace name context off' ;
prompt Done.
exec :t2:=to_char(SYSTIMESTAMP,'hh24:mi:ss.ff3')
set serverout on
exec dbms_output.put_line('start time: '|| :t1);
exec dbms_output.put_line('end time: '|| :t2);
spool off;
这样每条SQL语句的实际时间就会存放在执行目录的“test_formal_4.txt”文件中,而trace文件将在trace文件目录中生成。
版权说明:camash原创,转载请注明出处 http://www.cnblogs.com/shenfeng/
--EOF--