暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle10046事件

数据老匠 2016-05-16
482


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



文章转载自数据老匠,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论