动态性能(V$)视图(Dynamic Performance View) 记录DB运行时信息和统计数据,大部分动态性能视图通过实时更新表中的数据来反映数据库当前的状态。
GV$和V$视图
数据库启动时,Oracle动态的创建X$表,并在此基础上创建GV$和V$视图,GV$视图全称Global View,除一些特列,每个V$都有一个对应的GV$视图的存在。
对比GV$和V$视图的差异
SQL> desc v$instance Name Null? Type ----------------------------------------- -------- ---------------------------- INSTANCE_NUMBER NUMBER INSTANCE_NAME VARCHAR2(16) HOST_NAME VARCHAR2(64) VERSION VARCHAR2(17) STARTUP_TIME DATE STATUS VARCHAR2(12) PARALLEL VARCHAR2(3) THREAD# NUMBER ARCHIVER VARCHAR2(7) LOG_SWITCH_WAIT VARCHAR2(15) LOGINS VARCHAR2(10) SHUTDOWN_PENDING VARCHAR2(3) DATABASE_STATUS VARCHAR2(17) INSTANCE_ROLE VARCHAR2(18) ACTIVE_STATE VARCHAR2(9) BLOCKED VARCHAR2(3) SQL> desc gv$instance Name Null? Type ----------------------------------------- -------- ---------------------------- INST_ID NUMBER INSTANCE_NUMBER NUMBER INSTANCE_NAME VARCHAR2(16) HOST_NAME VARCHAR2(64) VERSION VARCHAR2(17) STARTUP_TIME DATE STATUS VARCHAR2(12) PARALLEL VARCHAR2(3) THREAD# NUMBER ARCHIVER VARCHAR2(7) LOG_SWITCH_WAIT VARCHAR2(15) LOGINS VARCHAR2(10) SHUTDOWN_PENDING VARCHAR2(3) DATABASE_STATUS VARCHAR2(17) INSTANCE_ROLE VARCHAR2(18) ACTIVE_STATE VARCHAR2(9) BLOCKED VARCHAR2(3)
可以看到GV$比V$多一个INST_ID字段,Oracle提供了一些特殊视图记录其他视图的创建方式,如v$fixed_view_definition
SQL> col view_name for a15 SQL> select * from v$fixed_view_definition where view_name='V$INSTANCE'; VIEW_NAME VIEW_DEFINITION --------------- ---------------------------------------------------------------------------------------------------- V$INSTANCE select INSTANCE_NUMBER , INSTANCE_NAME , HOST_NAME , VERSION , STARTUP_TIME , STATUS , PARALLEL , T HREAD# , ARCHIVER , LOG_SWITCH_WAIT , LOGINS , SHUTDOWN_PENDING, DATABASE_STATUS, INSTANCE_ROLE, ACT IVE_STATE, BLOCKED from GV$INSTANCE where inst_id = USERENV('Instance')
可以看到V$实际是从GV$中通过WHERE语句过滤出inst_id是当前用户实例的内容
SQL> select * from v$fixed_view_definition where view_name='GV$INSTANCE'; VIEW_NAME VIEW_DEFINITION --------------- ---------------------------------------------------------------------------------------------------- GV$INSTANCE select ks.inst_id,ksuxsins,ksuxssid,ksuxshst,ksuxsver,ksuxstim,decode(ksuxssts,0,'STARTED',1,'MOUNTE D',2,'OPEN',3,'OPEN MIGRATE','UNKNOWN'),decode(ksuxsshr,0,'NO',1,'YES',2,NULL),ksuxsthr,decode(ksuxs arc,0,'STOPPED',1,'STARTED','FAILED'),decode(ksuxslsw,0,NULL,2,'ARCHIVE LOG',3,'CLEAR LOG',4,'CHECKP OINT', 5,'REDO GENERATION'),decode(ksuxsdba,0,'ALLOWED','RESTRICTED'),decode(ksuxsshp,0,'NO',' YES'),decode(kvitval,0,'ACTIVE',2147483647,'SUSPENDED','INSTANCE RECOVERY'),decode(ksuxsrol,1,'PRIMA RY_INSTANCE',2,'SECONDARY_INSTANCE','UNKNOWN'), decode(qui_state,0,'NORMAL',1,'QUIESCING',2,'QUIESCE D','UNKNOWN'), decode(bitand(ksuxsdst, 1), 0, 'NO', 1, 'YES', 'NO') from x$ksuxsinst ks, x$kvit kv, x$quiesce qu where kvittag = 'kcbwst'
而GV$则是来自于X$表的视图,那么我们在数据库中还看到GV_$和V_$视图是怎么来的?可以通过查看cdfixed.sql这个脚本进行了解。这个脚本被catalog.sql调用
create or replace view v_$fixed_table as select * from v$fixed_table; create or replace public synonym v$fixed_table for v_$fixed_table; grant select on v_$fixed_table to select_catalog_role;
通过V_$视图,Oracle把V$和普通用户隔离,V_$视图的权限可以授予其他用户,而Oracle不允许直接对V$视图授权
SQL> grant select on v$sga to scott; grant select on v$sga to scott * ERROR at line 1: ORA-02030: can only select from fixed tables/views SQL> grant select on v_$sga to scott; Grant succeeded.
关于这点看上面的语句cdfixed.sql中展示的语句也可以了解到。那么用户在访问这些对象时,是否存在优先顺序呢?
按照ORACLE的创建机制分别创建X$TAB,V$TAB,V_$TAB, 公共同义词V$TAB
sqlplus scott/tiger SQL> create table x$tab as select 1 as id,'China' as city from dual; Table created. SQL> create view v$tab as select * from x$tab; View created. SQL> create view v$tab as select * from x$tab; View created. SQL> create view v_$tab as select * from v$tab; View created. SQL> create public synonym v$tab for v_$tab; Synonym created.
在hr用户下访问v$tab提示SCOTT.V_$TABD对象不存在,这里是因为我没有授予hr用户访问scott用户中视图的权限
SQL> desc v$tab; ERROR: ORA-04043: object "SCOTT"."V_$TAB" does not exist
授权后正确查询,因为scott用户下创建的是public synonym,所以这里证明我可以正确访问这个公共同义词
SQL> grant select on scott.v_$tab to hr; Grant succeeded. sqlplus hr/hr SQL> desc v$tab Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER CITY CHAR(5)
在hr用户下创建v$tab视图,再次访问v$tab,这次可以看到先访问的是hr用户下的v$tab视图
SQL> create view v$tab as select 'China' city from dual; View created. SQL> desc v$tab Name Null? Type ----------------------------------------- -------- ---------------------------- CITY CHAR(5)
以上实验说明同时存在视图与同义词的情况下,用户优先访问视图。
转载于:https://blog.51cto.com/onlinekof2001/1609636