1.ORACLE 先创建的x$ 表即RDBMS的内部表

2.然后在X$表的基础上创建了GV$ 视图。GV$视图是为了满足OPS环境的需要即集群环境的需要

3.接着根据GV$视图创建了 V$视图,其实就是加了一个instance number的过滤条件。基本每个v$视图都对应一个GV$视图。

4.然后ORACLE又根据GV$视图创建了GV_$视图。随即创建了V_$视图。(注意是有区别的,下划线__)

5.然后根据V_$视图创建了同义词。

因此我们平时访问的动态性能视图都是同义词。

这些工作其实是创建数据库的时候由一个脚本来实现的,$ORACLE_HOME/rdbms/admin/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;

create or replace view gv_$fixed_table as select * from gv$fixed_table;

create or replace public synonym gv$fixed_table for gv_$fixed_table;



通过v_$视图,ORACLE把用户跟v$视图隔离开了。



以v$instance为例。

1.查询dba_objects 知,v$instance是同义词

SELECT * FROM Dba_OBJECTS WHERE OBJECT_name='V$INSTANCE'

2.查询dba_synonyms,可知道他是V_$INSTANCE表的同义词

SELECT * FROM dba_synonyms WHERE synonym_name='V$INSTANCE'

3.查看v_$instance的创建语句,SELECT * FROM dba_views WHERE view_name=upper('V_$INSTANCE')

发现它是有v$instance创建的

4.查看v$instance创建语句。SELECT * FROM v$fixed_view_definition WHERE view_name =upper('v$instance')


GV_$:是GV$的同义词。

V_$:是V$的同义词。

select  INSTANCE_NUMBER , INSTANCE_NAME , HOST_NAME , VERSION , STARTUP_TIME , STATUS , PARALLEL , THREAD# , ARCHIVER , LOG_SWITCH_WAIT , LOGINS , SHUTDOWN_PENDING, DATABASE_STATUS, INSTANCE_ROLE, ACTIVE_STATE, BLOCKED from GV$INSTANCE where inst_id = USERENV('Instance')



发现它是根据gv$instance创建的,只是加了一个inst_id的过滤条件。



5.继续查看gv$instance的创建语句SELECT * FROM v$fixed_view_definition WHERE view_name =upper('v$instance')



发现它是由X$内部表创建的。

select ks.inst_id,ksuxsins,ksuxssid,ksuxshst,ksuxsver,ksuxstim,decode(ksuxssts,0,'STARTED',1,'MOUNTED',2,'OPEN',3,'OPEN MIGRATE','UNKNOWN'),decode(ksuxsshr,0,'NO',1,'YES',2,NULL),ksuxsthr,decode(ksuxsarc,0,'STOPPED',1,'STARTED','FAILED'),decode(ksuxslsw,0,NULL,2,'ARCHIVE LOG',3,'CLEAR LOG',4,'CHECKPOINT',       5,'REDO GENERATION'),decode(ksuxsdba,0,'ALLOWED','RESTRICTED'),decode(ksuxsshp,0,'NO','YES'),decode(kvitval,0,'ACTIVE',2147483647,'SUSPENDED','INSTANCE RECOVERY'),decode(ksuxsrol,1,'PRIMARY_INSTANCE',2,'SECONDARY_INSTANCE','UNKNOWN'), decode(qui_state,0,'NORMAL',1,'QUIESCING',2,'QUIESCED','UNKNOWN'), decode(bitand(ksuxsdst, 1), 0, 'NO', 1, 'YES', 'NO') from x$ksuxsinst ks, x$kvit kv, x$quiesce qu where kvittag = 'kcbwst'


select  INSTANCE_NUMBER , INSTANCE_NAME , HOST_NAME , VERSION , STARTUP_TIME , STATUS , PARALLEL , THREAD# , ARCHIVER , LOG_SWITCH_WAIT , LOGINS , SHUTDOWN_PENDING, DATABASE_STATUS, INSTANCE_ROLE, ACTIVE_STATE, BLOCKED from GV$INSTANCE where inst_id = USERENV('Instance')


文章2

