1. 程式人生 > >oracle資料庫體系架構詳解

oracle資料庫體系架構詳解

在學習oracle中,體系結構是重中之重,一開始從巨集觀上掌握它的物理組成、檔案組成和各種檔案組成。掌握的越深入越好。在實際工作遇到疑難問題,其實都可以歸結到體系結構中來解釋。體系結構是對一個系統的框架描述。是設計一個系統的巨集觀工作。這好比建一棟大樓。你首先應該以圖紙的方式把整個大樓的體系架構描述出來。然後一點點的往裡面填充東西。下面我們先以一個圖解的方式對oracle體系結構有一個基本瞭解

根據示圖,便於我們記憶,示圖分三部分組成,左側User Process、Server Process、PGA可以看做成Clinet端,上面的例項(Instance)和下面的資料庫(Database)及引數檔案(parameter file)、密碼檔案(password file)和歸檔日誌檔案(archived logfiles)組成Oracle Server,所以整個示圖可以理解成一個C/S架構。 Oracle Server由兩個實體組成:例項(instance)與資料庫(database)。這兩個實體是獨立的,不過連線在一起。在資料庫建立過程中,例項首先被建立,然後才建立資料庫。在典型的單例項環境中,例項與資料庫的關係是一對一的,一個例項連線一個數據庫,例項與資料庫也可以是多對一的關係,即不同計算機上的多個例項開啟共享磁碟系統上的一個公用資料庫。這種多對一關係被稱為實際應用群集(Real Application Clusters,RAC)RAC極大提高了資料庫的效能、容錯與可伸縮性(可能耗費更多的儲存空間)並且是oracle網格(grid)概念的必備部分。

下面我們來詳細看一下oracle資料庫的體系架構

Oracle體系架構主要有兩大部分組成:資料庫例項(Instance)和資料庫檔案(database)

資料庫例項

指資料庫伺服器的記憶體及相關處理程式,它是Oracle的心臟。與Oracle效能關係最大的是SGA(System Global Area,即系統全域性區活共享記憶體區),SGA包含三個部分:

1、資料緩衝區,可避免重複讀取常用的資料;

2、日誌緩衝區,提升了資料增刪改的速度,減少磁碟的讀寫而加快速度;

3、共享池,使相同的SQL語句不再編譯,提升了SQL的執行速度。

oracle資料庫例項的另一部分就是一些後臺程序了,他主要包括:

1.系統監控程序

2.程序監控

3.資料庫寫程序

4.日誌寫程序

5.檢驗點程序

6.其他程序

這些後臺程序合起來完成資料庫管理任務

在訪問資料庫的時候。器後臺先啟動例項。啟動例項前要先分配記憶體區。然後在啟動後臺程序。資料庫啟動過程中必須啟動上面的前五個程序。否則例項無法建立。

注意:在啟動oracle資料庫的時候。因為有些程序是在開機啟動項中自動啟動的。所以佔用了很大一部分記憶體。如果您電腦上還有一些其他佔用記憶體比較大的程式。在啟動oracle資料庫的時候有可能會因記憶體不足而啟動失敗。

Oracle伺服器

Oracle伺服器包括兩部分:資料庫例項和資料庫檔案。他們構成了也就是所謂的資料管理系統(DBMS)

物理結構:oracle的物理結構指的其實就是一些存在硬碟上的各種檔案。其最終目的就是儲存和獲取相關資料。這些存在硬碟上的檔案組成了oracle資料庫的物理結構

Oracle中主要包括三種檔案:

1.資料檔案

2.控制檔案

3.重做日誌檔案

引數檔案和密碼檔案:

引數檔案:定義了資料庫例項的特性,他是正文檔案

密碼檔案:授予使用者啟動和關閉資料庫的例項。主要有二進位制資料組成

Oracle資料庫的記憶體結構:SGA和PGA

SGA:資料庫例項的一部分。資料庫例項的啟動會首先分配系統全域性區(SGA)

1.共享池:共享sql和pl/sql程式碼,即把解析的sql程式碼在這裡快取,PL/SQL不僅快取還共享。這樣大大提高了直接訪問磁盤獲得sql的速度。

