Oracle 基于客戶 - 服務(wù)器結(jié)構(gòu)。Oracle 服務(wù)器由 數(shù)據(jù)庫 (原始數(shù)據(jù)加上日志和控制文件)和 實例(服務(wù)器上負責(zé)存取數(shù)據(jù)庫的進程和系統(tǒng)內(nèi)存)組成。一個實例僅能與一個數(shù)據(jù)庫相連。數(shù)據(jù)庫由 邏輯結(jié)構(gòu) 和 物理結(jié)構(gòu) 組成,邏輯結(jié)構(gòu)如數(shù)據(jù)庫模式,物理結(jié)構(gòu)包括形成 Oracle 數(shù)據(jù)庫的文件。
Oracle 的邏輯數(shù)據(jù)庫結(jié)構(gòu)
在邏輯層,Oracle 包含表空間、模式、數(shù)據(jù)塊 以及 區(qū)間 / 段。
表空間
一個 Oracle 數(shù)據(jù)庫被劃分為若干個邏輯存儲單元,稱為表空間(tablespace)??梢杂帽砜臻g將相關(guān)的邏輯結(jié)構(gòu)組織在一起。例如,表空間會把一個應(yīng)用程序的所有對象組織在一起,以簡化某些管理操作。
每個 Oracle 數(shù)據(jù)庫都包含一個名為 SYSTEM 的表空間,它是在創(chuàng)建數(shù)據(jù)庫時自動生成的。SYSTEM 表空間通常會包含整個數(shù)據(jù)庫的系統(tǒng)目錄表(在 Oracle 中,稱為 數(shù)據(jù)字典)。一個小型數(shù)據(jù)庫可能只需要一個 SYSTEM 表空間,但最好在創(chuàng)建一個表空間,用以與數(shù)據(jù)字典分開存放用戶數(shù)據(jù),從而減少字典對象和模式對象因同名數(shù)據(jù)文件帶來的沖突。
一個創(chuàng)建表空間的語句:
CREATE TABLESPACE user_data
DATAFILE 'DATA3.ORA' SIZE 100K
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
然后可以通過如下語句將表與指定的表空間相連:
CREATE TABLE PropertyForRent (propertyNo VARCHAR2(5) NOT NULL, ...)
TABLESPACE user_data;
如果在創(chuàng)建新表時沒有指定表空間,則會用到創(chuàng)建用戶賬戶時與用戶相連的默認空間。
用戶、模式和模式對象
用戶(有時稱為用戶名)是數(shù)據(jù)庫中定義的一個名稱,他可以連接或訪問對象。模式 是模式對象的一個命名集合,如表、視圖、索引、簇集和過程,它與特定的用戶相連。模式和用戶的概念有助于 DBA 管理數(shù)據(jù)庫的安全。
為了對數(shù)據(jù)庫進行存取,用戶必須首先運行一個數(shù)據(jù)庫應(yīng)用程序(如 Oracle Forms 或 SQL*Plus),然后用數(shù)據(jù)庫中已經(jīng)定義的一個用戶名來連接。在創(chuàng)建一個數(shù)據(jù)庫用戶時,將會相應(yīng)地為該用戶創(chuàng)建一個同名的模式。在默認狀態(tài)下,一旦用戶與數(shù)據(jù)庫相連接,用戶就可以對模式中的所有對象進行存取。因為用戶只與同名模式相連,所以 “用戶” 和 “模式” 這兩個詞可以互換(注意,表空間與模式之間不存在任何關(guān)系:在統(tǒng)一模式中的對象可以放在不同的表空間中,一個表空間也可以保存不同模式中的對象)。
數(shù)據(jù)塊、區(qū)間和段
數(shù)據(jù)塊 是 Oracle 可使用,或者說可分配的最小存儲單元。一個數(shù)據(jù)塊與物理磁盤空間中一定數(shù)量的字節(jié)相對應(yīng)??梢栽趧?chuàng)建 Oracle 數(shù)據(jù)庫時設(shè)置數(shù)據(jù)塊的大小。數(shù)據(jù)塊大小可以是操作系統(tǒng)中塊大小的倍數(shù)(須在系統(tǒng)的最大操作范圍內(nèi)),這樣可以避免不必要的 I/O 操作。數(shù)據(jù)塊的結(jié)構(gòu)如下:
- 標題:包含塊地址和段類型等一般信息。
- 表目錄:包含將數(shù)據(jù)放在此塊的表的相關(guān)信息。
- 行目錄:包含該數(shù)據(jù)塊中的行的相關(guān)信息。
- 行數(shù)據(jù):包含實際的表數(shù)據(jù)行。行可以跨塊存放。
- 空閑空間:分配給新插入的行或更新行時需要的額外空間。自 Oracle8i 以來,Oracle能自動管理空閑空間,盡管還有一個手動管理選項。
邏輯數(shù)據(jù)庫空間的第二個層次稱為 區(qū)間(extent)。區(qū)間是一定數(shù)量的連續(xù)數(shù)據(jù)塊,用來存儲某種特定類型的信息。區(qū)間之上的層次就是段。段是區(qū)間的集合,用來存儲某個邏輯結(jié)構(gòu)。例如,每個表的數(shù)據(jù)都存在他自己的數(shù)據(jù)段中,而每個索引的數(shù)據(jù)則存在它自己的索引段中。當某個段的現(xiàn)有的區(qū)間已滿時,就由 Oracle 動態(tài)地分配新空間。因為區(qū)間是根據(jù)需要分配的,所以包含在段中的區(qū)間在磁盤上可能連續(xù)也可能不連續(xù)。

