DBMS_SUPPORT包簡單使用
本片文章介紹下追蹤SQL的另一種方法,使用DBMS_SUPPORT包來追蹤SQL。
DBMS_SUPPORT是Oracle為內部人員提供的一個軟體包。供內部支援人員使用以更有效地跟蹤SQL。館方文件上沒有這個包的說明檔案,預設情況下,系統不安裝這個包。
SQL> desc dbms_support ERROR: ORA-04043: object dbms_support does not exist
DBMS_SUPPORT包ORACLE RDBMS 7.2版本開始就有提供,但是某些平臺/版本可能已經不存在了,如果需要使用的話,需進行單獨安裝,安裝DBMS_SUPPORT包也很簡單,只要執行$ORACLE_HOME/rdbms/admin/目錄下的dbmssupp.sql指令碼即可。
SQL> @?/rdbms/admin/dbmssupp Package created. Package body created.
DBMS_SUPPORT包的結構很簡單,只有當前SESSION和其他SESSION兩個級別。
SQL> desc dbms_support FUNCTION MYSID RETURNS NUMBER FUNCTION PACKAGE_VERSION RETURNS VARCHAR2 PROCEDURE START_TRACE Argument NameTypeIn/Out Default? ------------------------------ ----------------------- ------ -------- WAITSBOOLEANINDEFAULT BINDSBOOLEANINDEFAULT PROCEDURE START_TRACE_IN_SESSION Argument NameTypeIn/Out Default? ------------------------------ ----------------------- ------ -------- SIDNUMBERIN SERIALNUMBERIN WAITSBOOLEANINDEFAULT BINDSBOOLEANINDEFAULT PROCEDURE STOP_TRACE PROCEDURE STOP_TRACE_IN_SESSION Argument NameTypeIn/Out Default? ------------------------------ ----------------------- ------ -------- SIDNUMBERIN SERIALNUMBERIN
下面分別演示下DBMS_SUPPORT包各個功能的用法:
1.FUNCTION MYSID:如果我們要查詢當前會話的SID和SERIAL#,我們通常先去查詢V$MYSTAT檢視,然後再去查詢V$SESSION檢視,現在我們也可以通過DBMS_SUPPORT包的MYSID函式直接查到當前會話的SID。
SQL> select sid,serial# from v$session where sid=(select sid from v$mystat where rownum=1); SIDSERIAL# ---------- ---------- 159338 SQL> select sid,serial# from v$session where sid=dbms_support.mysid; SIDSERIAL# ---------- ---------- 159338
2.FUNCTION PACKAGE_VERSION:通過DBMS_SUPPORT包PACKAGE_VERSION函式,可以得到軟體包所能支援的最低的PL/SQL的版本。
SQL> select dbms_support.PACKAGE_VERSION from dual; PACKAGE_VERSION -------------------------------------------------------------------- DBMS_SUPPORT Version 1.0 (17-Aug-1998) - Requires Oracle 7.2 - 8.0.5
3.PROCEDURE START_TRACE/ PROCEDURE STOP_TRACE:這兩個過程是針對當前會話開啟和關閉追蹤,START_TRACE過程有2個引數,WAITS(等待事件資訊)和BINDS(繫結變數資訊)。
開啟SQL追蹤:
SQL> exec dbms_support.start_trace; PL/SQL procedure successfully completed.
以上開啟的SQL追蹤預設啟用10046事件的level 1,即等同於:
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 1'; Session altered.
如果加上BINDS=>true,預設啟用10046事件的level 4:
SQL> exec dbms_support.start_trace (BINDS=>true); PL/SQL procedure successfully completed.
等同於:
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 4'; Session altered.
如果加上的是WAITS =>true,預設啟用10046事件的level 8:
SQL> exec dbms_support.start_trace (WAITS=>true); PL/SQL procedure successfully completed.
等同於:
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; Session altered.
如果同時加上BINDS=>true和WAITS =>true,則啟用10046事件的level 12:
SQL> exec dbms_support.start_trace (BINDS=>true,WAITS=>true); PL/SQL procedure successfully completed.
等同於:
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; Session altered.
關閉SQL追蹤:
SQL> exec dbms_support.stop_trace; PL/SQL procedure successfully completed.
預設啟用10046的level 0,相當於:
SQL> ALTER SESSION SET EVENTS '10046 trace name context off'; Session altered.
4.PROCEDURE START_TRACE_IN_SESSION/STOP_TRACE_IN_SESSION:這兩個過程是針對其他會話開啟和關閉追蹤,這兩個過程分別比START_TRACE/STOP_TRACE過程多了SID和SERIAL#2個引數,SID和SERIAL#可以確定一個SESSION,所以在追蹤其他SESSION的SQL時必須先查到這個SESSION的SID和SERIAL#。
[oracle@dbdream ~]$ sqlplus stream/stream SQL> select sid,serial# from v$session where sid=dbms_support.myid; select sid,serial# from v$session where sid=dbms_support.myid * ERROR at line 1: ORA-00904: "DBMS_SUPPORT"."MYID": invalid identifier
可以看到stream使用者沒有許可權執行DBMS_SIPPORT包,可以通過下面的方法使普通使用者也可以執行DBMS_SIPPORT包。
SQL> grant execute on dbms_support to stream; Grant succeeded. SQL> CREATE PUBLIC SYNONYM dbms_support FOR dbms_support; Synonym created.
這樣stream使用者就可以使用DBMS_SUPPORT包了。
SQL> select sid,serial# from v$session where sid=dbms_support.mysid; SIDSERIAL# ---------- ---------- 143165
下面演示下用SYS使用者追蹤stream使用者執行的SQL,本實驗僅演示level 12級別的追蹤,其他級別的追蹤不再演示。
SQL> exec dbms_support.start_trace_in_session(143,165,binds=>true,waits=>true); PL/SQL procedure successfully completed.
此時,stream使用者執行的SQL就會被記錄下來,在追蹤到需要追蹤的SQL後,記得關閉SQL追蹤,否則可能因為追蹤時間過長而導致trace追蹤檔案太大。
SQL> exec dbms_support.stop_trace_in_session(143,165); PL/SQL procedure successfully completed.
DBMS_SUPPORT包除了沒有全域性追蹤的功能,其他和10046事件幾乎一樣,除了10046事件和DBMS_SUPPORT包,還有oradebug也可以追蹤SQL,接下來我會分享下oradebug的學習筆記。