代码改变世界

设置会话TRACE的方法(二)

2011-06-28 13:19  Tracy.  阅读(329)  评论(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 过程已成功完成。

可以通过SIDSERIAL#来设置指定会话的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_NAMEMODULE_NAMEACTION_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_SYSTEMSET_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,上面就是通过设置10046LEVEL 12来实现包含等待事件和绑定变量的SQL_TRACE的。