Oracle 的物理數(shù)據(jù)庫結(jié)構(gòu)
Oracle中主要的物理數(shù)據(jù)庫結(jié)構(gòu)是數(shù)據(jù)文件、重做日志文件和控制文件。
數(shù)據(jù)文件
每個 Oracle 數(shù)據(jù)庫都有一個或多個物理數(shù)據(jù)文件。邏輯數(shù)據(jù)庫結(jié)構(gòu)(如表和索引)中的數(shù)據(jù)是以數(shù)據(jù)文件這樣的物理形式存儲的。一個或多個數(shù)據(jù)文件形成一個表空間。最簡單的 Oracle 數(shù)據(jù)庫可能只有一個表空間和一個數(shù)據(jù)文件。更復(fù)雜的數(shù)據(jù)庫可能會包含四個表空間,每個表空間中有兩個數(shù)據(jù)文件,因此總共有八個數(shù)據(jù)文件。
重做日志文件
每個 Oracle 數(shù)據(jù)庫都有一個由兩個(或更多)重做日志文件所構(gòu)成的集合,它記錄了對數(shù)據(jù)進行的所有更改,其目的是便于以后的恢復(fù)。某個故障可能使得修改了的數(shù)據(jù)未能永久的寫入數(shù)據(jù)文件,那么可從重做日志中獲取這個修改,從而防止丟失工作。
控制文件
每個 Oracle 數(shù)據(jù)庫都有一個控制文件,它包含了所有其他文件(這些文件都參與了數(shù)據(jù)庫的組成)的一個列表,例如,數(shù)據(jù)文件和重做日志文件。為了更好地對數(shù)據(jù)進行保護,最好有多個控制文件(可以將多個副本寫入多個設(shè)備中)。同樣,最好也保存多個重做日志文件的副本。
Oracle 實例
Oracle 實例由 Oracle 進程和對數(shù)據(jù)庫中的信息進行存取所需的共享內(nèi)存組成,其中,Oracle 使用共享內(nèi)存對數(shù)據(jù)和索引進行高速緩存,并對共享程序代碼進行存儲。共享內(nèi)存可以劃分為不同的內(nèi)存結(jié)構(gòu),其中最基本的就是系統(tǒng)全局區(qū)(System Global Area, SGA)和程序全局區(qū)(Program Global Area,PGA)。
-
系統(tǒng)全局區(qū)
SGA 是共享內(nèi)存的一片區(qū)域,用來存儲某個 Oracle 實例的數(shù)據(jù)和控制信息在 Oracle 實例開始時分配 SGA,關(guān)閉時回收 SGA。SGA中的信息由下列內(nèi)存結(jié)構(gòu)組成,其中的每個結(jié)構(gòu)都有固定的大小,并且都在實例啟動時創(chuàng)建:數(shù)據(jù)庫高速緩沖區(qū)
它包含了數(shù)據(jù)庫最近使用過的數(shù)據(jù)塊。這些數(shù)據(jù)塊可以是已修改但還沒寫入磁盤的數(shù)據(jù)(臟塊),也可以是沒被修改過的數(shù)據(jù),還可以是修改后已寫入磁盤的數(shù)據(jù)(干凈塊)。存儲最近使用過的數(shù)據(jù)塊可以使大多數(shù)活躍的數(shù)據(jù)緩沖在內(nèi)存,從而減少I/O,提高系統(tǒng)的性能。共享池
它包含了一些共享的內(nèi)存結(jié)構(gòu),如庫高速緩存(library cache)中的共享 SQL 區(qū)和數(shù)據(jù)字典中的內(nèi)部信息。共享 SQL 區(qū)中包含 SQL 查詢的分析樹和執(zhí)行規(guī)劃。如果多個應(yīng)用程序都用到了同一個 SQL 語句,那它們都能對共享 SQL 區(qū)進行存取,從而減少了所需的內(nèi)存數(shù)量,也減少了查詢處理所需的分析和執(zhí)行時間。大池
這是一片可選的內(nèi)存區(qū),用于大片內(nèi)存分配(例如,緩沖恢復(fù)管理器(RMAN)的大量 I/O 內(nèi)容)。Java 池
這片區(qū)域存儲所有會話專有 Java 代碼和 Java 虛擬機內(nèi)的數(shù)據(jù)。流池
這片區(qū)域用于存儲緩沖的隊列消息并為 Oracle 流提供內(nèi)存。Oracle流使信息流(如數(shù)據(jù)庫事件和數(shù)據(jù)庫變化)能被管理并潛在的傳播到其他的數(shù)據(jù)庫。固定 SGA
這是一個內(nèi)部管理區(qū),它包含各種各樣的數(shù)據(jù),如關(guān)于數(shù)據(jù)庫狀態(tài)和 Oracle 實例的信息,以及 Oracle 進程間通信的信息,比如鎖信息等。
程序全局區(qū)
PGA 是共享內(nèi)存的一片區(qū)域,用來存儲一個 Oracle 進程的數(shù)據(jù)和控制信息。PGA 由 Oracle Database 在一個 Oracle 進程開啟時創(chuàng)建。每個服務(wù)器進程和后臺進程都有一個 PGA。其大小和內(nèi)容由 Oracle 服務(wù)器的安裝選項決定。客戶進程
每個客戶進程都代表一個客戶與 Oracle 服務(wù)器的一個連接(例如,使用 SQL*Plus 或是 Oracle Forms 應(yīng)用程序)??蛻暨M程操縱著用戶輸入、與 Oracle 服務(wù)進程的通信及顯示客戶所需的信息,如果需要,還可以將這些信息轉(zhuǎn)換為更有效的形式。Oracle 進程
Oracle (服務(wù)器)進程根據(jù)客戶需求執(zhí)行相應(yīng)功能。Oracle 進程可以分成兩類:服務(wù)器進程(處理相連的用戶進程所發(fā)出的請求)和后臺進程(執(zhí)行異步 I/O,并提供了更大并行性,從而提高了系統(tǒng)的性能和可靠性)。圖中給出了如下的后臺進程:

