DBMS_SUPPORT包简单使用
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的学习笔记。
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:streamsong 来源: 信春哥,系统稳,闭眼上线不回滚
- 标签: DBMS_SUPPORT
- 发布时间:2012-08-22 23:42:14
- [52] IOS安全–浅谈关于IOS加固的几种方法
- [51] android 开发入门
- [50] 如何拿下简短的域名
- [48] Oracle MTS模式下 进程地址与会话信
- [48] 图书馆的世界纪录
- [47] 【社会化设计】自我(self)部分――欢迎区
- [46] Go Reflect 性能
- [43] 读书笔记-壹百度:百度十年千倍的29条法则
- [37] 视觉调整-设计师 vs. 逻辑
- [34] 程序员技术练级攻略