1)庫快取記憶體:儲存最近使用過的sql語句。利用LRU(最近最少使用)演算法來管理快取。最近最少使用演算法是一種比較常用的演算法。在這裡當庫快取記憶體接近滿的時候。它會把快取中最近最少使用的資料清除快取中。加入新的快取sql。

檢視共享池的大小使用引數shared_pool_size

Sql>show parameter shared_pool_size

設定共享池大小

Sql>alter system set shared_pool_size=16M

注:在下面的的內容中。如果提到有關引數。如沒有特殊說明。設定和檢視引數值都是用以上類似方法。以後就不在重複了。並且這些引數必須是在以系統管理員system登陸時才能檢視和修改。用類似scott使用者是不能檢視和修改的。

Oracle提供了DB_CACHE_SIZE(資料庫大小)和DB_BLOCK_BUFFERS(資料庫塊個數)設定庫快取記憶體的大小,即為兩者的成績。

2)資料字典快取記憶體

儲存資料檔案、表、索引、列、使用者、許可權資訊和其他一些資料庫物件的定義。把相關的資料字典資訊放入快取來提高查詢的響應時間。其大小取決於共享池的大小。

2.資料庫快取記憶體

儲存了最近從資料檔案讀入的資料塊資訊或使用者更改後需要寫回資料庫的資料資訊。記憶體讀取比磁碟讀取的速度快的多。提高了訪問速度。這裡的存取也採用了LRU(最近最少使用)演算法。

Oracle資料庫引入了緩衝區顧問引數(Buffer cache advisory parameter)用於啟動和關閉統計資訊。這些資訊用於預測不同緩衝區的大小導致的不同行為特性。三種狀態:OFF:ON:READY

設定顧問快取為開啟狀態後。可以通過動態效能檢視:v$db_cache_advice檢視緩衝區的建議資訊

3.重做日誌快取

在執行insert、update等操作後。資料發生了改變。這些變化的資料在寫入資料庫快取記憶體前會先寫入重做日誌緩衝區。包括變化之前的資料。可以通過初始化引數log_buffer檢視它的大小。此引數為靜態引數,不能修改。

4.大池和java池

大型池(Large Pool)

在SGA中大型池是可選的緩衝區。它可以根據需要有管理權進行配置。它可以提供一個大的區以供象資料庫的備份與恢復等操作。

在以下幾種情形下會啟用:

一,backup 和 restore 操作的時候

二,當啟動UGA, I/O slaves的時候

三,設定MTS伺服器的時候,使用者資訊的存放也使用到Large Pool

可以使用以下命令進行更改Large Pool的大小:

ALTER SYSTEM SET Large_Pool_Size = 64m;

Java池用於編譯java語言編寫的指令。通過java_pool_size檢視和修改大小。大小由資料庫在SGA自動分配和管理。所以檢視的時候值為0;

Oracle的連線和會話

連線 (connection)與會話 (session)這兩個概念均與使用者程序 (user process)緊密相關,但二者又具有不同的含義。

連線 :使用者程序和 Oracle 例項間的通訊通道(communication pathway)。這個通訊通道是通過程序間的通訊機制(interprocess communication mechanisms)(在同一個計算機上執行使用者程序和 Oracle 程序)或網路軟體(network software)(當資料庫應用程式與 Oracle 伺服器執行在不同的計算機上時,就需要通過網路來通訊)建立的。

會話 :使用者通過使用者程序與 Oracle 例項建立的連線[此處連線與上文中的連線含義不同 ,主要指使用者和資料庫間的聯絡 ]。例如,當用戶啟動 SQL*Plus 時必須提供有效的使用者名稱和密碼,之後 Oracle 為此使用者建立一個會話。從使用者開始連線到使用者斷開連線(或退出資料庫應用程式)期間,會話一直持續。

Oracle 資料庫中的同一個使用者可以同時建立多個會話。例如,使用者名稱/密碼為的SCOTT/TIGER 使用者可以多次連線到同一個 Oracle 例項。

當系統沒有執行在共享服務模式下時,Oracle 為每個使用者會話建立一個服務程序(server process)。而當系統執行在共享服務模式下時,多個使用者會話可以共享同一個服務程序。

