Oracle資料庫在建立的時候,會建立一些內建的資料庫物件,可以被粗略的氛圍四類:
1、資料字典;2、動態效能檢視;3、PL/SQL包;4、資料庫事件觸發程序。該筆記就對1、2兩項及資料字典和動態效能檢視做簡要的介紹並介紹常用的一些資料字典和動態效能檢視。
一、資料字典
資料字典是每個Oracle資料庫的核心,他儲存了非常重要的控制資訊,這些資訊描述了資料庫本身和資料庫中的各種對象,它們是以唯讀表和視圖的形式存放在SYSTEM資料表空間中,這些對象是由SYS使用者所擁有,由Oracle伺服器來管理的。
Oracle資料字典包含2部分:
1、 基表:儲存了對資料庫的描述,是在執行Create database命令時建立的,建立的指令碼是在<ORACLE_HOME>\RDBMS\ADMIN\sql.bsq中;(通常不會直接存取基表)
2、 資料字典視圖:簡化了基表的資訊並展現給使用者,通過公用的別名去訪問,由資料庫指令碼<ORACLE_HOME>\RDBMS\ADMIN\catalog.sql建立。
資料字典提供的資訊由如下幾類:1、資料庫的邏輯結構和物理結構;2、資料庫物件的定義和空間分配;3、資料完整性約束;4、使用者資訊;5、角色資訊;6、許可權資訊;7、審計資訊。
資料字典視圖分為三類,分別由3個首碼標識:
1、 DBA_視圖:資料庫中的所有視圖,只有DBA和具有相關許可權的使用者才能訪問;
2、 ALL_視圖:儲存的是目前使用者可以訪問的對象(目前使用者不需要擁有它);
3、 USER_視圖:儲存的是目前使用者所擁有和可以訪問的對象。
這三者之間儲存的資料是有重疊的,只是存取範圍不同而已。
此外還有2張總覽性的資料字典視圖:dictionary和dict_columns,這2張視圖儲存了當
前資料庫中的所有資料字典視圖的資訊,包括稍後會介紹到的動態效能檢視。
下面以USER_首碼的視圖為例介紹常用的一些資料字典視圖:
1、 USER_USERS:描述使用者的資訊,包括了使用者名稱、帳戶ID、賬戶狀態、資料表空間名等;
2、 USER_TABLESPACES:描述目前使用者可以訪問的資料表空間;
3、 USER_TABLES:描述目前使用者所擁有的表的資訊;
4、 USER_VIEWS:目前使用者所擁有的視圖的資訊;
5、 USER_OBJECTS:描述目前使用者所有對象的資訊,包括了SEQUENCE、PROCEDURE、DATABASE LINK、PACKAGE、PACKAGE BODY、TYPE BODY、TRIGGER、MATERIALIZED VIEW、DIMENSION、INDEX、TABLE、SYNONYM、VIEW、FUNCTION、TYPE等類型;
6、 USER_TAB_PRIVS:儲存目前使用者下對所有表的許可權資訊;
7、 USER_ERRORS:儲存了在目前使用者所擁有的對象中所發生的錯誤;
8、 USER_SOURCE:包含了系統中對象的源碼;
其實,很多個物件,如DB_LINK,EXTENTS,INDEX,JOB,SEQUENCE,SEGMENT等都可以通過USER_<對象名複數>的表名來訪問。資料字典中各個欄位的詳細意義在《Oracle Database Reference》中都有詳細介紹。《Oracle Database Reference》是非常重要的一份文檔,不僅是這些資料字典的解釋,包括參數檔案中各個參數的詳細意義以及稍後將介紹的動態效能檢視等資訊都在這份文檔中有詳細的解釋。
二、動態效能檢視
資料字典視圖是靜態,指其中的內容是儲存在磁碟上,相對不會發生頻繁的變動,動態效能檢視則是動態,並不存在於磁碟上,而是存在記憶體中的一些虛表,主要用於記錄當前資料庫的活動情況,說它是動態,是因為在資料庫啟動並執行同時,它的內容會根據資料庫的運行狀態而發生頻繁變化,用於監控和調整資料庫,同資料字典視圖一樣,它也是由使用者SYS擁有,總的來說,它們均是以V$、GV$、X$開頭的一些同義字。相對於資料字典中的dictionary視圖一樣,動態效能檢視中也有一張視圖保持了所有動態效能檢視的總覽視圖:V$FIXED_TABLE,另一張視圖V$FIXED_VIEW_DEFINITION包含了對這些動態效能檢視的定義。
從Oracle 8i開始,GV$視圖開始被引入,其含義是Global V$,除了一些特例外,每個V$視圖均有一個對應的GV$視圖存在,GV$視圖的產生是為了滿足OPS(Oracle Parallel Server,Oracle並行伺服器)環境的需要,在OPS環境中,查詢GV$視圖返回所有執行個體的訊息,而每個V$視圖都給予對應的GV$視圖而建立,增加了INST_ID列的判斷後,用於包含當前執行個體的資訊。
執行下列語句:
SELECT*FROMv$fixed_view_definition vWHEREv.VIEW_NAME ='V$FIXED_TABLE';
尋找V$FIXED_TABLE的定義,得到如下結果:
select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id = USERENV('Instance')
發現V$FIXED_TABLE基於GV$FIXED_TABLE,並添加了INST_ID = USERENV(‘INSTANCE’)限制;
我們再尋找GV$FIXED_TABLE的定義:
select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta
union all
select inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi
union all
select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt
V$和GV$視圖是通過catalog.sql指令碼建立的,下面的其中建立v$fixed_table視圖的指令碼:
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$視圖是基於X$表建立的。
X$表是Oracle資料庫啟動並執行基礎粗,在資料庫啟動時由Oracle應用程式動態建立。這部分表對於資料庫來說至關重要,所以Oracle不允許SYSDBA之外的使用者直接存取,即便授權也是不允許的,如執行下列命令:GRANTSELECTONx$kqftaTOscott;會收到錯誤:ORA-02030:只能從固定的表/視圖查詢。
常用的動態效能檢視如下:
1、 v$controlfile:顯示控制檔案清單;
2、 v$database:從控制檔案中擷取的資料庫的資訊;
3、 v$datafile:顯示資料檔案的資訊;
4、 v$instance:顯示當前執行個體的狀態;
5、 v$parameter:顯示記憶體中的參數資訊
6、 v$session:顯示當前會話的資訊;
7、 v$sga:顯示SGA的資訊;
8、 v$spparameter:顯示SPFILE檔案中的參數資訊,如果SPFILE沒有被用來啟動執行個體,則視圖中的所有ISSPECIFIED列將會是FALSE;
9、 v$tablespace:從控制檔案中擷取的資料表空間的資訊;
10、v$thread:從控制檔案中擷取的線程的資訊;
11、v$version:擷取關鍵組件的版本資訊。