詳解Oracle資料字典
Oracle通過資料字典來管理和展現資料庫資訊,資料字典通常儲存資料庫的中繼資料,是資料庫的“資料庫”。通常說的資料字典由4部分組成:內部RDBMS(X$)表、資料字典表、動態效能檢視(V$)和(靜態)資料字典視圖。(兩表兩視圖)
1,內部RDBMS(X$)表 X$表示Oracle資料庫的核心部分,這些表用於追蹤資料庫內部資訊,鑑效組資料庫的正常運行。X$表是加密命名的,而且Oracle不做文檔說明。X$表是Oracle資料庫的運行基礎,在資料庫啟動時由Oracle應用程式動態建立。比如我們熟知的X$BH、X$KSMSP等。研究這些表的最好的辦法就是借用Oracle的autotrace功能(set autotrace trace explain)。 2,資料字典表 資料字典表(Data dictionary table)用以儲存表、索引、約束以及其它資料庫結構的資訊,這些對象通常以“$”結尾(例如:TAB$、OBJ$、TS$等),在建立資料庫的時候通過運行$ORACLE_HOME/rdbms/admin/sql.bsq指令碼來建立。sql.bsq是一個非常重要的檔案,其中包含了資料字典表的定義及注釋說明,應仔細閱讀研究。 比如我們經常使用的V$DBA_OBJECT視圖就是基於V$OBJ建立的;再比如,當使用者建立一張表的時候,Oracle將會在後台執行一系列的內部操作,比如向objV$表中插入資料、向tab$表中記錄表資料等。Oracle通過將DDL解析成DML操作,並且將這些操作記錄在資料字典表中,那麼我們當然可以通過反向解析得到原始的建立語句,從Oracle 9i 開始,一個新的工具包 DBMS_METADATA 就可以完成該功能: 3,待用資料字典視圖 由於X$表和資料字典表通常不能直接被使用者訪問,Oracle建立了待用資料字典視圖來提供使用者對於資料字典資訊的訪問,由於這些資訊通常相對穩定,不能直接修改,所以又被稱為待用資料字典視圖。待用資料字典視圖在建立資料庫時由$ORACLE_HOME/rdbms/admin/catagory.sql指令碼建立。 待用資料字典視圖按照首碼的不同通常分成三類: ● USER_:使用者所擁有的相關對象資訊; ● ALL_:用於有許可權訪問的所有對象的資訊; ● DBA_:資料庫所有相關對象的資訊,用於需要有 select any table 的許可權才能訪問。 通過三類別檢視在本質上是為了實現許可權控制。在Oracle資料庫中,每個使用者與方案(Schema)是對應的,Schema是使用者所擁有的對象的集合。資料庫通過Schema將不同使用者的對象隔離開來,使用者可以自由的訪問自己的對象,但是要訪問其他Schema對象就需要相關的授權。 4,動態效能檢視 動態效能檢視記錄了資料庫運行時資訊和統計資料,大部分動態效能檢視被即時更新以及反映資料庫目前狀態。在資料庫啟動時,Oracle動態建立X$表,在此基礎上,Oracle建立了GV$和V$視圖,GV$即Global V$,除了一些特例外,每個V$都對應一個GV$。GV$產生是為了OPS/RAC環境的需要,每個V$都是基於GV$的,只是GV$多了INST_ID列來顯示執行個體ID。 (1)如何查看一個視圖的底層建立語句? Oracle提供了一些特殊的視圖用以記錄其他視圖的建立方式,v$fixed_view_definition就是其中之一。 (2)查詢V$視圖時,報的錯卻是V_$視圖不存在,V_$視圖不是基於V$視圖建立的嗎,怎麼反向報錯了? 為了防止普通使用者的誤操作,Oracle對通過軟體機制對V$視圖的訪問做了限制,它不允許普通使用者直接存取V$視圖,但我們平時不是經常訪問嗎?這其實是Oracle引入了V_$視圖。在建立V$視圖後,Oracle就建立了V_$視圖,隨後為V_$視圖建立了與V$視圖同名的共用同義字。這些工作都是通過catalog.sql指令碼(該指令碼位於$ORACLE_HOME/rdbms/admin/目錄下)實現的。如: 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; --同名同義字 也就是說,大部分使用者訪問的V$對象,並不是視圖,而是執行V_$視圖的同義字;而V_$視圖時基於真正V$視圖建立的。