技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Oracle --> DBMS_SUPPORT包简单使用

DBMS_SUPPORT包简单使用

浏览:3208次  出处信息
本片文章介绍下追踪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的学习笔记。

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1