DBMS_SUPPORT包简单使用
上一篇文章介绍了使用ORACLE EVENT 10046追踪SQL,详见http://www.dbdream.com.cn/?p=484,本片文章介绍下追踪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 Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- WAITS BOOLEAN IN DEFAULT BINDS BOOLEAN IN DEFAULT PROCEDURE START_TRACE_IN_SESSION Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SID NUMBER IN SERIAL NUMBER IN WAITS BOOLEAN IN DEFAULT BINDS BOOLEAN IN DEFAULT PROCEDURE STOP_TRACE PROCEDURE STOP_TRACE_IN_SESSION Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SID NUMBER IN SERIAL NUMBER IN
下面分别演示下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); SID SERIAL# ---------- ---------- 159 338 SQL> select sid,serial# from v$session where sid=dbms_support.mysid; SID SERIAL# ---------- ---------- 159 338
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; SID SERIAL# ---------- ---------- 143 165
下面演示下用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的学习笔记。