對於Oracle系統管理員而言,Oracle數據字典就像是一個寶庫:它是Oracle數據庫的重要組成部分,提供了諸如數據庫結構、數據庫對象空間分配和數據庫用戶等等有關數據庫的信息。本文試圖從數據庫管理系統的若干基本概念出發,具體介紹從ORACLE數據字典來了解Oracle的方法。
不同的操作系統、不同版本的ORACLE數據字典有所差異,本文均以UNIX操作系統、Oracle 7為例加以說明。
數據庫系統實例和數據庫標識
ORACLE數據庫系統包含兩個方面,即ORACLE數據庫和ORACLE實例,用戶是通過ORACLE實例來訪問Oracle數據庫的。
1.數據庫(DATABASE)
數據庫是作為整體看待的數據集合,通常在安裝Oracle軟件的最後階段創建,用數據庫名加以標識(允許1~8個字符),數據庫名在創建數據庫時確認,且保存在控制文件中。
2.實例(INSTANCE,也譯作例程)
實例是存取和控制數據庫的軟件機制。它由系統全局區(System Global Area,即SGA)和Oracle進程兩部分組成,和數據庫名一樣,實例也要唯一標識,並且在安裝Oracle軟件時確認。
我們可以采用下述方法來了解實例標識。
有的系統管理員有意無意地將數據庫名和實例標識取相同的標識符,當然是可以的,有時甚至會帶來某些方便,但筆者認為,還是取不同標識符為宜。
數據庫的初始化參數文件
在數據庫的建立和運行中,都要閱讀一個初始化參數文件,它是個文本文件,可以用一般的編輯程序編輯。
每一個數據庫至少有一個初始化參數文件,一般命名為INIT.ORA,在UNIX系統下,按照缺省規定,其初始化參數文件名的命名原則為INIT後緊跟實例的標識,再加ORA後綴,例如,某實例標識為TEST,其初始化參數文件名為INITTEST.ORA。
數據庫的初始化參數有100多個,前面提到的DB_NAME即是其中之一。此外,還有許多其他參數,如
CONTROL-FILES 控制文件名
ROLLBACK-SEGMENTS 分配給實例的回滾段名
INIT-SQL-FILES 數據庫建立時執行的命令文件
PROCESSES 多進程系統中最大進程數
數據庫的物理結構
數據庫的物理結構是面向操作系統的,它描述數據庫中的數據的存儲形式。在物理上OA
CLE數據庫文件包括數據文件、日志文件和控制文件。
1.數據文件(DATA FILES)
Oracle數據庫中的數據,邏輯上存放在表空間裡,但物理上卻是存放在數據文件裡的,數據文件有如下特點,即每一個數據文件只與一個數據庫相聯系,數據庫文件一旦建立,就不能改變大小,一個表空間可以包含一個或多個數據文件等。
我們可以用下述方法來了解數據庫的全部數據文件。
(1)SQLDBA>SELECT*FROM DBA-DATA-FILES;結果中,列名FILE-NAME即為數據文件名。
(2)SQLDBA>SELECT*FROM V$DATAFILE;結果中,列名NAME即為數據文件名。
(3)SQLDBA>SELECT*FROM V$DBFILE;結果中,列名NAME即為數據文件名。
2.日志文件(REDO LOG FILES)
日志文件用於記錄數據庫所做的全部變更,以便在系統發生故障時進行恢復。每一個數據庫至少有兩個日志文件。
3.控制文件(CONTROL FILES)
控制文件雖然是一個較小的二進制文件,但很重要。如果控制文件一旦被破壞,則無法對數據庫進行操作。為防止控制文件被破壞,一般一個數據庫應至少有二個控制文件,且分別放在不同的磁盤上,控制文件的名字是記錄在參數CONTROL_FILES中的。
數據庫的邏輯結構
數據庫的邏輯結構是面向用戶的,數據庫的邏輯結構包含表空間、段、范圍、數據塊和模式對象。從邏輯上看數據庫有以下特點。
一個數據庫(DATABASE)由一個或多個表空間所組成。
一個表空間(TABLESPACE)由段組成,作為SYSTEM表空間,它由自舉段、回滾段、數據段、臨時段等多個段組成,而作為非SYSTEM表空間,則因用途而異由不同段組成。
一個段(SEGMENT)由一組范圍組成。一個范圍(EXTENT)由一組連續的數據塊組成。一個數據塊(DATABASE BLOCK)對應磁盤上的一個或多個物理塊。
在數據庫的邏輯結構中,表空間和回滾段比較重要,下面分別加以介紹。
1.表空間
每一個數據庫都必須包含一個名為SYSTEM的表空間。該表空間在創建數據庫時由系統自動創建,為了保證數據庫能正常運行,SYSTEM表空間必須處於在線狀態。
為了增強對數據庫的控制和維護,一般一個數據庫都包含多個表空間。使用多個表空間有許多優點,例如可以使用戶數據與數據字典相分離,可以在不同的磁盤上存儲不同表空間的數據文件,從而減少I/O沖突,還可以使一些表空間在線,而使另一些表空間離線等等。
2.回滾段
每一個表空間是都由段組成。Oracle數據庫中的段有數據段、索引段、臨時段、回滾段和自舉段。比較重要的是回滾段,它記錄數據庫的變更信息,以實現數據庫的讀一致性及恢復工作。
在SYSTEM表空間裡有一個SYSTEM回滾段,是在創建數據庫時隨之產生的。如果使用多個表空間,至少還應有一個另外的回滾段。回滾段分專用和公用兩種,要使用專用回滾段,需要在初始化參數文件的ROLLBACK-SEGMENTS參數上寫上專用回滾段的段名並且重新啟動數據庫,或者通過回滾段在線命令使它在線。
數據庫的用戶
ORACLE數據庫是個多用戶系統。為了保證數據庫系統的安全,ORACLE數據庫管理系統配制了良好的安全機制。例如,每一個Oracle數據庫都有一個用戶表,它記載著每一個用戶的有關信息,一旦用戶進入系統,ORACLE系統會通過這張表來檢查用戶的合法性。又如,ORACLE系統通過合理分配用戶的權限來管理用戶。通常,Oracle將用戶分為三類,即DBA、RESOUCE和CONNECT三類角色,使不同的用戶的權限各不相同。
在創建數據庫時,系統自動建立了兩個用戶,即SYS和SYSTEM用戶,且授給這兩個用戶DB權限,由於DBA具有最高權限,建議將它們的口令及時修改,以免個別用戶以DBA角色進入系統,有意無意地給系統造成損害。
除了SYS、SYSTEM用戶外,其余用戶都要一一建立,建立用戶的方法如下:
假設要建的用戶名為RSXT,口令為RSPASS;默認的表空間為USER,臨時表空間為TEMP,表空間限額為3M,其余默認,則可用下面方法創建新用戶:
- SQLDBA>CREATE USER RSXT IDENTIFIED BY RSPASS
- DEFAULT TABLESPACE USER
- TEMPORARY TABLESPACE TEMP
- QUOTA 3M ON USER;
請注意,該用戶建立後,還要及時授權,否則像上述剛剛建成的用戶,則一無所為,甚至都不能連接數據庫。對一般用戶,通常授予CONNECT和RESOURCE角色權限,命令如下:
SQLDBA>GRANT CONNECT,RESOURCE TO RSXT;
對於一個有著許多用戶的數據庫系統,我們可以通過下述方法來了解數據庫的用戶情況。
1.對於非DBA用戶
對於非DBA用戶,有兩條命令,即:
(1)SQL>SELECT*FROM ALL-USERS;
(2)SQL>SELECT*FROM USER-USERS;
其中,從USER-USERS表中,可以了解到該用戶的默認表空間和臨時表空間等信息。
2.對於DBA用戶
對於DBA用戶,有三條命令,即:
(1)SQLDBA>SELECT*FROM ALL-USERS;
(2)SQLDBA>SELECT*FROM USER-USERS;
(3)SQLDBA>SELECT*FROM DBA-USERS;
其中,從DBA-USERS中,可以了解到所有用戶的詳細信息,因而該命令對於數據庫管理員來說是很有用的。
關於非DBA用戶的信息
由於DBA用戶具有最高權限,為安全起見,只有Oracle系統管理員才授予DBA權限,大多數用戶均為非DBA用戶。盡管相應的權限少了,但是從Oracle數據字典中,還是可以得到 很多關於非DBA用戶的有用信息。
我們可以采用下述方法來了解有關非DBA用戶的信息。
1.SQL>SELECT*FROM USER-USERS;
可以查看該用戶的默認表空間,臨時表空間和用戶創建時間。
2.SQL>SELECT*FROM USER-TABLES;
可以查看該用戶創建的所有表的詳細信息,由於列名較多,一屏看不了幾個表。
如果僅僅想查看用戶所建表的表名,可以用下面的命令:
SQL>SELECT TABLE-NAME FROM USER-TABLES;
3.SQL〉SELECT*FROM USER-VIEWS;
可以查看該用戶所創建的視圖,包括創建視圖的文本。
同樣,如果僅僅想查看用戶所建視圖的視圖名,可以用下面的命令:
SQL>SELECT VIEW-NAME FROM USER-VIEWS;
4.SQL>SELECT*FROM USER-TABLESPACES;
可以查看該用戶可存取的表空間的信息。
5.SQL>SELECT TABLESPACE-NAME,SUM(BYTES),SUM(BLOCKS)
FROM USER-FREE-SPACE GROUP BY TABLESPACE-NAME;
可以查看該用戶可存取的表空間的剩余空間。
6.SQL>SELECT *FROM USER-TS-QUOTAS;
可以查看該用戶的表空間的份額。
7.SQL>SELECT *FROM USER-ROLE-PRIVS;
可以查看該用戶被授予的角色。
8.SQL>SELECT *FROM USER-SYS-PRIVS;
可以查看該用戶的系統權限及能否再授予其它用戶的權限。
9.SQL>SELECT *FROM USER-TAB-PRIVS-RECD;
可以查看該用戶能訪問其它用戶的表、視圖等的對象權限。
10.SQL>SELECT *FROM USER-TAB-PRIVS-MADE;
可以查看該用戶授予其它用戶的表、視圖等的對象權限。
有關用戶的信息還有很多,這裡不再一一列舉,請Oracle系統管理員們自行查看Oracle數據字典。