设置会话TRACE的方法(二)
2011-06-28 13:19 Tracy. 阅读(330) 评论(0) 编辑 收藏 举报很多时候需要设置会话的SQL_TRACE,以便于分析,简单总结一下设置的方法和适用的情况。
这一篇介绍设置其他会话SQL_TRACE的方法。
设置会话TRACE的方法(一):http://yangtingkun.itpub.net/post/468/519830
Oracle10g新增DBMS_MONITOR包(一):http://yangtingkun.itpub.net/post/468/498878
上一篇介绍的三种方法都是对当前会话生效的,但是仅靠登录触发器来实现其他会话的SQL_TRACE是不够的,有些时候一个会话是否需要TRACE在登录的时候还不能确定。
在Oracle10g中,Oracle增加了DBMS_MONITOR包,来实现其他会话的TRACE功能:
SQL> EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(125, 1, TRUE, TRUE)
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(125, 1)
PL/SQL 过程已成功完成。
可以通过SID和SERIAL#来设置指定会话的SQL_TRACE,同时可以指定是否包含等待和绑定变量信息。
除了常规的SID方式外,DBMS_MONITOR还支持其他的方式:
SQL> EXEC DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('TEST', TRUE, TRUE)
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE('TEST')
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE('SERVICE', 'MODULE', 'ACTION', TRUE, TRUE)
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE('SERVICE', 'MODULE', 'ACTION')
PL/SQL 过程已成功完成。
可以通过CLIENT_ID对指定客户端ID的所有会话进行TRACE,而CLIENT_ID是可以进行设置的。还可以通过会话的SERVICE_NAME、MODULE_NAME和ACTION_NAME进行SQL_TRACE的设置,在11g中这种方式还可以在指定实例上生效。
此外,DBMS_MONITOR还可以打开全库的SQL_TRACE:
SQL> EXEC DBMS_MONITOR.DATABASE_TRACE_ENABLE(TRUE, TRUE)
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_MONITOR.DATABASE_TRACE_DISABLE
PL/SQL 过程已成功完成。
同样11g中,这个过程还可以指定单独的实例进行设置。
DBMS_MONITOR虽然功能很强,可惜有版本限制,9i及以前的版本无法使用这个功能,下面这种DBMS_SYSTEM的功能可以在9i中设置其他会话的TRACE:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
SQL> exec dbms_system.set_sql_trace_in_session(15, 24812, true)
PL/SQL procedure successfully completed.
SQL> exec dbms_system.set_sql_trace_in_session(15, 24812, false)
PL/SQL procedure successfully completed.
这个SET_SQL_TRACE_IN_SESSION过程在9i中也算比较常用的方法了,使用这种方法可以通过SID来设置指定会话是否开启SQL_TRACE。可惜的是,这种方法不能设置等待事件和绑定变量。
如果在9i中,想要开启带绑定变量和等待事情的其他会话的SQL_TRACE,就只能利用DBMS_SYSTEM的SET_EV过程:
SQL> exec dbms_system.set_ev(15, 24812, 10046, 12, null)
PL/SQL procedure successfully completed.
SQL> exec dbms_system.set_ev(15, 24812, 10046, 0, null)
PL/SQL procedure successfully completed.
采用这种方法可以为指定的会话设置EVENTS,上面就是通过设置10046的LEVEL 12来实现包含等待事件和绑定变量的SQL_TRACE的。
本文来自博客园,作者:Tracy.,转载请注明原文链接:https://www.cnblogs.com/tracy/archive/2011/06/28/2092150.html