設定會話TRACE的方法(二)

yangtingkun發表於2011-06-27

很多時候需要設定會話的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的。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-700845/,如需轉載,請註明出處,否則將追究法律責任。

相關文章