ORACLE體系結(jié)構(gòu),很詳細

轉(zhuǎn)子:http://blog.csdn.net/sinat_33363493/article/details/51782609



數(shù)據(jù)庫(Database)
數(shù)據(jù)庫是一個數(shù)據(jù)的集合,不僅是指物理上的數(shù)據(jù),也指物理、存儲及進程對象的一個組合。Oracle是一個基于B/S模式的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。
Oracle系統(tǒng)體系結(jié)構(gòu)由三部分組成:邏輯結(jié)構(gòu)、物理結(jié)構(gòu)和實例。
ORACLE體系結(jié)構(gòu),很詳細
oracle總體系
Oracle的邏輯結(jié)構(gòu)是一種層次結(jié)構(gòu)。主要由:表空間、段、區(qū)和數(shù)據(jù)塊等概念組成。邏輯結(jié)構(gòu)是面向用戶的,用戶使用Oracle開發(fā)應(yīng)用程序使用的就是邏輯結(jié)構(gòu)。數(shù)據(jù)庫存儲層次結(jié)構(gòu)及其構(gòu)成關(guān)系,結(jié)構(gòu)對象也從數(shù)據(jù)塊到表空間形成了不同層次的粒度關(guān)系。
ORACLE體系結(jié)構(gòu),很詳細
oracle邏輯結(jié)構(gòu)
1.數(shù)據(jù)塊(Data Blocks)
數(shù)據(jù)塊是Oracle最小的存儲單位,Oracle數(shù)據(jù)存放在“塊”中。一個塊占用一定的磁盤空間。特別注意的是,這里的“塊”是Oracle的“數(shù)據(jù)塊”,不是操作系統(tǒng)的“塊”。
Oracle每次請求數(shù)據(jù)的時候,都是以塊為單位。也就是說,Oracle每次請求的數(shù)據(jù)是塊的整數(shù)倍。如果Oracle請求的數(shù)據(jù)量不到一塊,Oracle也會讀取整個塊。所以說,“塊”是Oracle讀寫數(shù)據(jù)的最小單位或者最基本的單位。
塊的標準大小由初始化參數(shù)DB_BLOCK_SIZE指定。具有標準大小的塊稱為標準塊(Standard Block)。塊的大小和標準塊的大小不同的塊叫非標準塊(Nonstandard Block)。
操作系統(tǒng)每次執(zhí)行I/O的時候,是以操作系統(tǒng)的塊為單位;Oracle每次執(zhí)行I/O的時候,都是以O(shè)racle的塊為單位。
Oracle數(shù)據(jù)塊大小一般是操作系統(tǒng)塊的整數(shù)倍。
數(shù)據(jù)塊的格式(Data Block Format)
塊中存放表的數(shù)據(jù)和索引的數(shù)據(jù),無論存放哪種類型的數(shù)據(jù),塊的格式都是相同的,塊由塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory),空余空間(Free Space)和行數(shù)據(jù)(Row Data)五部分組成,如下圖
ORACLE體系結(jié)構(gòu),很詳細
Oracle數(shù)據(jù)塊
塊頭(header/Common and Variable):存放塊的基本信息,如:塊的物理地址,塊所屬的段的類型(是數(shù)據(jù)段還是索引段)。
表目錄(Table Directory):存放表的信息,即:如果一些表的數(shù)據(jù)被存放在這個塊中,那么,這些表的相關(guān)信息將被存放在“表目錄”中。
行目錄(Row Directory):如果塊中有行數(shù)據(jù)存在,則,這些行的信息將被記錄在行目錄中。這些信息包括行的地址等。
行數(shù)據(jù)(Row Data):是真正存放表數(shù)據(jù)和索引數(shù)據(jù)的地方。這部分空間是已被數(shù)據(jù)行占用的空間。
空余空間(Free Space):空余空間是一個塊中未使用的區(qū)域,這片區(qū)域用于新行的插入和已經(jīng)存在的行的更新。
頭部信息區(qū)(Overhead):我們把塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory)這三部分合稱為頭部信息區(qū)(Overhead)。頭部信息區(qū)不存放數(shù)據(jù),它存放的整個塊的信息。頭部信息區(qū)的大小是可變的。一般來說,頭部信息區(qū)的大小介于84字節(jié)(bytes)到107字節(jié)(bytes)之間。
數(shù)據(jù)塊中自由空間的使用
當(dāng)往數(shù)據(jù)庫中插入(INSERT)數(shù)據(jù)的時候,塊中的自由空間會減少;當(dāng)對塊中已經(jīng)存在的行進行修改(UPDATE)的時候(使記錄長度增加),塊中的自由空間也會減少。
DELETE語句和UPDATE語句會使塊中的自由空間增加。當(dāng)使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候,Oracle會釋放出一部分自由空間。釋放出的自由空間并不一定是連續(xù)的。通常情況下,Oracle不會對塊中不連續(xù)的自由空間進行合并。因為合并數(shù)據(jù)塊中不連續(xù)的自由空間會影響數(shù)據(jù)庫的性能。只有當(dāng)用戶進行數(shù)據(jù)插入(INSERT)或者更新(UPDATE)操作,卻找不到連續(xù)的自由空間的時候,Oracle才會合并數(shù)據(jù)塊中不連續(xù)的自由空間。
對于塊中的自由空間,Oracle提供兩種管理方式:自動管理,手動管理
行鏈接和行遷移(Row Chaining and Migrating)
行鏈接(Row Chaining):如果我們往數(shù)據(jù)庫中插入(INSERT)一行數(shù)據(jù),這行數(shù)據(jù)很大,以至于一個數(shù)據(jù)塊存不下一整行,Oracle就會把一行數(shù)據(jù)分作幾段存在幾個數(shù)據(jù)塊中,這個過程叫行鏈接(Row Chaining)。如下圖所示:
ORACLE體系結(jié)構(gòu),很詳細
普通行
如果一行數(shù)據(jù)是普通行,這行數(shù)據(jù)能夠存放在一個數(shù)據(jù)塊中;如果一行數(shù)據(jù)是鏈接行,這行數(shù)據(jù)存放在多個數(shù)據(jù)塊中。
行遷移(Row Migrating):數(shù)據(jù)塊中存在一條記錄,用戶執(zhí)行UPDATE更新這條記錄,這個UPDATE操作使這條記錄變長,這時候,Oracle在這個數(shù)據(jù)塊中進行查找,但是找不到能夠容納下這條記錄的空間,無奈之下,Oracle只能把整行數(shù)據(jù)移到一個新的數(shù)據(jù)塊。原來的數(shù)據(jù)塊中保留一個“指針”,這個“指針”指向新的數(shù)據(jù)塊。被移動的這條記錄的ROWID保持不變。行遷移的原理如下圖所示:
ORACLE體系結(jié)構(gòu),很詳細
無論是行鏈接還是行遷移,都會影響數(shù)據(jù)庫的性能。Oracle在讀取這樣的記錄的時候,Oracle會掃描多個數(shù)據(jù)塊,執(zhí)行更多的I/O。
塊中自由空間的自動管理
Oracle使用位圖(bitmap)來管理和跟蹤數(shù)據(jù)塊,這種塊的空間管理方式叫“自動管理”。自動管理有下面的好處:
◆易于使用
◆更好地利用空間
◆可以對空間進行實時調(diào)整
塊中自由空間的手動管理
用戶可以通過PCTFREE, PCTUSED來調(diào)整塊中空間的使用,這種管理方式叫手動管理。相對于自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費。
PCTUSED也是用于設(shè)置一個百分比,當(dāng)塊中已使用的空間的比例小于這個百分比的時候,這個塊才被標識為有效狀態(tài)。只有有效的塊才被允許插入數(shù)據(jù)。
PCTFREE參數(shù)用于指定塊中必須保留的最小空閑空間百分例,默認值為10。之所以要預(yù)留這樣的空間,是因為UPDATE時,需要這些空間。如果UPDATE時,沒有空余空間,Oracle就會分配一個新的塊,這會產(chǎn)生行遷移(Row Migrating)。
例如,假定在Create table語句中指定了pctfree為20,則說明在該表的數(shù)據(jù)段內(nèi)每個數(shù)據(jù)塊的20%被作為可利用的空閑空間,用于更新已在數(shù)據(jù)塊內(nèi)存在的數(shù)據(jù)行其余80%是用于插入新的數(shù)據(jù)行,直到達到80%為止。顯然,pctfree值越小,則為現(xiàn)存行更新所預(yù)留的空間越少。因此,如果pctfree設(shè)置得太高,則在全表掃描期間增加I/O,浪費磁盤空間;如果pctfree設(shè)置得太低,則會導(dǎo)致行遷移。  pctused參數(shù)設(shè)置了數(shù)據(jù)塊是否是空閑的界限。當(dāng)數(shù)據(jù)塊的使用空間低于pctused的值時,此數(shù)據(jù)塊標志為空閑,該空閑空間僅用于插入新的行。如果數(shù)據(jù)塊已經(jīng)達到了由pctfree所確定的上邊界時,Oracle就認為此數(shù)據(jù)塊已經(jīng)無法再插入新的行。例如,假定在Create table語句中指定pctused為40,則當(dāng)小于或等于39時,該數(shù)據(jù)塊才是可用的。所以,可將數(shù)據(jù)塊填得更滿,這樣可節(jié)省空間,但卻增加了處理開銷,因為數(shù)據(jù)塊的空閑空間總是要被更新的行占據(jù),所以對數(shù)據(jù)塊需要頻繁地進行重新組織。比較低的pctused增加了數(shù)據(jù)庫的空閑空間,但減少了更新操作的處理開銷。所以,如果pctused設(shè)置過高,則會降低磁盤的利用率導(dǎo)致行遷移;若pctused設(shè)置過低,則浪費磁盤空間,增加全表掃描時的I/O輸出。pctused是與pctfree相對的參數(shù)。  那么,如何選擇pctfree和pctused的值呢?有個公式可供參考。顯然,pctfree和pctused的之和不能超過100。若兩者之和低于100,則空間的利用與系統(tǒng)的I/O之間的最佳平衡點是:pctfree與pctused之和等于100%減去一行的大小占塊空間大小的百分比。例如,如果塊大小為2048字節(jié),則它需要100個字節(jié)的開銷,而行大小是390字節(jié)(為可用塊的20%)。為了充分利用空間,pctfree與pctused之和最好為80%。  那么,怎樣確定數(shù)據(jù)塊大小呢?有兩個因素需要考慮:  一是數(shù)據(jù)庫環(huán)境類型。例如,是DSS環(huán)境還是OLTP環(huán)境?在數(shù)據(jù)倉庫環(huán)境(OLAP或DSS)下,用戶需要進行許多運行時間很長的查詢,所以應(yīng)當(dāng)使用大的數(shù)據(jù)塊。在OLTP系統(tǒng)中,用戶處理大量的小型事務(wù),采用較小數(shù)據(jù)塊能夠獲得更好的效果。  二是SGA的大小。數(shù)據(jù)庫緩沖區(qū)的大小由數(shù)據(jù)塊大小和初始化文件的db_block_buffers參數(shù)決定。最好設(shè)為操作系統(tǒng)I/O的整數(shù)倍。
(以上摘自http://www.bitscn.com/pdb/oracle/200904/160356.html)
2.?dāng)?shù)據(jù)區(qū)(Extent)
是一組連續(xù)的數(shù)據(jù)塊。當(dāng)一個表、回滾段或臨時段創(chuàng)建或需要附加空間時,系統(tǒng)總是為之分配一個新的數(shù)據(jù)區(qū)。一個數(shù)據(jù)區(qū)不能跨越多個文件,因為它包含連續(xù)的數(shù)據(jù)塊。使用區(qū)的目的是用來保存特定數(shù)據(jù)類型的數(shù)據(jù),也是表中數(shù)據(jù)增長的基本單位。在Oracle數(shù)據(jù)庫中,分配空間就是以數(shù)據(jù)區(qū)為單位的。一個Oracle對象包含至少一個數(shù)據(jù)區(qū)。設(shè)置一個表或索引的存儲參數(shù)包含設(shè)置它的數(shù)據(jù)區(qū)大小。
3.段(Segment)
是由多個數(shù)據(jù)區(qū)構(gòu)成的,它是為特定的數(shù)據(jù)庫對象(如表段、索引段、回滾段、臨時段)分配的一系列數(shù)據(jù)區(qū)。段內(nèi)包含的數(shù)據(jù)區(qū)可以不連續(xù),并且可以跨越多個文件。使用段的目的是用來保存特定對象。  一個Oracle數(shù)據(jù)庫有4種類型的段:  數(shù)據(jù)段:數(shù)據(jù)段也稱為表段,它包含數(shù)據(jù)并且與表和簇相關(guān)。當(dāng)創(chuàng)建一個表時,系統(tǒng)自動創(chuàng)建一個以該表的名字命名的數(shù)據(jù)段。  索引段:包含了用于提高系統(tǒng)性能的索引。一旦建立索引,系統(tǒng)自動創(chuàng)建一個以該索引的名字命名的索引段。  回滾段:包含了回滾信息,并在數(shù)據(jù)庫恢復(fù)期間使用,以便為數(shù)據(jù)庫提供讀入一致性和回滾未提交的事務(wù),即用來回滾事務(wù)的數(shù)據(jù)空間。當(dāng)一個事務(wù)開始處理時,系統(tǒng)為之分配回滾段,回滾段可以動態(tài)創(chuàng)建和撤銷。系統(tǒng)有個默認的回滾段,其管理方式既可以是自動的,也可以是手工的。  臨時段:它是Oracle在運行過程中自行創(chuàng)建的段。當(dāng)一個SQL語句需要臨時工作區(qū)時,由Oracle建立臨時段。一旦語句執(zhí)行完畢,臨時段的區(qū)間便退回給系統(tǒng)。
4.表空間(tablespace)
是數(shù)據(jù)庫的邏輯劃分。任何數(shù)據(jù)庫對象在存儲時都必須存儲在某個表空間中。表空間對應(yīng)于若干個磁盤文件,即表空間是由一個或多個磁盤文件構(gòu)成的。表空間相當(dāng)于操作系統(tǒng)中的文件夾,也是數(shù)據(jù)庫邏輯結(jié)構(gòu)與物理文件之間的一個映射。每個數(shù)據(jù)庫至少有一個表空間(system tablespace),表空間的大小等于所有從屬于它的數(shù)據(jù)文件大小的總和。
(1)系統(tǒng)表空間(system tablespace)
是每個Oracle數(shù)據(jù)庫都必須具備的。其功能是在系統(tǒng)表空間中存放諸如表空間名稱、表空間所含數(shù)據(jù)文件等數(shù)據(jù)庫管理所需的信息。系統(tǒng)表空間的名稱是不可更改的。系統(tǒng)表空間必須在任何時候都可以用,也是數(shù)據(jù)庫運行的必要條件。因此,系統(tǒng)表空間是不能脫機的。  系統(tǒng)表空間包括數(shù)據(jù)字典、存儲過程、觸發(fā)器和系統(tǒng)回滾段。為避免系統(tǒng)表空間產(chǎn)生存儲碎片以及爭用系統(tǒng)資源的問題,應(yīng)創(chuàng)建一個獨立的表空間用來單獨存儲用戶數(shù)據(jù)。
(2)SYSAUX表空間  是隨著數(shù)據(jù)庫的創(chuàng)建而創(chuàng)建的,它充當(dāng)SYSTEM的輔助表空間,主要存儲除數(shù)據(jù)字典以外的其他對象。SYSAUX也是許多Oracle 數(shù)據(jù)庫的默認表空間,它減少了由數(shù)據(jù)庫和DBA管理的表空間數(shù)量,降低了SYSTEM表空間的負荷。
(3)臨時表空間  相對于其他表空間而言,臨時表空間(temp tablespace)主要用于存儲Oracle數(shù)據(jù)庫運行期間所產(chǎn)生的臨時數(shù)據(jù)。數(shù)據(jù)庫可以建立多個臨時表空間。當(dāng)數(shù)據(jù)庫關(guān)閉后,臨時表空間中所有數(shù)據(jù)將全部被清除。除臨時表空間外,其他表空間都屬于永久性表空間。
(4)撤銷表空間  用于保存Oracle數(shù)據(jù)庫撤銷信息,即保存用戶回滾段的表空間稱之為回滾表空間(或簡稱為RBS撤銷表空間(undo tablespace))。在Oracle8i中是rollback tablespace,從Oracle9i開始改為undo tablespace。在Oracle 10g中初始創(chuàng)建的只有6個表空間sysaux、system、temp、undotbs1、example和users。其中temp是臨時表空間,undotbs1是undo撤銷表空間。
(5)USERS表空間
用戶表空間,用于存放永久性用戶對象的數(shù)據(jù)和私有信息。每個數(shù)據(jù)塊都應(yīng)該有一個用戶表空間,以便在創(chuàng)建用戶是將其分配給用戶。
Oracle物理結(jié)構(gòu)包含了數(shù)據(jù)文件、日志文件和控制文件
1.數(shù)據(jù)文件
每一個ORACLE數(shù)據(jù)庫有一個或多個物理的數(shù)據(jù)文件(data file)。一個數(shù)據(jù)庫的數(shù)據(jù)文件包含全部數(shù)據(jù)庫數(shù)據(jù)。邏輯數(shù)據(jù)庫結(jié)構(gòu)(如表、索引)的數(shù)據(jù)物理地存儲在數(shù)據(jù)庫的數(shù)據(jù)文件中。數(shù)據(jù)文件有下列特征:  一個數(shù)據(jù)文件僅與一個數(shù)據(jù)庫聯(lián)系。
一旦建立,數(shù)據(jù)文件不能改變大小.
一個表空間(數(shù)據(jù)庫存儲的邏輯單位)由一個或多個數(shù)據(jù)文件組成。  數(shù)據(jù)文件中的數(shù)據(jù)在需要時可以讀取并存儲在ORACLE內(nèi)存儲區(qū)中。例如:用戶要存取數(shù)據(jù)庫一表的某些數(shù)據(jù),如果請求信息不在數(shù)據(jù)庫的內(nèi)存存儲區(qū)內(nèi),則從相應(yīng)的數(shù)據(jù)文件中讀取并存儲在內(nèi)存。當(dāng)修改和插入新數(shù)據(jù)時,不必立刻寫入數(shù)據(jù)文件。為了減少磁盤輸出的總數(shù),提高性能,數(shù)據(jù)存儲在內(nèi)存,然后由ORACLE后臺進程DBWR決定如何將其寫入到相應(yīng)的數(shù)據(jù)文件。
2.日志文件
每一個數(shù)據(jù)庫有兩個或多個日志文件(redo log file)的組,每一個日志文件組用于收集數(shù)據(jù)庫日志。日志的主要功能是記錄對數(shù)據(jù)所作的修改,所以對數(shù)據(jù)庫作的全部修改是記錄在日志中。在出現(xiàn)故障時,如果不能將修改數(shù)據(jù)永久地寫入數(shù)據(jù)文件,則可利用日志得到該修改,所以從不會丟失已有操作成果。  日志文件主要是保護數(shù)據(jù)庫以防止故障。為了防止日志文件本身的故障,ORACLE允許鏡象日志(mirrored redo log),以致可在不同磁盤上維護兩個或多個日志副本。  日志文件中的信息僅在系統(tǒng)故障或介質(zhì)故障恢復(fù)數(shù)據(jù)庫時使用,這些故障阻止將數(shù)據(jù)庫數(shù)據(jù)寫入到數(shù)據(jù)庫的數(shù)據(jù)文件。然而任何丟失的數(shù)據(jù)在下一次數(shù)據(jù)庫打開時,ORACLE自動地應(yīng)用日志文件中的信息來恢復(fù)數(shù)據(jù)庫數(shù)據(jù)文件。
Oralce兩種日志文件類型:
聯(lián)機日志文件  這是Oracle用來循環(huán)記錄數(shù)據(jù)庫改變的操作系統(tǒng)文件
歸檔日志文件  這是指為避免聯(lián)機日志文件重寫時丟失重復(fù)數(shù)據(jù)而對聯(lián)機日志文件所做的備份
Oracle有兩種歸檔日志模式,Oracle數(shù)據(jù)庫可以采用其中任何一種模式:
NOARCHIVELOG  不對日志文件進行歸檔。這種模式可以大大減少數(shù)據(jù)庫備份的開銷,但可能回導(dǎo)致數(shù)據(jù)的不可恢復(fù)
ARCHIVELOG  在這種模式下,當(dāng)Oracle轉(zhuǎn)向一個新的日志文件時,將以前的日志文件進行歸檔。為了防止出現(xiàn)歷史“缺口”的情況,一個給定的日志文件在它成功歸檔之前是不能重新使用的。歸檔的日志文件,加上聯(lián)機日志文件,為數(shù)據(jù)庫的所有改變提供了完整的歷史信息。
在Oracle利用日志文件和歸檔日志文件來恢復(fù)數(shù)據(jù)庫時,內(nèi)部序列號可以起一個向?qū)У淖饔谩?
3.控制文件
每一ORACLE數(shù)據(jù)庫有一個控制文件(control file),它記錄數(shù)據(jù)庫的物理結(jié)構(gòu),包含下列信息類型:  數(shù)據(jù)庫名;  數(shù)據(jù)庫數(shù)據(jù)文件和日志文件的名字和位置;  數(shù)據(jù)庫建立日期。  為了安全起見,允許控制文件被鏡象。  每一次ORACLE數(shù)據(jù)庫的實例啟動時,它的控制文件用于標識數(shù)據(jù)庫和日志文件,當(dāng)著手數(shù)據(jù)庫操作時它們必須被打開。當(dāng)數(shù)據(jù)庫的物理組成更改時,ORACLE自動更改該數(shù)據(jù)庫的控制文件。數(shù)據(jù)恢復(fù)時,也要使用控制文件。
4.參數(shù)文件
除了構(gòu)成Oracle數(shù)據(jù)庫物理結(jié)構(gòu)的三類主要文件外,Oracle數(shù)據(jù)庫還具有另外一種重要的文件:參數(shù)文件。參數(shù)文件記錄了Oracle數(shù)據(jù)庫的基本參數(shù)信息,主要包括數(shù)據(jù)庫名、控制文件所在路徑、進程等。與舊版本的初始化參數(shù)文件INITsid.ora不同,在Oracle10g中還可以使用二進進制服務(wù)器參數(shù)文件,并且該服務(wù)器參數(shù)文件在安裝Oracle數(shù)據(jù)庫系統(tǒng)時由系統(tǒng)自動創(chuàng)建,文件的名稱為SPFILEsid.ora,sid為所創(chuàng)建的數(shù)據(jù)庫實例名。  SPFILEsid.ora中的參數(shù)是由Oracle系統(tǒng)自動管理。如果想要對數(shù)據(jù)庫的某些參數(shù)進行設(shè)置,則可能過OEM或ALTER SYSTEM命令來修改。用戶最好不要用編輯器進行修改。
數(shù)據(jù)庫實例(也稱為服務(wù)器Server)就是用來訪問一個數(shù)據(jù)庫文件集的一個存儲結(jié)構(gòu)及后臺進程的集合。它使一個單獨的數(shù)據(jù)庫可以被多個實例訪問(也就是ORACLE并行服務(wù)器-- OPS)。
實例在操作系統(tǒng)中用ORACLE_SID來標識,在Oracle中用參數(shù)INSTANCE_NAME來標識, 它們兩個的值是相同的。數(shù)據(jù)庫啟動時,系統(tǒng)首先在服務(wù)器內(nèi)存中分配系統(tǒng)全局區(qū)(SGA),構(gòu)成了Oracle的內(nèi)存結(jié)構(gòu),然后啟動若干個常駐內(nèi)存的操作系統(tǒng)進程,即組成了Oracle的 進程結(jié)構(gòu),內(nèi)存區(qū)域和后臺進程合稱為一個Oracle實例。
ORACLE體系結(jié)構(gòu),很詳細
1.系統(tǒng)全局區(qū)(SGA)
SGA是一組為系統(tǒng)分配的共享的內(nèi)存結(jié)構(gòu),可以包含一個數(shù)據(jù)庫實例的數(shù)據(jù)或控制信:  息。如果多個用戶連接到同一個數(shù)據(jù)庫實例,在實例的SGA中,數(shù)據(jù)可以被多個用戶共享, 當(dāng)數(shù)據(jù)庫實例啟動時,SGA的內(nèi)存被自動分配;當(dāng)數(shù)據(jù)庫實例關(guān)閉時,SGA內(nèi)存被回收。  SGA是占用內(nèi)存最大的一個區(qū)域,同時也是影響數(shù)據(jù)庫性能的重要因素。
系統(tǒng)全局區(qū)(SGA),主要包括:
1)數(shù)據(jù)塊緩存區(qū)  數(shù)據(jù)塊緩存區(qū)(datablockbuffercache)是SGA中的一個高速緩存區(qū)域,用來存儲從數(shù)據(jù)庫中讀取數(shù)據(jù)段的數(shù)據(jù)塊(如表、索引和簇)。數(shù)據(jù)塊緩存區(qū)的大小由數(shù)據(jù)庫服務(wù)器init.ora文件中的DB_LOCK_BUFFERS參數(shù)決定(用數(shù)據(jù)庫塊的個數(shù)表示)。在調(diào)整和管理數(shù)據(jù)庫時,調(diào)整數(shù)據(jù)塊緩存區(qū)的大小是一個重要的部分。
因為數(shù)據(jù)塊緩存區(qū)的大小固定,并且其大小通常小于數(shù)據(jù)庫段所使用的空間,所以它不能一次裝載下內(nèi)存中所有的數(shù)據(jù)庫段。通常,數(shù)據(jù)塊緩存區(qū)只是數(shù)據(jù)庫大小的1%~2%,Oracle使用最近最少使用(LRU,leastrecentlyused)算法來管理可用空間。當(dāng)存儲區(qū)需要自由空間時,最近最少使用塊將被移出,新數(shù)據(jù)塊將在存儲區(qū)代替它的位置。通過這種方法,將最頻繁使用的數(shù)據(jù)保存在存儲區(qū)中。
然而,如果SGA的大小不足以容納所有最常使用的數(shù)據(jù),那么,不同的對象將爭用數(shù)據(jù)塊緩存區(qū)中的空間。當(dāng)多個應(yīng)用程序共享同一個SGA時,很有可能發(fā)生這種情況。此時,每個應(yīng)用的最近使用段都將與其他應(yīng)用的最近使用段爭奪SGA中的空間。其結(jié)果是,對數(shù)據(jù)塊緩存區(qū)的數(shù)據(jù)請求將出現(xiàn)較低的命中率,導(dǎo)致系統(tǒng)性能下降。
2)字典緩存區(qū)  數(shù)據(jù)庫對象的信息存儲在數(shù)據(jù)字典表中,這些信息包括用戶帳號數(shù)據(jù)、數(shù)據(jù)文件名、段名、盤區(qū)位置、表說明和權(quán)限,當(dāng)數(shù)據(jù)庫需要這些信息(如檢查用戶查詢一個表的授權(quán))時,將讀取數(shù)據(jù)字典表并且將返回的數(shù)據(jù)存儲在字典緩存區(qū)的SGA中。
數(shù)據(jù)字典緩存區(qū)通過最近最少使用(LRU)算法來管理。字典緩存區(qū)的大小由數(shù)據(jù)庫內(nèi)部管理。字典緩存區(qū)是SQL共享池的一部分,共享池的大小由數(shù)據(jù)庫文件init.ora中的SHARED_POOL_SIZE參數(shù)來設(shè)置。
如果字典緩存區(qū)太小,數(shù)據(jù)庫就不得不反復(fù)查詢數(shù)據(jù)字典表以訪問數(shù)據(jù)庫所需的信息,這些查詢稱為循環(huán)調(diào)用(recuesivecall),這時的查詢速度相對字典緩存區(qū)獨立完成查詢時要低。
3)重做日志緩沖區(qū)  重做項描述對數(shù)據(jù)庫進行的修改。它們寫到聯(lián)機重做日志文件中,以便在數(shù)據(jù)庫恢復(fù)過程中用于向前滾動操作。然而,在被寫入聯(lián)機重做日志文件之前,事務(wù)首先被記錄在稱作重做日志緩沖區(qū)(redologbuffer)的SGA中。數(shù)據(jù)庫可以周期地分批向聯(lián)機重做日志文件中寫重做項的內(nèi)容,從而優(yōu)化這個操作。重做日志緩沖區(qū)的大小(以字節(jié)為單位)由init.ora文件中的LOG_BUFFER參數(shù)決定。
4)SQL共享池  SQL共享池存儲數(shù)據(jù)字典緩存區(qū)及庫緩存區(qū)(librarycache),即對數(shù)據(jù)庫進行操作的語句信息。當(dāng)數(shù)據(jù)塊緩沖區(qū)和字典緩存區(qū)能夠共享數(shù)據(jù)庫用戶間的結(jié)構(gòu)及數(shù)據(jù)信息時,庫緩存區(qū)允許共享常用的SQL語句。
SQL共享池包括執(zhí)行計劃及運行數(shù)據(jù)庫的SQL語句的語法分析樹。在第二次運行(由任何用戶)相同的SQL語句時,可以利用SQL共享池中可用的語法分析信息來加快執(zhí)行速度。
SQL共享池通過LRU算法來管理。當(dāng)SQL共享池填滿時,將從庫緩存區(qū)中刪掉最近最少使用的執(zhí)行路徑和語法分析樹,以便為新的條目騰出空間。如果SQL共享池太小,語句將被連續(xù)不斷地再裝入到庫緩存區(qū),從而影響操作性能。
SQL共享池的大小(以字節(jié)為單位)由init.ora文件參數(shù)SHARED_POOL_SIZE決定。
5)大池  大池(LargePool)是一個可選內(nèi)存區(qū)。如果使用線程服務(wù)器選項或頻繁執(zhí)行備份/恢復(fù)操作,只要創(chuàng)建一個大池,就可以更有效地管理這些操作。大池將致力于支持SQL大型命令。利用大池,就可以防止這些SQL大型命令把條目重寫入SQL共享池中,從而減少再裝入到庫緩存區(qū)中的語句數(shù)量。大池的大小(以字節(jié)為單位)通過init.ora文件的LARGE_POOL_SIZE參數(shù)設(shè)置,用戶可以使用init.ora文件的LARGE_POOL_MIN_ALLOC參數(shù)設(shè)置大池中的最小位置。Oracle8i已不用這個參數(shù)。作為使用LargePool的一種選擇方案,可以用init.ora文件的SHARED_POOL_RESERVED_SIZE參數(shù)為SQL大型語句保留一部分SQL共享池。
6)Java池  由其名字可知,Java池為Java命令提供語法分析。Java池的大小(以字節(jié)為單位)通過在Oracle8i引入的init.ora文件的JAVA_POOL_SIZE參數(shù)設(shè)置。init.ora文件的JAVA_POOL_SIZE參數(shù)缺省設(shè)置為10MB。
7)多緩沖池  可以在SGA中創(chuàng)建多個緩沖池,能夠用多個緩沖池把大數(shù)據(jù)集與其他的應(yīng)用程序分開,以減少它們爭奪數(shù)據(jù)塊緩存區(qū)內(nèi)相同資源的可能性。對于創(chuàng)建的每一個緩沖池,都要規(guī)定其LRU鎖存器的大小和數(shù)量。緩沖區(qū)的數(shù)量必須至少比LRU鎖存器的數(shù)量多50倍。
創(chuàng)建緩沖池時,需要規(guī)定保存區(qū)(keeparea)的大小和再循環(huán)區(qū)(recyclearea)的大小。與SQL共享池的保留區(qū)一樣,保存區(qū)保持條目,而再循環(huán)區(qū)則被頻繁地再循環(huán)使用??梢酝ㄟ^BUFFER_POOL_KEEP參數(shù)規(guī)定來保存區(qū)的大小。例如:  保存和再循環(huán)緩沖池的容量減少了數(shù)據(jù)塊緩沖存儲區(qū)中的可用空間(通過DB_BLOCK_BUFFERS參數(shù)設(shè)置)。對于使用一個新緩沖池的表,通過表的storage子句中的buffer_pool參數(shù)來規(guī)定緩沖池的名字。例如,如果需要從內(nèi)存中快速刪除一個表,就把它賦予RECYCLE池。缺省池叫作DEFAULT,這樣就能在以后用altertable命令把一個表轉(zhuǎn)移到DEFAULT池。
2.后臺進程(Backgroung Process)
數(shù)據(jù)庫的物理結(jié)構(gòu)與內(nèi)存結(jié)構(gòu)之間的交互要通過后臺進程來完成。
1、DBWR進程:該進程執(zhí)行將緩沖區(qū)寫入數(shù)據(jù)文件,是負責(zé)緩沖存儲區(qū)管理的一個Oracle后臺進程。當(dāng)緩沖區(qū)中的一緩沖區(qū)被修改,它被標志為“弄臟”,DBWR的主要任務(wù)是將“弄臟”的緩沖區(qū)寫入磁盤,使緩沖區(qū)保持“干凈”。由于緩沖存儲區(qū)的緩沖區(qū)填入數(shù)據(jù)庫或被用戶進程弄臟,未用的緩沖區(qū)的數(shù)目減少。當(dāng)未用的緩沖區(qū)下降到很少,以致用戶進程要從磁盤讀入塊到內(nèi)存存儲區(qū)時無法找到未用的緩沖區(qū)時,DBWR將管理緩沖存儲區(qū),使用戶進程總可得到未用的緩沖區(qū)。
Oracle采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持內(nèi)存中的數(shù)據(jù)塊是最近使用的,使I/O最小。在下列情況預(yù)示DBWR 要將弄臟的緩沖區(qū)寫入磁盤:
當(dāng)一個服務(wù)器進程將一緩沖區(qū)移入“弄臟”表,該弄臟表達到臨界長度時,該服務(wù)進程將通知DBWR進行寫。該臨界長度是為參數(shù)DB-BLOCK-WRITE-BATCH的值的一半。
當(dāng)一個服務(wù)器進程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT緩沖區(qū)時,沒有查到未用的緩沖區(qū),它停止查找并通知DBWR進行寫。出現(xiàn)超時(每次3秒),DBWR 將通知本身。當(dāng)出現(xiàn)檢查點時,LGWR將通知DBWR.在前兩種情況下,DBWR將弄臟表中的塊寫入磁盤,每次可寫的塊數(shù)由初始化參數(shù)DB-BLOCK- WRITE-BATCH所指定。如果弄臟表中沒有該參數(shù)指定塊數(shù)的緩沖區(qū),DBWR從LUR表中查找另外一個弄臟緩沖區(qū)。
如果DBWR在三秒內(nèi)未活動,則出現(xiàn)超時。在這種情況下DBWR對LRU表查找指定數(shù)目的緩沖區(qū),將所找到任何弄臟緩沖區(qū)寫入磁盤。每當(dāng)出現(xiàn)超時,DBWR查找一個新的緩沖區(qū)組。每次由DBWR查找的緩沖區(qū)的數(shù)目是為寢化參數(shù)DB-BLOCK- WRITE-BATCH的值的二倍。如果數(shù)據(jù)庫空運轉(zhuǎn),DBWR最終將全部緩沖區(qū)存儲區(qū)寫入磁盤。
在出現(xiàn)檢查點時,LGWR指定一修改緩沖區(qū)表必須寫入到磁盤。DBWR將指定的緩沖區(qū)寫入磁盤。
在有些平臺上,一個實例可有多個DBWR.在這樣的實例中,一些塊可寫入一磁盤,另一些塊可寫入其它磁盤。參數(shù)DB-WRITERS控制DBWR進程個數(shù)。
ORACLE體系結(jié)構(gòu),很詳細
2、LGWR進程:該進程將日志緩沖區(qū)寫入磁盤上的一個日志文件,它是負責(zé)管理日志緩沖區(qū)的一個Oracle后臺進程。LGWR進程將自上次寫入磁盤以來的全部日志項輸出,LGWR輸出:
◆當(dāng)用戶進程提交一事務(wù)時寫入一個提交記錄。  ◆每三秒將日志緩沖區(qū)輸出。  ◆當(dāng)日志緩沖區(qū)的1/3已滿時將日志緩沖區(qū)輸出。  ◆當(dāng)DBWR將修改緩沖區(qū)寫入磁盤時則將日志緩沖區(qū)輸出。
LGWR進程同步地寫入到活動的鏡象在線日志文件組。如果組中一個文件被刪除或不可用,LGWR可繼續(xù)地寫入該組的其它文件。
日志緩沖區(qū)是一個循環(huán)緩沖區(qū)。當(dāng)LGWR將日志緩沖區(qū)的日志項寫入日志文件后,服務(wù)器進程可將新的日志項寫入到該日志緩沖區(qū)。LGWR 通常寫得很快,可確保日志緩沖區(qū)總有空間可寫入新的日志項。
注意:有時候當(dāng)需要更多的日志緩沖區(qū)時,LWGR在一個事務(wù)提交前就將日志項寫出,而這些日志項僅當(dāng)在以后事務(wù)提交后才永久化。
ORACLE使用快速提交機制,當(dāng)用戶發(fā)出COMMIT語句時,一個COMMIT記錄立即放入日志緩沖區(qū),但相應(yīng)的數(shù)據(jù)緩沖區(qū)改變是被延遲,直到在更有效時才將它們寫入數(shù)據(jù)文件。當(dāng)一事務(wù)提交時,被賦給一個系統(tǒng)修改號(SCN),它同事務(wù)日志項一起記錄在日志中。由于SCN記錄在日志中,以致在并行服務(wù)器選項配置情況下,恢復(fù)操作可以同步。
ORACLE體系結(jié)構(gòu),很詳細
3、CKPT進程:該進程在檢查點出現(xiàn)時,對全部數(shù)據(jù)文件的標題進行修改,指示該檢查點。在通常的情況下,該任務(wù)由LGWR執(zhí)行。然而,如果檢查點明顯地降低系統(tǒng)性能時,可使CKPT進程運行,將原來由LGWR進程執(zhí)行的檢查點的工作分離出來,由CKPT進程實現(xiàn)。對于許多應(yīng)用情況,CKPT進程是不必要的。只有當(dāng)數(shù)據(jù)庫有許多數(shù)據(jù)文件,LGWR在檢查點時明顯地降低性能才使CKPT運行。 CKPT進程不將塊寫入磁盤,該工作是由DBWR完成的。初始化參數(shù)CHECKPOINT-PROCESS控制CKPT進程的使能或使不能。缺省時為FALSE,即為使不能。
由于Oracle中LGWR和DBWR工作的不一致,Oracle引入了檢查點的概念,用于同步數(shù)據(jù)庫,保證數(shù)據(jù)庫的一致性。在Oracle里面,檢查點分為兩種:完全檢查點和增量檢查點。下面我們分別介紹這兩種檢查點的作用:
1、完全檢查點
在Oracle8i之前,數(shù)據(jù)庫的發(fā)生的檢查點都是完全檢查點,完全檢查點會將數(shù)據(jù)緩沖區(qū)里面所有的臟數(shù)據(jù)塊寫入相應(yīng)的數(shù)據(jù)文件中,并且同步數(shù)據(jù)文件頭和控制文件,保證數(shù)據(jù)庫的一致。完全檢查點在8i之后只有在下列兩種情況下才會發(fā)生:
(1)DBA手工執(zhí)行alter system checkpoint的命令;
(2)數(shù)據(jù)庫正常shutdown(immediate,transcational,normal)。
由于完全檢查點會將所有的臟數(shù)據(jù)庫塊寫入,巨大的IO往往會影響到數(shù)據(jù)庫的性能。因此Oracle從8i開始引入了增量檢查點的概念。
2、 增量檢查點
Oracle從8i開始引入了檢查點隊列這么一種概念,用于記錄數(shù)據(jù)庫里面當(dāng)前所有的臟數(shù)據(jù)塊的信息,DBWR根據(jù)這個隊列而將臟數(shù)據(jù)塊寫入到數(shù)據(jù)文件中。檢查點隊列按時間先后記錄著數(shù)據(jù)庫里面臟數(shù)據(jù)塊的信息,里面的條目包含RBA(Redo Block Address,重做日志里面用于標識檢查點期間數(shù)據(jù)塊在重做日志里面第一次發(fā)生更改的編號)和數(shù)據(jù)塊的數(shù)據(jù)文件號和塊號。在檢查點期間不論數(shù)據(jù)塊更改幾次,它在檢查點隊列里面的位置始終保持不變,檢查點隊列也只會記錄它最早的RBA,從而保證最早更改的數(shù)據(jù)塊能夠盡快寫入。當(dāng)DBWR將檢查點隊列里面的臟數(shù)據(jù)塊寫入到數(shù)據(jù)文件后,檢查點的位置也要相應(yīng)地往后移,CKPT每三秒會在控制文件中記錄檢查點的位置,以表示Instance Recovery時開始恢復(fù)的日志條目,這個概念稱為檢查點的“心跳”(heartbeat)。檢查點位置發(fā)生變更后,Oracle里面通過4個參數(shù)用于控制檢查點位置和最后的重做日志條目之間的距離。在這里面需要指出的是,多數(shù)人會將這4個參數(shù)看作控制增量檢查點發(fā)生的時間。事實上這是錯誤的,這4個參數(shù)是用于控制檢查點隊列里面的條目數(shù)量,而不是控制檢查點的發(fā)生。
(1)fast_start_io_target
該參數(shù)用于表示數(shù)據(jù)庫發(fā)生Instance Recovery的時候需要產(chǎn)生的IO總數(shù),它通過v$filestat的AVGIOTIM來估算的。比如我們一個數(shù)據(jù)庫在發(fā)生Instance Crash后需要在10分鐘內(nèi)恢復(fù)完畢,假定OS的IO每秒為500個,那么這個數(shù)據(jù)庫發(fā)生Instance Recovery的時候大概將產(chǎn)生500*10*60=30,000次IO,也就是我們將可以把fast_start_io_target設(shè)置為30000。
(2)fast_start_mttr_target
我們從上面可以看到fast_start_io_target來估算檢查點位置比較麻煩。Oracle為了簡化這個概念,從9i開始引入了fast_start_mttr_target這么一個參數(shù),用于表示數(shù)據(jù)庫發(fā)生Instance Recovery的時間,以秒為單位。這個參數(shù)我們從字面上也比較好理解,其中的mttr是mean time to recovery的簡寫,如上例中的情況我們可以將fast_start_mttr_target設(shè)置為600。當(dāng)設(shè)置了fast_start_mttr_target后,fast_start_io_target這個參數(shù)將不再生效,從9i后fast_start_io_target這個參數(shù)被Oracle廢除了。
(3)log_checkpoint_timeout
該參數(shù)用于表示檢查點位置和重做日志文件末尾之間的時間間隔,以秒為單位,默認情況下是1800秒。
(4)log_checkpoint_interval
該參數(shù)是表示檢查點位置和重做日志末尾的重做日志塊的數(shù)量,以O(shè)S塊表示。
(5)90% OF SMALLEST REDO LOG
除了以上4個初始化參數(shù)外,Oracle內(nèi)部事實上還將重做日志文件末尾前面90%的位置設(shè)為檢查點位置。在每個重做日志中,這么幾個參數(shù)指定的位置可能不盡相同,Oracle將離日志文件末尾最近的那個位置確認為檢查點位置。
4、SMON進程:該進程實例啟動時,執(zhí)行實例恢復(fù),還負責(zé)清理不再使用的臨時段。在具有并行服務(wù)器選項的環(huán)境下,SMON對有故障CPU或?qū)嵗M行實例恢復(fù)。SMON進程有規(guī)律地被呼醒,檢查是否需要,或者其它進程發(fā)現(xiàn)需要時可以被調(diào)用。
5、PMON進程:該進程在用戶進程出現(xiàn)故障時執(zhí)行進程恢復(fù),負責(zé)清理內(nèi)存儲區(qū)和釋放該進程所使用的資源。例:它要重置活動事務(wù)表的狀態(tài),釋放封鎖,將該故障的進程的ID從活動進程表中移去。PMON還周期地檢查調(diào)度進程(DISPATCHER)和服務(wù)器進程的狀態(tài),如果已死,則重新啟動(不包括有意刪除的進程)。
PMON有規(guī)律地被呼醒,檢查是否需要,或者其它進程發(fā)現(xiàn)需要時可以被調(diào)用。
6、RECO進程:該進程是在具有分布式選項時所使用的一個進程,自動地解決在分布式事務(wù)中的故障。一個結(jié)點RECO后臺進程自動地連接到包含有懸而未決的分布式事務(wù)的其它數(shù)據(jù)庫中,RECO自動地解決所有的懸而不決的事務(wù)。任何相應(yīng)于已處理的懸而不決的事務(wù)的行將從每一個數(shù)據(jù)庫的懸掛事務(wù)表中刪去。
當(dāng)一數(shù)據(jù)庫服務(wù)器的RECO后臺進程試圖建立同一遠程服務(wù)器的通信,如果遠程服務(wù)器是不可用或者網(wǎng)絡(luò)連接不能建立時,RECO自動地在一個時間間隔之后再次連接。
RECO后臺進程僅當(dāng)在允許分布式事務(wù)的系統(tǒng)中出現(xiàn),而且DISTRIBUTED C TRANSACTIONS參數(shù)是大于0。
7、ARCH進程:該進程將已填滿的在線日志文件拷貝到指定的存儲設(shè)備。當(dāng)日志是為ARCHIVELOG使用方式、并可自動地歸檔時ARCH進程才存在。
8、LCKn進程:是在具有并行服務(wù)器選件環(huán)境下使用,可多至10個進程(LCK0,LCK1……,LCK9),用于實例間的封鎖。
9、Dnnn進程(調(diào)度進程):該進程允許用戶進程共享有限的服務(wù)器進程(SERVER PROCESS)。沒有調(diào)度進程時,每個用戶進程需要一個專用服務(wù)進程(DEDICATEDSERVER PROCESS)。對于多線索服務(wù)器(MULTI-THREADED SERVER)可支持多個用戶進程。如果在系統(tǒng)中具有大量用戶,多線索服務(wù)器可支持大量用戶,尤其在客戶_服務(wù)器環(huán)境中。
在一個數(shù)據(jù)庫實例中可建立多個調(diào)度進程。對每種網(wǎng)絡(luò)協(xié)議至少建立一個調(diào)度進程。數(shù)據(jù)庫管理員根據(jù)操作系統(tǒng)中每個進程可連接數(shù)目的限制決定啟動的調(diào)度程序的最優(yōu)數(shù),在實例運行時可增加或刪除調(diào)度進程。多線索服務(wù)器需要SQL*NET版本2或更后的版本。在多線索服務(wù)器的配置下,一個網(wǎng)絡(luò)接收器進程等待客戶應(yīng)用連接請求,并將每一個發(fā)送到一個調(diào)度進程。如果不能將客戶應(yīng)用連接到一調(diào)度進程時,網(wǎng)絡(luò)接收器進程將啟動一個專用服務(wù)器進程。該網(wǎng)絡(luò)接收器進程不是Oracle實例的組成部分,它是處理與Oracle有關(guān)的網(wǎng)絡(luò)進程的組成部分。在實例啟動時,該網(wǎng)絡(luò)接收器被打開,為用戶連接到Oracle建立一通信路徑,然后每一個調(diào)度進程把連接請求的調(diào)度進程的地址給予它的接收器。當(dāng)一個用戶進程作連接請求時,網(wǎng)絡(luò)接收器進程分析請求并決定該用戶是否可使用一調(diào)度進程。如果是,該網(wǎng)絡(luò)接收器進程返回該調(diào)度進程的地址,之后用戶進程直接連接到該調(diào)度進程。有些用戶進程不能調(diào)度進程通信(如果使用SQL*NET以前的版本的用戶),網(wǎng)絡(luò)接收器進程不能將此用戶連接到一調(diào)度進程。在這種情況下,網(wǎng)絡(luò)接收器建立一個專用服務(wù)器進程,建立一種合適的連接。

文章題目:ORACLE體系結(jié)構(gòu),很詳細
路徑分享:http://bm7419.com/article20/jdehjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、定制開發(fā)、移動網(wǎng)站建設(shè)App開發(fā)、外貿(mào)建站、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)