標籤:
每個資料庫都提供了各自的資料字典的方案,雖然形式不同,但是目的和作用是一樣的,比如在mysql裡資料字典是在information_schema 裡表現的,sqlserver則是在sys這個系統schema裡來展示的。
Oracle的資料字典是Oracle資料庫安裝之後,自動建立的一系列資料庫物件。資料字典是Oracle資料庫物件結構的中繼資料資訊。熟悉和深入研究資料字典對象,可以很大程度的協助我們瞭解Oracle內部機制。
Oracle字典視圖包括四個層次,分別為X$內部表、基礎資料字典表、資料字典視圖和動態效能檢視。
資料字典表和使用者建立的表沒有什麼區別,不過資料字典表裡的資料是Oracle系統存放的系統資料,而普通表存放的是使用者的資料而已,
在手工用create database的命令的時候,會調用$ORACLE_HOME/rdbms/admin/sql.bsq檔案,這個就會執行產生我們這些資料字典表。開啟sql.bsq會發現很多資料字典幾乎都以$結尾,比如col$,tab$等。
這裡的資料字典表的使用者都是sys,存在於system這個資料表空間裡,表名都用"$"結尾,為了便於使用者對資料字典表的查詢,這樣的名字是不利於我們記憶的,所以Oracle對這些資料字典都分別建立了使用者視圖,不僅有更容易 接受的名字,還隱藏了資料字典表之間的關係,讓我們直接通過視圖來進行查詢,簡單而形象,Oracle針對這些對象的範圍,分別把視圖命名為 DBA_XXXX, ALL_XXXX和USER_XXXX
user_物件檢視:描述了目前使用者schema下的對象;
all_物件檢視:描述了目前使用者有許可權訪問到的所有對象的資訊;
dba_物件檢視:包括了所有資料庫物件的資訊;
注意:在建立資料庫是會運行兩個指令碼。先運行catalog.sql,該指令碼用來建立資料庫的內部字典表。然後再運行catrpoc.sql,該指令碼用來建立資料庫內建的預存程序、包等pl\sql對象。如果我們是使用dbca來建立資料庫,則dbca會自動調用這兩個指令碼。否則在執行create database命令來建立時,則需要手工運行這兩個指令碼。
動態效能檢視概述
所謂動態效能檢視,就是指將記憶體裡的資料或控制檔案裡的資料以表的形式展現出來。他們實際都是虛擬表,並不是真正的表。只不過是為了能夠讓我們更好的管理資料庫的效能,所以將記憶體裡的活動情況以表的形式展現出來。只要資料庫還在運行,就會不斷更新動態效能檢視。一旦資料庫關閉或崩潰,動態效能檢視裡的資料就會全部丟失,下次重啟時則會重新計算。就像所有的資料字典的名詞都存在 dictionary裡一樣,v$fixed_table裡存放了所有的動態效能檢視的名稱。所有的動態效能的屬主都是sys,且都以v$_開頭,建立同名詞時則都以v$開頭。
資料字典視圖非常多,我們無法一一記住,但是有個視圖,我們必須知道,那就是dictionary視圖,該視圖裡記錄了所有的資料字典視圖的名稱。所以當我們需要尋找某個資料字典而又不知道這個資訊在哪個視圖裡的時候,就可以在dictionary視圖裡找。該視圖還有個同名詞dict。下面我們來追蹤下dba_synonymsSQL> desc dict Name Null? Type ----------------------------------------- -------- ---------------------------- TABLE_NAME VARCHAR2(30) COMMENTS VARCHAR2(4000)SQL> select * from dict where table_name like ‘%DICT%‘;SQL> select count(*) from dict; COUNT(*)---------- 2553SQL> select * from dict where table_name like ‘%SYNONYM%‘;TABLE_NAME COMMENTS------------------------------ -----------------------------------------------------------------USER_SYNONYMS The user‘s private synonymsALL_SYNONYMS All synonyms for base objects accessible to the user and sessionDBA_SYNONYMS All synonyms in the database在DBA_SYNONYMS驗證下dba_synonyms是否為同名詞SQL> select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms;果然,DBA_SYNONYMS為DBA_SYNONYMS表的同名詞。繼續尋找dba_objects驗證DBA_SYNONYMS為何種對象。SQL> column object_name format a30SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME=‘DBA_SYNONYMS‘;OWNER OBJECT_NAME OBJECT_TYPE------------------------------ ------------------------------ -------------------SYS DBA_SYNONYMS VIEWPUBLIC DBA_SYNONYMS SYNONYM可以看出,DBA_SYNONYMS為sys使用者下的視圖,繼續尋找dba_views查看DBA_SYNONYMS的具體定義。SQL> select VIEW_NAME,TEXT from dba_views where VIEW_NAME=‘DBA_SYNONYMS‘;VIEW_NAME TEXT------------------------------ --------------------------------------------------------------------------------DBA_SYNONYMS select u.name, o.name, s.owner, s.name, s.node from sys.user$ u, sys.syn$ s, sys可以看到,DBA_SYNONYMS是基於sys使用者下的user$和syn$這兩張資料字典表建立的視圖。這裡也就驗證了,我們前面所說的資料字典組織方式:先基於資料字典建立資料字典視圖,然後在基於資料字典視圖建立同名詞,並將該同名詞賦給了PUBLIC,從而使得所有使用者都可以通過同名詞查看資料字典資訊。 下面以v$session為例進行追蹤SQL> select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME=‘V$SESSION‘;OWNER SYNONYM_NAME TABLE_NAME------------------------------ ------------------------------ ------------------------------PUBLIC V$SESSION V_$SESSION查看V_$SESSION的物件類型和屬主SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME=‘V_$SESSION‘;OWNER OBJECT_NAME OBJECT_TYPE------------------------------ ------------------------------ -------------------SYS V_$SESSION VIEW這裡可以知道V_$SESSION是視圖,查看該視圖的具體定義。SQL> select TEXT from dba_views where VIEW_NAME=‘V_$SESSION‘;可以看到v_$session視圖是基於與動態效能檢視v$session視圖建立的,而動態效能檢視的定義資訊記錄在v$fixed_view_definition裡面select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME=‘V$SESSION‘;可以看到動態效能檢視v$session是基於動態效能檢視gv$session視圖建立的,繼續追蹤select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME=‘GV$SESSION‘可以看到gv$session是的最終定義資訊是來自於x$ksuse s和x$ksle,這些表是動態效能檢視的基表。但是這些表都是記憶體表,表中的資料不會存在資料檔案中,只存在記憶體中。
oracle資料字典