首先
Oracle的字典表和視圖基本上可以分為三個層次
X$表 這一部分表是Oracle數據庫的運行基礎
在數據庫啟動時由Oracle應用程序動態創建
這部分表對數據庫來說至關重要
所以Oracle不允許SYSDBA之外的用戶直接訪問
顯示授權不被允許
如果顯示授權你會收到如下錯誤:
SQL> grant select on x$ksppi to eygle;
grant select on x$ksppi to eygle
*
ERROR at line
:
ORA
: can only select from fixed tables/views
GV$和V$視圖 從Oracle
開始
GV$視圖開始被引入
其含義為Global V$
除了一些特例以外
每個V$視圖都有一個對應的GV$視圖存在
GV$視圖的產生是為了滿足OPS環境的需要
在OPS環境中
查詢GV$視圖返回所有實例信息
而每個V$視圖基於GV$視圖
增加了INST_ID列判斷後建立
只包含當前連接實例信息
注意
每個V$視圖都包含類似語句
where inst_id = USERENV(
Instance
)
用於限制返回當前實例信息
我們從GV$FIXED_TABLE和V$FIXED_TABLE開始
SQL> select view_definition from v_$fixed_view_definition where view_name=
V$FIXED_TABLE
;
VIEW_DEFINITION
select NAME
OBJECT_ID
TYPE
TABLE_NUM from GV$FIXED_TABLE where inst_id = USERENV(
Instance
)
這裡我們看到V$FIXED_TABLE基於GV$FIXED_TABLE創建
SQL> select view_definition from v_$fixed_view_definition where view_name=
GV$FIXED_TABLE
;
VIEW_DEFINITION
select inst_id
kqftanam
kqftaobj
TABLE
indx from x$kqfta
union all
select inst_id
kqfvinam
kqfviobj
VIEW
from x$kqfvi
union all
select inst_id
kqfdtnam
kqfdtobj
TABLE
from x$kqfdt
這樣我們找到了GV$FIXED_TABLE視圖的創建語句
該視圖基於X$表創建
GV_$V_$視圖和V$GV$同義詞 這些視圖是通過catalog
ql創建
當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_$和GV_$首先被創建
v_$和gv_$兩個視圖
然後基於V_$視圖的同義詞被創建
所以
實際上通常我們訪問的V$視圖
其實是指向V_$視圖的同義詞
而V_$視圖是基於真正的V$視圖(這個視圖是基於X$表建立的)
而v$fixed_view_definition視圖是我們研究Oracle對象關系的一個入口
仔細理解Oracle的數據字典機制
有助於深入了解和學習Oracle數據庫知識
再進一步 X$表
關於X$表
其創建信息我們也可以從數據字典中一窺究竟
首先我們考察bootstrap$表
該表中記錄了數據庫啟動的基本及驅動信息
SQL> select * from bootstrap$;
LINE# OBJ# SQL_TEXT
CREATE ROLLBACK SEGMENT SYSTEM STORAGE ( INITIAL
K NEXT
K MINEXTENTS
M
CREATE CLUSTER C_FILE#_BLOCK#(
TS#
NUMBER
SEGFILE#
NUMBER
SEGBLOCK#
NUMBER)
CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE
INITRANS
MAXT
CREATE TABLE SEG$(
FILE#
NUMBER NOT NULL
BLOCK#
NUMBER NOT NULL
TYPE#
NUMBE
CREATE TABLE CLU$(
OBJ#
NUMBER NOT NULL
DATAOBJ#
NUMBER
TS#
NUMBER NOT NULL
CREATE CLUSTER C_TS#(
TS#
NUMBER) PCTFREE
PCTUSED
INITRANS
MAXTRANS
CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE
INITRANS
MAXTRANS
STORAGE (
這部分信息
在數據庫啟動時最先被加載
跟蹤數據庫的啟動過程
我們發現數據庫啟動的第一個動作就是:
create table bootstrap$ ( line# number not null
obj#
number not null
sql_text varchar
(
) not null) storage (initial
K objno
extents (file
block
))
這部分代碼是寫在Oracle應用程序中的
在內存中創建了bootstrap$以後
Oracle就可以從file
block
上讀取其他信息
創建重要的數據庫對象
從而根據這一部分信息啟動數據庫
這就實現了數據庫的引導
類似於操作系統的初始化
這部分你可以參考biti_rainy的文章
X$表由此建立
這一部分表可以從v$fixed_table中查到
SQL> select count(*) from v$fixed_table where name like
X$%
;
COUNT(*)
共有
個X$對象被記錄
GV$和V$視圖
X$表建立以後
基於X$表的GV$和V$視圖得以創建
這部分視圖我們也可以通過查詢V$FIXED_TABLE得到
SQL> select count(*) from v$fixed_table where name like
GV$%
;
COUNT(*)
這一部分共
個對象
SQL> select count(*) from v$fixed_table where name like
V$%
;
COUNT(*)
同樣是
個對象
v$fixed_table共記錄了:
+
+
共
個對象
我們通過V$PARAMETER視圖來追蹤一下數據庫的架構:
SQL> select view_definition from v$fixed_view_definition a where a
VIEW_NAME=
V$PARAMETER
;
VIEW_DEFINITION
select NUM
NAME
TYPE
VALUE
ISDEFAULT
ISSES_MODIFIABLE
ISSYS_MODIFIA
BLE
ISMODIFIED
ISADJUSTED
DESCRIPTION
UPDATE_COMMENT from GV$PARAMETER wh
ere inst_id = USERENV(
Instance
)
我們看到V$PARAMETER是由GV$PARAMETER創建的
SQL> select view_definition from v$fixed_view_definition a where a
VIEW_NAME=
GV$PARAMETER
;
VIEW_DEFINITION
select x
inst_id
x
indx+
ksppinm
ksppity
ksppstvl
ksppstdf
decode(bitand(kspp
iflg/
)
TRUE
FALSE
)
decode(bitand(ksppiflg/
)
IMMEDIATE
DEFERRED
IMMEDIATE
FALSE
)
decode(bit
and(ksppstvf
)
MODIFIED
SYSTEM_MOD
FALSE
)
decode(bitand(ksppstvf
)
TRUE
FALSE
)
ksppdesc
ksppstcmnt from x$ksppi x
x$ksppcv y where (x
i
ndx = y
indx) and ((translate(ksppinm
_
#
) not like
#%
) or (ksppstdf =
F
ALSE
))
在這裡我們看到GV$PARAMETER來源於x$ksppi
x$ksppcv兩個X$表
x$ksppi
x$ksppcv 基本上包含所有數據庫可調整參數
v$parameter展現的是不包含
_
開頭的參數
以
_
開頭的參數我們通常稱為隱含參數
一般不建議修改
但很多因為功能強大經常使用而廣為人知
From:http://tw.wingwit.com/Article/program/Oracle/201311/17400.html