一、Oracle的邏輯結構

Oracle的邏輯結構是一種層次結構。主要由:表空間、段、區和資料塊等概念組成。邏輯結構是面向使用者的,使用者使用Oracle開發應用程式使用的就是邏輯結構。資料庫儲存層次結構及其構成關係,結構物件也從資料塊到表空間形成了不同層次的粒度關係。

oracle邏輯結構

1.資料塊(Data Blocks)

資料塊是Oracle最小的儲存單位,Oracle資料存放在“塊”中。一個塊佔用一定的磁碟空間。特別注意的是,這裡的“塊”是Oracle的“資料塊”,不是作業系統的“塊”。

Oracle每次請求資料的時候,都是以塊為單位。也就是說,Oracle每次請求的資料是塊的整數倍。如果Oracle請求的資料量不到一塊,Oracle也會讀取整個塊。所以說,“塊”是Oracle讀寫資料的最小單位或者最基本的單位。

塊的標準大小由初始化引數DB_BLOCK_SIZE指定。具有標準大小的塊稱為標準塊(Standard Block)。塊的大小和標準塊的大小不同的塊叫非標準塊(Nonstandard Block)。

作業系統每次執行I/O的時候,是以作業系統的塊為單位;Oracle每次執行I/O的時候,都是以Oracle的塊為單位。

Oracle資料塊大小一般是作業系統塊的整數倍。

資料塊的格式(Data Block Format)

塊中存放表的資料和索引的資料,無論存放哪種型別的資料,塊的格式都是相同的,塊由塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory),空餘空間(Free Space)和行資料(Row Data)五部分組成,如下圖

Oracle資料塊

塊頭(header/Common and Variable):存放塊的基本資訊,如:塊的實體地址,塊所屬的段的型別(是資料段還是索引段)。

表目錄(Table Directory):存放表的資訊,即:如果一些表的資料被存放在這個塊中,那麼,這些表的相關資訊將被存放在“表目錄”中。

行目錄(Row Directory):如果塊中有行資料存在,則,這些行的資訊將被記錄在行目錄中。這些資訊包括行的地址等。

行資料(Row Data):是真正存放表資料和索引資料的地方。這部分空間是已被資料行佔用的空間。

空餘空間(Free Space):空餘空間是一個塊中未使用的區域,這片區域用於新行的插入和已經存在的行的更新。

頭部資訊區(Overhead):我們把塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory)這三部分合稱為頭部資訊區(Overhead)。頭部資訊區不存放資料,它存放的整個塊的資訊。頭部資訊區的大小是可變的。一般來說,頭部資訊區的大小介於84位元組(bytes)到107位元組(bytes)之間。

資料塊中自由空間的使用

當往資料庫中插入(INSERT)資料的時候,塊中的自由空間會減少;當對塊中已經存在的行進行修改(UPDATE)的時候(使記錄長度增加),塊中的自由空間也會減少。

DELETE語句和UPDATE語句會使塊中的自由空間增加。當使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候,Oracle會釋放出一部分自由空間。釋放出的自由空間並不一定是連續的。通常情況下,Oracle不會對塊中不連續的自由空間進行合併。因為合併資料塊中不連續的自由空間會影響資料庫的效能。只有當用戶進行資料插入(INSERT)或者更新(UPDATE)操作,卻找不到連續的自由空間的時候,Oracle才會合併資料塊中不連續的自由空間。

對於塊中的自由空間,Oracle提供兩種管理方式:自動管理,手動管理

行連結和行遷移(Row Chaining and Migrating)

行連結(Row Chaining):如果我們往資料庫中插入(INSERT)一行資料,這行資料很大,以至於一個數據塊存不下一整行,Oracle就會把一行資料分作幾段存在幾個資料塊中,這個過程叫行連結(Row Chaining)。如下圖所示:

普通行

如果一行資料是普通行,這行資料能夠存放在一個數據塊中;如果一行資料是連結行,這行資料存放在多個數據塊中。

