
10046事件:
该事件号是Oracle为跟踪一个SQL的执行过程而特定的一个事件号,通过该事件号可以跟踪SQL执行过程中的各种信息。
10046等待级别:
level 1:跟踪SQL语句,包括解析、执行、提取、提交和回滚等
level 4:包括变量的详细信息
level 8:包括等待事件
level 12:包括绑定变量与等待事件
其中,level 1相当于打开了sql_trace
开启监控:
alert session set events '10046 trace name context forever, level 12';
结束监控:
alert session set events '10046 trace name context forever off';
查看生成的跟踪文件:
SELECT VALUE || '/' || (SELECT INSTANCE_NAME FROM V$INSTANCE) || '_ora_' ||
(SELECT spid || '.trc'
FROM v$process x, v$session y
WHERE x.ADDR = y.PADDR
AND Y.SID = sys_context('userenv', 'sid'))
FROM V$PARAMETER X
WHERE X.NAME = 'user_dump_dest';
跟踪当前用户:
跟踪当前用户自己的SQL执行信息。
SQL> conn username/password
alter session set tracefile_identifier = 'id_10046';
alter session set timed_statistics = true;
alter session set statistics_level=all;
alter session set max_dump_file_size = unlimited;
alter session set "_rowsource_execution_statistics" = TRUE;
alter session set events '10046 trace name context forever, level 12';
<Run your SQL here;>
alter session set events '10046 trace name context off';
一般跟踪:
SQL> conn username/password
alter session set tracefile_identifier = 'id_10046';
alter session set events '10046 trace name context forever, level 1';
<Run SQL>
alter session set events '10046 trace name context off';
查看生成的转储文件:
适用于11g:
SELECT VS.SID SESSION_ID, VS.SERIAL#,VS.USERNAME LOGIN_USERNAME,
VP.TRACEFILE
FROM V$SESSION VS
LEFT JOIN V$PROCESS VP
ON VS.PADDR = VP.ADDR
WHERE EXISTS (SELECT 1 FROM V$MYSTAT VM WHERE VM.SID = VS.SID);
适用于10g:
SELECT VALUE || '/' || (SELECT INSTANCE_NAME FROM V$INSTANCE) || '_ora_' ||
(SELECT spid || '.trc'
FROM v$process x, v$session y
WHERE x.ADDR = y.PADDR
AND Y.SID = sys_context('userenv', 'sid'))
FROM V$PARAMETER X
WHERE X.NAME = 'user_dump_dest';
跟踪其它用户的会话信息:
系统管理员打开另一个会话,以跟踪某一个会话的SQL执行信息。
启用跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(sid => 1234,serial# => 56789,sql_trace => true);
设置10046事件:
SQL> exec dbms_system.set_ev(sid => 1234,serial# => 56789,event => 10046,level => 12,number => null);
跟踪完毕:
SQL> exec dbms_system.set_sql_trace_in_session(sid => 1234,serial# => 56789,sql_trace => false);
跟踪实验:
先得到被监控会话的sid:
SQL> select sid from v$mystat where rownum < 2;
SID
----------
140
监控会话开启监控:
SQL> SELECT SID,SERIAL# FROM GV$SESSION X WHERE X.SID = 140;
SID SERIAL#
---------- ----------
140 2083
SQL> exec DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID => 140,SERIAL# => 2083,SQL_TRACE => TRUE);
PL/SQL procedure successfully completed
SQL> exec DBMS_SYSTEM.SET_EV(SI => 140,SE => 2083,EV => 10046,LE => 12,NM => NULL);
PL/SQL procedure successfully completed
被监控的会话开始执行SQL语句:
SQL> SELECT COUNT(*) FROM TABX;
COUNT(*)
----------
999999
SQL> select COUNT(*) from TABX t WHERE FNUM = 80;
COUNT(*)
----------
10000
监控结束:
SQL> exec DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID => 140,SERIAL# => 2083,SQL_TRACE => FALSE);
PL/SQL procedure successfully completed
查看生成的跟踪文件:
SELECT VALUE || '/' || (SELECT INSTANCE_NAME FROM V$INSTANCE) || '_ora_' ||
(SELECT spid || '.trc'
FROM v$process x, v$session y
WHERE x.ADDR = y.PADDR
AND Y.SID = 140)
FROM V$PARAMETER X
WHERE X.NAME = 'user_dump_dest';
其路径为:
/oracle/app/diag/rdbms/ctos/ctos/trace/ctos_ora_1451.trc
使用tkprof进行格式转换:
[oracle@dodata trace]$ tkprof /oracle/app/diag/rdbms/ctos/ctos/trace/ctos_ora_1451.trc result_140.trc
TKPROF: Release 11.2.0.1.0 - Development on Mon Feb 13 20:41:26 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
查看跟踪文件:
[oracle@dodata trace]$ cat result_140.trc
使用Oradebug跟踪会话:
使用Oradebug即可以跟踪当前用户自身的操作,也可以跟踪其它某个用户的操作。
注意:使用Oradebug操作时,必须是以sysdba的身份。
操作自身:
SQL> conn sys/oracle as sysdba
Connected.
SQL> oradebug setmypid
Statement processed.
操作其它会话:
SQL> SELECT SID FROM V$MYSTAT where rownum < 2;
SID
----------
140
查询Orapid:
SELECT P.PID ORACLE_PROCESS_ID
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR
AND S.SID = 140;
设置跟踪orapid:
SQL> oradebug setorapid 33
Oracle pid: 33, Unix process pid: 1862, image: oracle@dodata.com
设置10046事件:
SQL> oradebug unlimit;
Statement processed.
SQL> oradebug event 10046 trace name context forever,level 8;
Statement processed.
SQL> oradebug event 10046 trace name context off;
Statement processed.
生成跟踪文件的路径:
SQL> oradebug tracefile_name
/oracle/app/diag/rdbms/ctos/ctos/trace/ctos_ora_1862.trc





