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