行遷移(Row Migrating):資料塊中存在一條記錄,使用者執行UPDATE更新這條記錄,這個UPDATE操作使這條記錄變長,這時候,Oracle在這個資料塊中進行查詢,但是找不到能夠容納下這條記錄的空間,無奈之下,Oracle只能把整行資料移到一個新的資料塊。原來的資料塊中保留一個“指標”,這個“指標”指向新的資料塊。被移動的這條記錄的ROWID保持不變。行遷移的原理如下圖所示:

00

無論是行連結還是行遷移,都會影響資料庫的效能。Oracle在讀取這樣的記錄的時候,Oracle會掃描多個數據塊,執行更多的I/O。

塊中自由空間的自動管理

Oracle使用點陣圖(bitmap)來管理和跟蹤資料塊,這種塊的空間管理方式叫“自動管理”。自動管理有下面的好處:

◆易於使用

◆更好地利用空間

◆可以對空間進行實時調整

塊中自由空間的手動管理

使用者可以通過PCTFREE, PCTUSED來調整塊中空間的使用,這種管理方式叫手動管理。相對於自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費。

PCTUSED也是用於設定一個百分比,當塊中已使用的空間的比例小於這個百分比的時候,這個塊才被標識為有效狀態。只有有效的塊才被允許插入資料。

PCTFREE引數用於指定塊中必須保留的最小空閒空間百分例,預設值為10。之所以要預留這樣的空間,是因為UPDATE時,需要這些空間。如果UPDATE時,沒有空餘空間,Oracle就會分配一個新的塊,這會產生行遷移(Row Migrating)。

例如,假定在Create table語句中指定了pctfree為20,則說明在該表的資料段內每個資料塊的20%被作為可利用的空閒空間,用於更新已在資料塊記憶體在的資料行其餘80%是用於插入新的資料行,直到達到80%為止。顯然,pctfree值越小,則為現存行更新所預留的空間越少。因此,如果pctfree設定得太高,則在全表掃描期間增加I/O,浪費磁碟空間;如果pctfree設定得太低,則會導致行遷移。 
pctused引數設定了資料塊是否是空閒的界限。當資料塊的使用空間低於pctused的值時,此資料塊標誌為空閒,該空閒空間僅用於插入新的行。如果資料塊已經達到了由pctfree所確定的上邊界時,Oracle就認為此資料塊已經無法再插入新的行。例如,假定在Create table語句中指定pctused為40,則當小於或等於39時,該資料塊才是可用的。所以,可將資料塊填得更滿,這樣可節省空間,但卻增加了處理開銷,因為資料塊的空閒空間總是要被更新的行佔據,所以對資料塊需要頻繁地進行重新組織。比較低的pctused增加了資料庫的空閒空間,但減少了更新操作的處理開銷。所以,如果pctused設定過高,則會降低磁碟的利用率導致行遷移;若pctused設定過低,則浪費磁碟空間,增加全表掃描時的I/O輸出。pctused是與pctfree相對的引數。 
那麼,如何選擇pctfree和pctused的值呢?有個公式可供參考。顯然,pctfree和pctused的之和不能超過100。若兩者之和低於100,則空間的利用與系統的I/O之間的最佳平衡點是:pctfree與pctused之和等於100%減去一行的大小佔塊空間大小的百分比。例如,如果塊大小為2048位元組,則它需要100個位元組的開銷,而行大小是390位元組(為可用塊的20%)。為了充分利用空間,pctfree與pctused之和最好為80%。 
那麼,怎樣確定資料塊大小呢?有兩個因素需要考慮: 
一是資料庫環境型別。例如,是DSS環境還是OLTP環境?在資料倉庫環境(OLAP或DSS)下,使用者需要進行許多執行時間很長的查詢,所以應當使用大的資料塊。在OLTP系統中,使用者處理大量的小型事務,採用較小資料塊能夠獲得更好的效果。 
二是SGA的大小。資料庫緩衝區的大小由資料塊大小和初始化檔案的db_block_buffers引數決定。最好設為作業系統I/O的整數倍。

2.資料區(Extent)

