熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

深入了解Oracle數據字典

2022-06-13   來源: Oracle 

  首先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_idkqftanam kqftaobj TABLE indx from x$kqfta
  union all
  select inst_idkqfvinam kqfviobj VIEW from x$kqfvi
  union all
  select inst_idkqfdtnam kqfdtobj TABLE from x$kqfdt
  
  這樣我們找到了GV$FIXED_TABLE視圖的創建語句該視圖基於X$表創建
  
   GV_$V_$視圖和V$GV$同義詞
  
  這些視圖是通過catalogql創建
  
  當catalogsql運行時:
  
  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# NUMBERSEGFILE# NUMBERSEGBLOCK# NUMBER)
  
   CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE INITRANS MAXT
  
   CREATE TABLE SEG$(FILE# NUMBER NOT NULLBLOCK# NUMBER NOT NULLTYPE# NUMBE
  
   CREATE TABLE CLU$(OBJ# NUMBER NOT NULLDATAOBJ# NUMBERTS# 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 aVIEW_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 aVIEW_NAME=GV$PARAMETER;
  
  VIEW_DEFINITION
  
  select xinst_idxindx+ksppinmksppityksppstvlksppstdf decode(bitand(kspp
  
  iflg/)TRUEFALSE) decode(bitand(ksppiflg/)IMMEDIATE
  
  DEFERRED IMMEDIATEFALSE) decode(bit
  
  and(ksppstvf)MODIFIEDSYSTEM_MODFALSE) decode(bitand(ksppstvf)
  
  TRUEFALSE) ksppdesc ksppstcmnt from x$ksppi x x$ksppcv y where (xi
  
  ndx = yindx) and ((translate(ksppinm_#) not like #%) or (ksppstdf = F
  
  ALSE))
  
  在這裡我們看到GV$PARAMETER來源於x$ksppix$ksppcv兩個X$表 x$ksppix$ksppcv 基本上包含所有數據庫可調整參數v$parameter展現的是不包含_開頭的參數_開頭的參數我們通常稱為隱含參數一般不建議修改但很多因為功能強大經常使用而廣為人知
From:http://tw.wingwit.com/Article/program/Oracle/201311/17400.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.