揭开PLUSTRACE角色面纱

  • 2020 年 1 月 13 日
  • 筆記

Oracle中,如果某个用户,想看SQL的执行计划,可以有很多方法,其中一种,是开启会话跟踪,但是很可能提示这个错误,

SQL> set autot on  SP2-0618: Cannot find the Session Identifier.  Check PLUSTRACE role is enabled  SP2-0611: Error enabling STATISTICS report

P.S. 通过其他方法,看SQL执行计划,

一个执行计划异常变更的案例 – 外传之查询执行计划的几种方法

提示确认下PLUSTRACE这个角色是否enable,但实际上,当前数据库中,压根没这个角色,

SQL> select * from dba_roles where role='PLUSTRACE';  no rows selected

这个角色可以通过执行plustrace.sql脚本进行创建,我们看下这个脚本写的是什么,从注释看,执行这个脚本,就可以创建一个能在SQL*Plus中操作SET AUTOTRACE … STATISTICS命令来访问动态性能视图的角色,任何要执行AUTOTRACE的用户都应该被DBA授予这个PLUSTRACE角色,

vi $ORACLE_HOME/sqlplus/admin/plustrce.sql    -- NAME  --   plustrce.sql  --  -- DESCRIPTION  --   Creates a role with access to Dynamic Performance Tables  --   for the SQL*Plus SET AUTOTRACE ... STATISTICS command.  --   After this script has been run, each user requiring access to  --   the AUTOTRACE feature should be granted the PLUSTRACE role by  --   the DBA.  --  -- USAGE  --   sqlplus "sys/knl_test7 as sysdba" @plustrce  --  --   Catalog.sql must have been run before this file is run.  --   This file must be run while connected to a DBA schema.    set echo on    drop role plustrace;  create role plustrace;    grant select on v_$sesstat to plustrace;  grant select on v_$statname to plustrace;  grant select on v_$mystat to plustrace;  grant plustrace to dba with admin option;    set echo off

从脚本来看,流程非常简单,

1.创建名叫PLUSTRACE的角色。

2.需要给PLUSTRACE角色授予v_$sesstat、v_$statname、v_$mystat的查询权限。

3.通过设置with admin option,让DBA角色能授予PLUSTRACE角色。

但是知其然更要知其所以然,在理解脚本操作之前,可能提出这几个问题,

1.v_$是什么?不是常见的v$?

2.为什么是授权这三个给PLUSTRACE?

1.v_$是什么?不是常见的v$?

这个v_$其实在eygle很早的这本《循序渐进Oracle》书中就曾提到过,我们常用的v$sesstat,其实是个同义词,他代表的视图,就是v_$sesstat,因此,不能使用grant将同义词授权给角色,需要将v_$视图授权给角色。

2.为什么是授权这三个给PLUSTRACE?

这就要知道他们三个视图,是做什么用的,

SQL> desc v$sesstat    Name             Null?    Type   --------------- -------- --------------   SID                       NUMBER   STATISTIC#                NUMBER   VALUE                     NUMBER    SQL> desc v$mystat   Name             Null?    Type   --------------- -------- ----------------------------   SID                       NUMBER   STATISTIC#                NUMBER   VALUE                     NUMBER  SQL> desc v$statname   Name             Null?    Type   --------------- -------- ----------------------------   STATISTIC#                NUMBER   NAME                      VARCHAR2(64)   CLASS                     NUMBER   STAT_ID                   NUMBER

从定义来看,v$mystat和v$sesstat结构相同,只是统计数据不一致。其中,SID表示会话编号,与v$session中SID相对应,STATISTIC#表示统计项,VALUE表示统计项相关的值。这两个视图分别用来统计会话级别和自实例起动以来数据库各种统计信息的。v$mystat视图中只会有当前用户的会话信息,v$sesstat会有整个实例内所有会话信息。因此在v$sesstat中自然包括v&mystat的统计信息。一般情况下v$mystat,v$sesstat和v$statname一起配合使用。

用户执行set autot on,是需要收集用户的统计信息的,如果当前用户没有访问v$session、v$sesstat和v$statname视图的权限,就会抛出错误。

因此,才需要创建PLUSTRACE这个角色,并将其授予需要执行set autot on的用户,他才能访问到这几个视图,进而收集用户的统计信息。

有时候,问题解决很简单,一个指令,或者一个脚本,就可以满足要求,但是如果不知道他的原理,不多问个为什么,只是当作黑盒,很可能就丢掉了一次难得的学习机会,即使是从网上资料学到的,在我看来,这都不丢人,自己理解了,作为自己的知识,下次碰见,融会贯通,才可以让自己的能力得到锻炼提升。