How to trace another session using PL/SQL Package

1.DBMS_SYSTEM
[sourcecode language=”sql” light=”true”]EXECUTE dbms_system.set_sql_trace_in_session (sid,serial,TRUE);[/sourcecode]
这样的trace相当于event 10046 level 1。

停止:EXECUTE dbms_system.set_sql_trace_in_session (sid,serial,FALSE);

[sourcecode language=”sql” light=”true”]EXECUTE dbms_system.set_ev (sid,serial,10046,12,”);[/sourcecode]
这样直接设置某个会话的10046 event level 12,相当于level 4+level 8,也就是binds和waits都记录下来。

停止:EXECUTE dbms_system.set_ev (sid,serial,10046,0,”);

2. DBMS_SUPPORT
[sourcecode language=”sql” light=”true”]EXECUTE dbms_support.start_trace_in_session (sid,serial,binds=>true,waits=>true);[/sourcecode]
这样的trace相当于event 10046 level 12。

停止:dbms_support.stop_trace_in_session(sid,serial);

备注:dbms_support包默认不存在,需要执行下述SQL来安装。
$ORACLE_HOME/rdbms/admin/dbmssupp.sql

3. 在Oracle10g以后可以使用DBMS_MONITOR
[sourcecode language=”sql” light=”true”]EXECUTE DBMS_MONITOR.SESSION_TRACE_ENABLE(sid,serial, binds=>true,waits=>true);[/sourcecode]
这样的trace相当于event 10046 level 12。

停止:EXECUTE DBMS_MONITOR.SESSION_TRACE_DISABLE(sid,serial);

5 Comments Add yours

  1. qingcheng says:

    oracle为什么提供这么多方法支持这个功能呢?

  2. Kamus says:

    我也觉得没必要,但是就是这么多方法弄得我自己也记不住,所以才整理这篇文档,呵呵。

  3. Kamus says:

    实际上要这么理解。
    1. dbms_system.set_sql_trace_in_session只能实现level 1的跟踪,而dbms_system.set_ev并不是很常规的跟踪方法,毕竟不是所有人都应该知道10046的含义的。

    2. dbms_support包默认并不存在,因此也不是常规的方法。

    3. 因此在10g中,oracle推出了dbms_monitor包。
    如果要不是说跟踪其它session,而是跟踪本session,那么实际上在10g中还有dbms_session包可以使用。

  4. ztg says:

    如果是三层的应用使用的都是连接池,sql如何跟踪?关键不知道如何得到sid,serial

  5. Kamus says:

    通过sql_id总是可以知道当前在运行这个SQL的sid和serial是什么值的

Leave a Reply to Kamus Cancel reply

Your email address will not be published. Required fields are marked *