是一組連續的資料塊。當一個表、回滾段或臨時段建立或需要附加空間時,系統總是為之分配一個新的資料區。一個數據區不能跨越多個檔案,因為它包含連續的資料塊。使用區的目的是用來儲存特定資料型別的資料,也是表中資料增長的基本單位。在Oracle資料庫中,分配空間就是以資料區為單位的。一個Oracle物件包含至少一個數據區。設定一個表或索引的儲存引數包含設定它的資料區大小。

3.段(Segment)

是由多個數據區構成的,它是為特定的資料庫物件(如表段、索引段、回滾段、臨時段)分配的一系列資料區。段內包含的資料區可以不連續,並且可以跨越多個檔案。使用段的目的是用來儲存特定物件。 
一個Oracle資料庫有4種類型的段: 
資料段:資料段也稱為表段,它包含資料並且與表和簇相關。當建立一個表時,系統自動建立一個以該表的名字命名的資料段。 
索引段:包含了用於提高系統性能的索引。一旦建立索引,系統自動建立一個以該索引的名字命名的索引段。 
回滾段:包含了回滾資訊,並在資料庫恢復期間使用,以便為資料庫提供讀入一致性和回滾未提交的事務,即用來回滾事務的資料空間。當一個事務開始處理時,系統為之分配回滾段,回滾段可以動態建立和撤銷。系統有個預設的回滾段,其管理方式既可以是自動的,也可以是手工的。 
臨時段:它是Oracle在執行過程中自行建立的段。當一個SQL語句需要臨時工作區時,由Oracle建立臨時段。一旦語句執行完畢,臨時段的區間便退回給系統。

4.表空間(tablespace)

是資料庫的邏輯劃分。任何資料庫物件在儲存時都必須儲存在某個表空間中。表空間對應於若干個磁碟檔案,即表空間是由一個或多個磁碟檔案構成的。表空間相當於作業系統中的資料夾,也是資料庫邏輯結構與物理檔案之間的一個對映。每個資料庫至少有一個表空間(system tablespace),表空間的大小等於所有從屬於它的資料檔案大小的總和。

(1)系統表空間(system tablespace)

是每個Oracle資料庫都必須具備的。其功能是在系統表空間中存放諸如表空間名稱、表空間所含資料檔案等資料庫管理所需的資訊。系統表空間的名稱是不可更改的。系統表空間必須在任何時候都可以用,也是資料庫執行的必要條件。因此,系統表空間是不能離線的。 
系統表空間包括資料字典、儲存過程、觸發器和系統回滾段。為避免系統表空間產生儲存碎片以及爭用系統資源的問題,應建立一個獨立的表空間用來單獨儲存使用者資料。

(2)SYSAUX表空間 
是隨著資料庫的建立而建立的,它充當SYSTEM的輔助表空間,主要儲存除資料字典以外的其他物件。SYSAUX也是許多Oracle 資料庫的預設表空間,它減少了由資料庫和DBA管理的表空間數量,降低了SYSTEM表空間的負荷。

(3)臨時表空間 
相對於其他表空間而言,臨時表空間(temp tablespace)主要用於儲存Oracle資料庫執行期間所產生的臨時資料。資料庫可以建立多個臨時表空間。當資料庫關閉後,臨時表空間中所有資料將全部被清除。除臨時表空間外,其他表空間都屬於永久性表空間。

(4)撤銷表空間 
用於儲存Oracle資料庫撤銷資訊,即儲存使用者回滾段的表空間稱之為回滾表空間(或簡稱為RBS撤銷表空間(undo tablespace))。在Oracle8i中是rollback tablespace,從Oracle9i開始改為undo tablespace。在Oracle 10g中初始建立的只有6個表空間sysaux、system、temp、undotbs1、example和users。其中temp是臨時表空間,undotbs1是undo撤銷表空間。

(5)USERS表空間

使用者表空間,用於存放永久性使用者物件的資料和私有資訊。每個資料塊都應該有一個使用者表空間,以便在建立使用者是將其分配給使用者。

表空間

二、物理結構

Oracle物理結構包含了資料檔案、日誌檔案和控制檔案

1.資料檔案

每一個ORACLE資料庫有一個或多個物理的資料檔案(data file)。一個數據庫的資料檔案包含全部資料庫資料。邏輯資料庫結構(如表、索引)的資料物理地儲存在資料庫的資料檔案中。資料檔案有下列特徵: 
一個數據檔案僅與一個數據庫聯絡。