前言:在oracle运维的过程中,经常会使用到一些以V$开头的动态视图,比如V$session, 有一次偶然看到有人用V_$session, 初以为别人写错了,没想到desc v_$session以后能看到和v$session一样的结构,再以后又发现以gv$开头的视图等等。趁这次在一台Linux系统上装oracle的机会,终于弄清楚了这些动态视图与相应表之间的关系。

这些都是由oracle自己管理的数据结构,得从v$fixed_table入手:

[oracle@3857 admin]$ sqlplus sys/sys@archdw as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Mon Dec 14 11:27:20 2009

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> desc v$fixed_table;

Name Null? Type

—————————————– ——– —————————-

NAME VARCHAR2(30)

OBJECT_ID NUMBER

TYPE VARCHAR2(5)

TABLE_NUM NUMBER

SQL> select * from v$fixed_table

NAME OBJECT_ID TYPE TABLE_NUM

—————————— ———- —– ———-

X$KQFTA 4294950912 TABLE 0

X$KQFVI 4294950913 TABLE 1

GV$PROCESS 4294951256 VIEW 65537

V$PROCESS 4294950917 VIEW 65537

GV$BGPROCESS 4294951257 VIEW 65537

………………………………………

从上面可以看到GV$与V$是视图,X$是表。那它们之间是什么关系呢?从另一个视图v$fixed_view_definition中得到如下信息(以v$fixed_table为例):

SQL> set linesize 100

SQL> col view_name for a15

SQL> col view_definition for a80

SQL> select * from v$fixed_view_definition where view_name=’V$FIXED_TABLE’;

VIEW_NAME VIEW_DEFINITION

———————- ——————————————————————————–

V$FIXED_TABLE select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id =

USERENV(’Instance’)

SQL> select * from v$fixed_view_definition where view_name=’GV$FIXED_TABLE’;

VIEW_NAME VIEW_DEFINITION

————————- ——————————————————————————–

GV$FIXED_TABLE select inst_id,kqftanam, kqftaobj, ‘TABLE’, indx from x$kqfta union all select i

nst_id,kqfvinam, kqfviobj, ‘VIEW’, 65537 from x$kqfvi union all select inst_id,k

qfdtnam, kqfdtobj, ‘TABLE’, 65537 from x$kqfdt

原来gv$是全局视图,而v$是针对某个实例的视图,$X是所有gv$的数据来源,从gv$到v$需要加上where inst_id = USERENV(’Instance’)。一般来说一个oracle数据库只会有一个实例对其操作,但在RAC上可以有多台实例同时装载并打开一个数据库,在RAC上得到的结果是:

etl@ALIDW> select distinct inst_id from gv$session;

INST_ID

———-

1

2

4

3

这rac上有四个实例。嗯,再次加深了对实例与数据库的理解。

那gv_$与v_$的定义又在什么地方呢?原来在$ORACLE_HOME/rdbms/admin存放着系统管理脚本,在catalog.sql中发现:

–CATCTL -S Initial scripts single process

@@cdstrt

@@cdfixed.sql

@@cdcore.sql

–CATCTL -M

@@cdplsql.sql

@@cdsqlddl.sql

…………………………………………………………………………….

进一步在cdfixed.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;

create or replace view gv_$fixed_table as select * from gv$fixed_table;

create or replace public synonym gv$fixed_table for gv_$fixed_table;

grant select on gv_$fixed_table to select_catalog_role;

…………………………………………………………………………………………………………….

[oracle@3857 admin]$ sqlplus sys/sys@archdw as sysdba

SQL> select * from user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_

—————————— —————————— — — —

SYS SELECT_CATALOG_ROLE YES YES NO

因此我们常用的v$ 是v_$的同义词,v_$是基于真正的视图v$,而真正的v$视图是在gv$的基础上限制inst_id得到;

我们常用的gv$是gv_$的同义词,gv_$基于真正的视图gv$,而真正的gv$视图基于系统表X$。

ORACLE中dba,user,v$等开头的常用表和视图 - 一个普本码农奋斗史​

​dba,user,v$等开头的常用表和视图​