揭開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的用戶,他才能訪問到這幾個視圖,進而收集用戶的統計資訊。

有時候,問題解決很簡單,一個指令,或者一個腳本,就可以滿足要求,但是如果不知道他的原理,不多問個為什麼,只是當作黑盒,很可能就丟掉了一次難得的學習機會,即使是從網上資料學到的,在我看來,這都不丟人,自己理解了,作為自己的知識,下次碰見,融會貫通,才可以讓自己的能力得到鍛煉提升。