一旦建立,資料檔案不能改變大小.

一個表空間(資料庫儲存的邏輯單位)由一個或多個數據檔案組成。 
資料檔案中的資料在需要時可以讀取並存儲在ORACLE記憶體儲區中。例如:使用者要存取資料庫一表的某些資料,如果請求資訊不在資料庫的記憶體儲存區內,則從相應的資料檔案中讀取並存儲在記憶體。當修改和插入新資料時,不必立刻寫入資料檔案。為了減少磁碟輸出的總數,提高效能,資料儲存在記憶體,然後由ORACLE後臺程序DBWR決定如何將其寫入到相應的資料檔案。

2.日誌檔案

每一個數據庫有兩個或多個日誌檔案(redo log file)的組,每一個日誌檔案組用於收集資料庫日誌。日誌的主要功能是記錄對資料所作的修改,所以對資料庫作的全部修改是記錄在日誌中。在出現故障時,如果不能將修改資料永久地寫入資料檔案,則可利用日誌得到該修改,所以從不會丟失已有操作成果。 
日誌檔案主要是保護資料庫以防止故障。為了防止日誌檔案本身的故障,ORACLE允許鏡象日誌(mirrored redo log),以致可在不同磁碟上維護兩個或多個日誌副本。 
日誌檔案中的資訊僅在系統故障或介質故障恢復資料庫時使用,這些故障阻止將資料庫資料寫入到資料庫的資料檔案。然而任何丟失的資料在下一次資料庫開啟時,ORACLE自動地應用日誌檔案中的資訊來恢復資料庫資料檔案。

Oralce兩種日誌檔案型別:

聯機日誌檔案 
這是Oracle用來迴圈記錄資料庫改變的作業系統檔案

歸檔日誌檔案 
這是指為避免聯機日誌檔案重寫時丟失重複資料而對聯機日誌檔案所做的備份

Oracle有兩種歸檔日誌模式,Oracle資料庫可以採用其中任何一種模式:

NOARCHIVELOG 
不對日誌檔案進行歸檔。這種模式可以大大減少資料庫備份的開銷,但可能回導致資料的不可恢復

ARCHIVELOG 
在這種模式下,當Oracle轉向一個新的日誌檔案時,將以前的日誌檔案進行歸檔。為了防止出現歷史“缺口”的情況,一個給定的日誌檔案在它成功歸檔之前是不能重新使用的。歸檔的日誌檔案,加上聯機日誌檔案,為資料庫的所有改變提供了完整的歷史資訊。

在Oracle利用日誌檔案和歸檔日誌檔案來恢復資料庫時,內部序列號可以起一個嚮導的作用。

3.控制檔案

每一ORACLE資料庫有一個控制檔案(control file),它記錄資料庫的物理結構,包含下列資訊型別: 
資料庫名; 
資料庫資料檔案和日誌檔案的名字和位置; 
資料庫建立日期。 
為了安全起見,允許控制檔案被鏡象。 
每一次ORACLE資料庫的例項啟動時,它的控制檔案用於標識資料庫和日誌檔案,當著手資料庫操作時它們必須被開啟。當資料庫的物理組成更改時,ORACLE自動更改該資料庫的控制檔案。資料恢復時,也要使用控制檔案。

4.引數檔案

除了構成Oracle資料庫物理結構的三類主要檔案外,Oracle資料庫還具有另外一種重要的檔案:引數檔案。引數檔案記錄了Oracle資料庫的基本引數資訊,主要包括資料庫名、控制檔案所在路徑、程序等。與舊版本的初始化引數檔案INITsid.ora不同,在Oracle10g中還可以使用二進進制服務器引數檔案,並且該伺服器引數檔案在安裝Oracle資料庫系統時由系統自動建立,檔案的名稱為SPFILEsid.ora,sid為所建立的資料庫例項名。 
SPFILEsid.ora中的引數是由Oracle系統自動管理。如果想要對資料庫的某些引數進行設定,則可能過OEM或ALTER SYSTEM命令來修改。使用者最好不要用編輯器進行修改。