在學習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開發應用程序使用的就是邏輯結構。數據庫存儲層次結構及其構成關系,結構對象也從數據塊到表空間形成了不同層次的粒度關系。
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)五部分組成,如下圖
塊頭(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保持不變。行遷移的原理如下圖所示:
無論是行鏈接還是行遷移,都會影響數據庫的性能。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的整數倍。
(以上摘自http://www.bitscn.com/pdb/oracle/200904/160356.html)
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命令來修改。用戶最好不要用編輯器進行修改。