• oracle动态视图v$,v_$,gv$,gv_$与x$之间的关系


    前言:在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$。

  • 相关阅读:
    HUAWEI防火墙双出口据链路带宽负载分担
    HUAWEI防火墙双出口根据链路优先级主备备份
    HUAWEI防火墙双出口环境下私网用户通过NAPT访问Internet
    如何实现IP话机接入交换机?
    WLAN-AC+AP,动态负载均衡用户量,避免某一个AP负载过重
    WLAN-AC+AP射频一劳永逸的调优方式
    中大型企业有线无线用户统一接入(实施笔记)
    js获取当前时间,返回日期yyyy-MM-dd
    cookie和token都存在在请求头header中,有什么区别,为什么建议使用token?
    vue中cookie的使用——将cookie放在请求头header中
  • 原文地址:https://www.cnblogs.com/austinspark-jessylu/p/5554576.html
Copyright © 2020-2023  润新知