數(shù)據(jù)庫寫回器(DBWR)
DBWR 進程負責(zé)將已修改的(臟的)數(shù)據(jù)塊從 SGA 高速緩存區(qū)寫回到磁盤的數(shù)據(jù)文件中。一個 Oracle 實例至多有 10 個 DBWR 進程,從 DBW0 ~ DBW9 依次命名,用來處理多個數(shù)據(jù)文件的 I/O 。Oracle 采用了一種稱為先寫日志的技術(shù),這就意味著,每當需要釋放緩沖區(qū)時,DBWR 進程就會批量的執(zhí)行寫出,而不用等到事務(wù)的提交點。日志寫回器(LGWR)
LGWR 進程負責(zé)將日志從日志緩沖區(qū)寫回到重做日志文件中。檢查點(CKPT)
檢查點是一個事件,在這個事件中,所有已修改的數(shù)據(jù)庫緩沖區(qū)都會由 DBWR 寫回到數(shù)據(jù)文件中。CKPT 進程負責(zé)通知最近的檢查點一致。CKPT 進程是可選的,如果將其省略,則由 LGWR 進程來完成它的工作。系統(tǒng)監(jiān)視器(SMON)
當實例從一個出錯點重新開始時,由 SMON 進程負責(zé)對系統(tǒng)事故進行恢復(fù)。因系統(tǒng)崩潰而終止的事務(wù)的恢復(fù)也包括在內(nèi)。SMON 還充當了數(shù)據(jù)庫的磁盤碎片整理程序,它可以將數(shù)據(jù)文件中的空閑區(qū)間進行整合。進程監(jiān)視器(PMON)
PMON 進程負責(zé)跟蹤對數(shù)據(jù)庫進行存取的用戶進程,并在系統(tǒng)崩潰后對其進行恢復(fù)。它將清除所有的一流資源(如內(nèi)存),并釋放由故障進程所加的鎖。歸檔器(ARCH)
當在線的重做日志文件被寫滿時,由 ARCH 進程負責(zé)將它們復(fù)制到歸檔器上。系統(tǒng)最多可設(shè)定10個 ARCH 進程,依次命名為 ARC0 ~ ARC9。其余的歸檔器進程可以在有讀寫指令時由 LWGR 啟動。恢復(fù)器(RECO)
RECO 進程負責(zé)清除出錯的或者是掛起的分布事務(wù)。鎖管理服務(wù)器(LMS)
如果采用了 Oracle Real Application Cluster 選項,則由 LMS 進程負責(zé)實例間的加鎖操作。閃回寫和恢復(fù)寫(FWRW)
當設(shè)置閃回或遇到保證還原點,F(xiàn)WRW 進程將閃回數(shù)據(jù)寫入閃回恢復(fù)區(qū)的閃回數(shù)據(jù)庫日志。閃回工具使管理員和用戶能回看和操縱單個 SQL 語句、段和服務(wù)的累加的統(tǒng)計數(shù)據(jù)。MMON 進程負責(zé)包括每小時收集一次統(tǒng)計信息并產(chǎn)生一個 AWR 快照在內(nèi)的許多工作。易處理性監(jiān)控 Lite(MMNL)
這個進程負責(zé)將 SGA 中 Active Session History(ASH)緩沖區(qū)里的統(tǒng)計數(shù)據(jù)寫入磁盤。當 ASH 滿時 MMNL 寫入磁盤。
在前面的描述中大多使用了 “進程” 這個詞,目前一些系統(tǒng)會在實現(xiàn)中用線程取代進程。