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);
oracle为什么提供这么多方法支持这个功能呢?
我也觉得没必要,但是就是这么多方法弄得我自己也记不住,所以才整理这篇文档,呵呵。
实际上要这么理解。
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包可以使用。
如果是三层的应用使用的都是连接池,sql如何跟踪?关键不知道如何得到sid,serial
通过sql_id总是可以知道当前在运行这个SQL的sid和serial是什么值的