對(duì)于一門技術(shù)的學(xué)習(xí),尤其是像Oracle database這種知識(shí)體系極其龐雜的技術(shù)來(lái)講,從宏觀上了解其體系結(jié)構(gòu)是至關(guān)重要的。同時(shí),個(gè)人認(rèn)為,未必是專業(yè)DBA人員才需要了解其體系結(jié)構(gòu)(固然對(duì)于數(shù)據(jù)庫(kù)專業(yè)人員來(lái)講,這些都是必備知識(shí)了),一般的技術(shù)人員如果對(duì)其有較深入的了解,也是大有益處的,畢竟技術(shù)思想很多時(shí)候都是相通的嘛。本文就從不同維度,如Oracle的內(nèi)存結(jié)構(gòu),進(jìn)程結(jié)構(gòu),存儲(chǔ)結(jié)構(gòu)等方面做相應(yīng)描述。
目錄
一、什么是Oracle數(shù)據(jù)庫(kù)?
二、交互流程
三、實(shí)例內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu)
四、Oracle存儲(chǔ)結(jié)構(gòu)
五、總結(jié)
首先我們來(lái)說(shuō)說(shuō)基礎(chǔ)的概念吧
眾所周知,Oracle DataBase是一款關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(不了解何謂關(guān)系型數(shù)據(jù)庫(kù)的童鞋自行g(shù)oogle,baidu),同類的產(chǎn)品還有MySQL,sqlServer等,很多時(shí)候,我們會(huì)把那個(gè)承載我們核心數(shù)據(jù)的系統(tǒng)籠統(tǒng)地成為數(shù)據(jù)庫(kù)服務(wù)器,但從嚴(yán)格意義上來(lái)講Oracle DataBase是由兩個(gè)部分組成:
實(shí)例:實(shí)例是數(shù)據(jù)庫(kù)啟動(dòng)時(shí)初始化的一組進(jìn)程和內(nèi)存結(jié)構(gòu)
數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)則指的是用戶存儲(chǔ)數(shù)據(jù)的一些物理文件
正因?yàn)槿绱宋覀円话悴艜?huì)說(shuō) 關(guān)閉和啟動(dòng)實(shí)例,加載卸載數(shù)據(jù)庫(kù),就是這個(gè)道理。
從實(shí)例和數(shù)據(jù)庫(kù)的概念上來(lái)看,我們能知道,實(shí)例暫時(shí)的,它不過(guò)是一組邏輯劃分的內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu),它會(huì)隨著數(shù)據(jù)庫(kù)的關(guān)閉而消失,而數(shù)據(jù)庫(kù)它其實(shí)就是一堆物理文件(控制文件,數(shù)據(jù)文件,日志文件等等),它是永久存在的(除非磁盤損壞)。數(shù)據(jù)庫(kù)和實(shí)例通常是一對(duì)一的,這種結(jié)構(gòu)我們成為單實(shí)例體系結(jié)構(gòu);當(dāng)然還有一些復(fù)雜的分布式的結(jié)構(gòu),一個(gè)數(shù)據(jù)庫(kù)可以對(duì)多個(gè)實(shí)例,像Oracle的RAC(有興趣的童鞋可以了解下)。
下面是從網(wǎng)上找的一張圖,描述了單實(shí)例體系結(jié)構(gòu)大致的交互流程
1.用戶和用戶進(jìn)程交互
用戶進(jìn)程可以是一般的客戶端軟件,像Oracle的sqlplus,sql developer,或者是一些驅(qū)動(dòng)程序等等都屬于用戶進(jìn)程。
2.用戶進(jìn)程和服務(wù)器進(jìn)程交互
服務(wù)器進(jìn)程有時(shí)會(huì)稱為前臺(tái)進(jìn)程,當(dāng)然是相對(duì)于后臺(tái)進(jìn)程(后面會(huì)提到的數(shù)據(jù)庫(kù)寫入器,日志寫入器等)來(lái)說(shuō)的,服務(wù)器進(jìn)程的主要作用就是處理連接到當(dāng)前實(shí)例的用戶進(jìn)程的請(qǐng)求,對(duì)客戶端發(fā)來(lái)的sql進(jìn)行執(zhí)行并返回執(zhí)行結(jié)果。在專有服務(wù)器結(jié)構(gòu)中,用戶進(jìn)程和服務(wù)器進(jìn)程是一對(duì)一的,也就是說(shuō),當(dāng)監(jiān)聽(tīng)程序監(jiān)聽(tīng)到客戶端來(lái)了一個(gè)請(qǐng)求,會(huì)為其分配一個(gè)對(duì)應(yīng)的服務(wù)器進(jìn)程。還有一種結(jié)構(gòu)為共享服務(wù)器,這種結(jié)構(gòu)就不是一個(gè)用戶進(jìn)程對(duì)應(yīng)一個(gè)服務(wù)器進(jìn)程了,會(huì)通過(guò)調(diào)度程序進(jìn)行協(xié)調(diào)處理,關(guān)于共享服務(wù)器連接,本文就不在贅述了。
上面描述了一些我們?cè)谶M(jìn)行數(shù)據(jù)庫(kù)連接操作的時(shí)候,大致的交互流程是什么樣的。下面,我們就來(lái)看看Oracle 的實(shí)例內(nèi)存結(jié)構(gòu)
(由于內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu)關(guān)系較緊密,進(jìn)程會(huì)作用到對(duì)應(yīng)的內(nèi)存區(qū)域,比如數(shù)據(jù)庫(kù)寫入器作用到數(shù)據(jù)庫(kù)緩沖區(qū)緩存中,日志寫入器會(huì)作用到日志緩沖區(qū),所以內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu)會(huì)相互配合地進(jìn)行描述)
oracle實(shí)例內(nèi)存結(jié)構(gòu)由兩部分組成SGA(系統(tǒng)全局區(qū))和PGA(用戶全局區(qū))組成,SGA是一塊共享的內(nèi)存區(qū)域,也是最大的一塊內(nèi)存區(qū)域;PGA則是用戶會(huì)話專有的內(nèi)存區(qū)域,每個(gè)會(huì)話在服務(wù)器端都有一塊專有的內(nèi)存區(qū)域就是PGA。本文主要對(duì)SGA進(jìn)行分析描述。SGA組成如下
數(shù)據(jù)庫(kù)緩沖區(qū)緩存&數(shù)據(jù)庫(kù)寫入器
緩沖區(qū)緩存 是Oracle用來(lái)執(zhí)行sql 的工作區(qū)域,在更新數(shù)據(jù)時(shí),用戶會(huì)話不會(huì)直接去更新磁盤上的數(shù)據(jù),想想,如果允許這么做,那么頻繁的磁盤IO對(duì)于系統(tǒng)性能的影響是毀滅性的。所以,實(shí)際的處理流程是這樣的:
select ename,salary from emp where name='東方不敗';
我們來(lái)看這么一條簡(jiǎn)單的查詢語(yǔ)句,oracle是如何處理的。首先,當(dāng)用戶提交了該條sql語(yǔ)句,由對(duì)應(yīng)的用戶進(jìn)程(比如我們常用的sql developer)將其發(fā)送給服務(wù)器,監(jiān)聽(tīng)程序監(jiān)聽(tīng)到該條請(qǐng)求,會(huì)為其建立一個(gè)對(duì)應(yīng)的服務(wù)器進(jìn)程,然后服務(wù)器進(jìn)程會(huì)先掃描緩沖區(qū)中有沒(méi)有包含關(guān)鍵行("東方不敗")的數(shù)據(jù)塊,如果有,這就算一次緩存命中了,然后相關(guān)行會(huì)傳輸?shù)絇GA進(jìn)行進(jìn)一步處理,最終經(jīng)過(guò)格式化后展示給用戶;如果沒(méi)有命中,那么服務(wù)器進(jìn)程會(huì)首先將對(duì)應(yīng)行復(fù)制到緩沖區(qū)內(nèi),然后再返回給客戶端。
DML(insert,update,delete)操作同理,加入用戶發(fā)送一條update語(yǔ)句,服務(wù)進(jìn)程依然先去掃描緩沖區(qū),如果緩存命中,則直接更新,數(shù)據(jù)變臟;如果沒(méi)有命中,由服務(wù)器進(jìn)程將對(duì)應(yīng)數(shù)據(jù)塊先從磁盤上復(fù)制到緩沖區(qū)內(nèi),再進(jìn)行更新操作。
臟緩沖區(qū)
如果緩沖區(qū)存儲(chǔ)的塊和磁盤上的塊不一致,該緩沖區(qū)就叫做“臟緩沖區(qū)”,臟緩沖區(qū)最終會(huì)由數(shù)據(jù)庫(kù)寫入器(DBWn)寫入到磁盤中去。
數(shù)據(jù)庫(kù)寫入器(DBWn)
數(shù)據(jù)庫(kù)寫入器是Oracle的一個(gè)后臺(tái)進(jìn)程,所謂后臺(tái)進(jìn)程是相對(duì)于前臺(tái)進(jìn)程(服務(wù)器進(jìn)程)來(lái)講的。DBWn的"n"意味著一個(gè)實(shí)例是可以有多個(gè)數(shù)據(jù)庫(kù)寫入器的。
作用:簡(jiǎn)而言之,DBWn的作用就是將變臟了的緩沖區(qū)從數(shù)據(jù)庫(kù)緩沖區(qū)緩存中寫入到磁盤中的數(shù)據(jù)文件中去。
數(shù)據(jù)庫(kù)緩沖區(qū)緩存這塊內(nèi)存區(qū)域和數(shù)據(jù)庫(kù)寫入器這塊是比較重要的概念,別的數(shù)據(jù)庫(kù)產(chǎn)品像mySql也都有對(duì)應(yīng)的實(shí)現(xiàn),只不過(guò)叫法不一樣罷了。了解這塊的時(shí)候,要時(shí)刻意識(shí)到會(huì)話是不會(huì)直接更新磁盤數(shù)據(jù)的,會(huì)話的更新,插入,刪除包括查詢等都是先作用到緩沖區(qū)上,隨后,DBWn會(huì)將其中的臟緩沖區(qū)轉(zhuǎn)儲(chǔ)到磁盤上去。
DBWn什么時(shí)候?qū)懭耄?/h3>
DBWn是個(gè)比較懶的進(jìn)程,它會(huì)盡可能少的進(jìn)行寫入,在以下四種情況它會(huì)執(zhí)行寫入:
a.沒(méi)有任何可用緩沖區(qū)(不得不寫啊)
b.臟緩沖區(qū)過(guò)多
c.3秒超時(shí)(最晚3秒會(huì)執(zhí)行一次寫入)
d.遇到檢查點(diǎn),即checkPoint(檢查點(diǎn)),檢查點(diǎn)是個(gè)Oracle事件,遇到檢查點(diǎn),DBWn會(huì)執(zhí)行寫入。比如實(shí)例有序關(guān)閉的時(shí)候會(huì)有檢查點(diǎn),DBWn會(huì)將所有臟緩沖區(qū)寫入到磁盤上去的,這很容易理解,要保持?jǐn)?shù)據(jù)文件的一致性。
注意:
從上述DBWn的幾個(gè)寫入時(shí)機(jī),我們能意識(shí)到,DBWn的寫入不是直接依賴于會(huì)話的更新操作的。不是一有臟緩沖區(qū),它就執(zhí)行寫入。而且,DBWn執(zhí)行寫入跟commit操作也沒(méi)有任何關(guān)系,不要以為commit操作的影響結(jié)果會(huì)實(shí)時(shí)流入到磁盤中去。
DBWn采用極懶算法進(jìn)行寫入,原因我們應(yīng)該要清楚:頻繁的磁盤IO對(duì)系統(tǒng)的壓力很大,如果DBWn很積極地去寫入磁盤,那對(duì)系統(tǒng)性能的影響就太大了,換個(gè)角度想,如果DBWn很勤快的寫磁盤,那么數(shù)據(jù)庫(kù)緩沖區(qū)存在的意義也就不大了。
當(dāng)然,講到這兒,我們可能會(huì)意識(shí)到一個(gè)問(wèn)題,DBWn如此懶地進(jìn)行數(shù)據(jù)轉(zhuǎn)儲(chǔ),如果在某一時(shí)刻,數(shù)據(jù)庫(kù)緩沖區(qū)緩存內(nèi)存在著大量的臟緩沖區(qū)(生產(chǎn)環(huán)境中,這是常態(tài)),也就是有大量的未commit和已commit的數(shù)據(jù)還在內(nèi)存中,沒(méi)有持久化到磁盤中,然后突然系統(tǒng)斷電了,這種情況下,數(shù)據(jù)是不是就丟掉了?數(shù)據(jù)當(dāng)然不會(huì)丟失,這就引出了重做日志(redo log)的概念,接下來(lái),我們就來(lái)談?wù)剬?duì)應(yīng)重做日志的內(nèi)存結(jié)構(gòu)和后臺(tái)進(jìn)程。
日志緩沖區(qū)&日志寫入器
當(dāng)我們執(zhí)行一些DML操作(insert,update,delete),數(shù)據(jù)塊發(fā)生改變了,產(chǎn)生的變更向量則會(huì)寫入到重做日志文件中去。有了這些記錄,當(dāng)系統(tǒng)由于斷電等因素突然宕掉,數(shù)據(jù)庫(kù)緩沖區(qū)緩存內(nèi)的大量臟數(shù)據(jù)還沒(méi)來(lái)得及寫入到數(shù)據(jù)文件中去,在重新啟動(dòng)的時(shí)候,會(huì)有一個(gè)實(shí)例恢復(fù)的過(guò)程,在此過(guò)程中就應(yīng)用了重做日志記錄來(lái)使數(shù)據(jù)保持一致;或者數(shù)據(jù)庫(kù)遭遇了物理?yè)p壞,比如磁盤損壞了,此時(shí)可以通過(guò)Oracle的備份恢復(fù)工具(如RMAN)進(jìn)行數(shù)據(jù)恢復(fù),原理就是 提取備份集-->應(yīng)用重做日志文件中的變更記錄。
日志緩沖區(qū)
日志緩沖區(qū)是一塊比較小的內(nèi)存區(qū)域,它是用來(lái)短期存儲(chǔ)將寫入到磁盤中的重做日志文件中的變更向量的。
日志緩沖區(qū)存在的意義依然是為了減少磁盤IO,減少用戶的等待時(shí)間,試想下,如果每一次用戶DML操作都要進(jìn)行等待重做記錄被寫入到磁盤中去,體驗(yàn)會(huì)有多差勁。
日志寫入器(LGWR)
顧名思義,日志寫入器(LGWR)就是把日志緩沖區(qū)內(nèi)的內(nèi)容寫入到磁盤的重做日志文件中去,相比數(shù)據(jù)庫(kù)寫入器(DBWn),日志寫入器就勤快多了。
以下三種情況LGWR會(huì)執(zhí)行寫入:
a.commit時(shí)寫入
前面提過(guò),DBWn的寫入和commit沒(méi)有任何關(guān)系,如果commit時(shí)數(shù)據(jù)庫(kù)沒(méi)有任何記錄,那數(shù)據(jù)就真的丟失了,Oracle 的重做日志就是為了保證數(shù)據(jù)安全而存在的,commit時(shí),會(huì)話會(huì)先掛起,等待LGWR將這些記錄寫入到磁盤上的重做日志文件中,才會(huì)通知用戶提交完成。所以,LGWR在commit時(shí)執(zhí)行寫入,是為了確保事務(wù)永不丟失。
b.日志緩沖區(qū)的占用率達(dá)到1/3。
c.DBWn要寫入臟緩沖區(qū)前
這個(gè)寫入是為了數(shù)據(jù)回滾考慮的。DBWn完全可能寫入還沒(méi)提交的事務(wù)(參照上面提到的寫入時(shí)機(jī)),那如何保證事務(wù)回滾呢?
首先要知道,DBWn除了寫入實(shí)際的數(shù)據(jù),還會(huì)寫入撤銷數(shù)據(jù)(不了解的同學(xué)可參考我的另一篇博文中對(duì)于撤銷段的描述 Oracle閃回技術(shù)詳解。)簡(jiǎn)單說(shuō),事務(wù)回滾需要撤銷數(shù)據(jù),在寫入撤銷數(shù)據(jù)前,會(huì)先寫入針對(duì)撤銷數(shù)據(jù)的日志記錄(有點(diǎn)繞),若用戶要進(jìn)行事務(wù)回滾,就可以應(yīng)用這些日志記錄來(lái)構(gòu)造撤銷數(shù)據(jù),然后進(jìn)行回滾。
我們對(duì)這兩塊最重要的內(nèi)存區(qū)域和對(duì)應(yīng)的后臺(tái)進(jìn)程做個(gè)總結(jié):
數(shù)據(jù)庫(kù)緩沖區(qū)緩存和日志緩沖區(qū)都是為了提高性能,避免頻繁IO而存在的。日志緩沖區(qū)相比數(shù)據(jù)庫(kù)緩沖區(qū)緩存要小的多,并且不能進(jìn)行自動(dòng)管理,對(duì)于日志緩沖區(qū)的修改需要重啟實(shí)例,數(shù)據(jù)庫(kù)緩沖區(qū)緩存可進(jìn)行自動(dòng)管理。作用在數(shù)據(jù)庫(kù)緩沖區(qū)緩存上的DBWn進(jìn)程,為了避免頻繁的磁盤IO導(dǎo)致系統(tǒng)性能下降,會(huì)盡可能少地執(zhí)行寫入,且DBWn的寫入和commit操作沒(méi)有任何關(guān)系;
而作用在日志緩沖區(qū)上的LGWR進(jìn)程,則會(huì)非常積極地進(jìn)行寫入,一般情況下,它幾乎是實(shí)時(shí)地將重做日志記錄轉(zhuǎn)儲(chǔ)到磁盤中去。LGWR是Oracle體系結(jié)構(gòu)中最大的瓶頸之一。DML的速度不可能超過(guò)LGWR將變更向量寫入磁盤的速度。
我們?cè)趤?lái)看下其他的內(nèi)存區(qū)域和后臺(tái)進(jìn)程
共享池
共享池是最復(fù)雜的SGA結(jié)構(gòu),它有許多子結(jié)構(gòu),我們來(lái)看看常見(jiàn)的幾個(gè)共享池組件:
1.庫(kù)緩存:庫(kù)緩存這塊內(nèi)存區(qū)域會(huì)按已分析的格式緩存最近執(zhí)行的代碼,這樣,同樣的sql代碼多次執(zhí)行的時(shí)候,就不用重復(fù)地去進(jìn)行代碼分析,可以很大程度上提高系統(tǒng)性能。
2.數(shù)據(jù)字典緩存:存儲(chǔ)oracle中的對(duì)象定義(表,視圖,同義詞,索引等數(shù)據(jù)庫(kù)對(duì)象),這樣在分析sql代碼的時(shí)候,就不用頻繁去磁盤上讀取數(shù)據(jù)字典中的數(shù)據(jù)了
3.PL/SQL區(qū):緩存存儲(chǔ)過(guò)程、函數(shù)、觸發(fā)器等數(shù)據(jù)庫(kù)對(duì)象,這些對(duì)象都存儲(chǔ)在數(shù)據(jù)字典中,通過(guò)將其緩存到內(nèi)存中,可以在重復(fù)調(diào)用的時(shí)候提高性能。
大池:大池是個(gè)可選的內(nèi)存區(qū)域,前面我們提到專有服務(wù)器連接和共享服務(wù)器連接,如果數(shù)據(jù)庫(kù)采用了共享服務(wù)器連接模式,則要使用到大池;RMAN(Oracle的高級(jí)備份恢復(fù)工具)備份數(shù)據(jù)也需要大池。
JAVA池
Oracle 的很多選項(xiàng)使用java寫的,Java池用作實(shí)例化Java對(duì)象所需的堆空間
流池
從重做日志中提取變更記錄的進(jìn)程 和 應(yīng)用變更記錄的進(jìn)程會(huì)用到流池(如實(shí)例不正常關(guān)閉,譬如斷電導(dǎo)致實(shí)例關(guān)閉,在重啟時(shí),Oracle會(huì)自動(dòng)執(zhí)行實(shí)例恢復(fù)過(guò)程,在此過(guò)程需要提取重做日志記錄和應(yīng)用重做日志兩個(gè)動(dòng)作)
以上列舉了Oracle常見(jiàn)的內(nèi)存結(jié)構(gòu),要注意的是,上面列舉的內(nèi)存區(qū)域,除了日志緩沖區(qū)是固定的,不能動(dòng)態(tài)調(diào)整也不能進(jìn)行自動(dòng)管理外,其他內(nèi)存區(qū)域都可以進(jìn)行動(dòng)態(tài)調(diào)整,也可以進(jìn)行自動(dòng)管理。
在說(shuō)說(shuō)Oracle 的幾個(gè)后臺(tái)進(jìn)程(DBWn和LGWR較重要,前面已做了了解,在此不再贅述)
SMON(System Monitor):安裝和打開(kāi)數(shù)據(jù)庫(kù),實(shí)例恢復(fù)也是由此進(jìn)程完成的
PMON(Process Monitor):進(jìn)程監(jiān)視器,主要監(jiān)視服務(wù)器進(jìn)程。前面提到過(guò),專有服務(wù)器體系模式下,用戶進(jìn)程和服務(wù)器進(jìn)程是一對(duì)一的關(guān)系,如果某個(gè)會(huì)話發(fā)生異常,PMON會(huì)銷毀對(duì)應(yīng)的服務(wù)器進(jìn)程,回滾未提交的事務(wù),并回收會(huì)話專有的PGA內(nèi)存區(qū)域。
CKPT(Checkpoint Process):CKPT負(fù)責(zé)發(fā)起檢查點(diǎn)信號(hào),手動(dòng)設(shè)置檢查點(diǎn)的語(yǔ)法:
SQL>alter system checkpoint;
檢查點(diǎn)可強(qiáng)制DBWn寫入臟緩沖區(qū),當(dāng)數(shù)據(jù)庫(kù)崩潰后,由于大量臟緩沖區(qū)未寫入數(shù)據(jù)文件,在重新啟動(dòng)時(shí),需要由SMON進(jìn)行實(shí)例恢復(fù),實(shí)例恢復(fù)需要提取和應(yīng)用重做日志記錄,提取的位置就是從上次檢查點(diǎn)發(fā)起的位置開(kāi)始的(檢查點(diǎn)之前的數(shù)據(jù)已經(jīng)被強(qiáng)制寫入到數(shù)據(jù)文件中去了),這個(gè)位置稱為RBA(redo byte address),CKPT會(huì)不斷將這個(gè)位置更新到控制文件中去(以確定實(shí)例恢復(fù)需要從哪兒開(kāi)始提取日志記錄)。
MMON(Manageability Monitor)
數(shù)據(jù)庫(kù)的自我監(jiān)視和自我調(diào)整的支持進(jìn)程。實(shí)例在運(yùn)行中,會(huì)收集大量有關(guān)實(shí)例活動(dòng)和性能的統(tǒng)計(jì)數(shù)據(jù),這些數(shù)據(jù)會(huì)收集到SGA中,MMON定期從SGA中捕獲這些統(tǒng)計(jì)數(shù)據(jù),并將其寫入到數(shù)據(jù)字典中,便于后續(xù)對(duì)這些快照進(jìn)行分析。(默認(rèn)情況,MMON每隔一個(gè)小時(shí)收集一次快照)
ARCn(Archiver)
歸檔進(jìn)程,這個(gè)進(jìn)程是可選的,如果數(shù)據(jù)庫(kù)配置為歸檔模式,這個(gè)進(jìn)程就是必須的。所謂歸檔,就是將重做日志文件永久保存(生產(chǎn)庫(kù)一般都會(huì)配置為歸檔模式)到歸檔日志文件中。歸檔日志文件和重做日志文件作用是一樣的,只不過(guò)重做日志文件會(huì)不短被重寫,而歸檔日志文件則保留了關(guān)于數(shù)據(jù)更改的完整的歷史記錄。
至此,Oracle基礎(chǔ)的內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu)我們已大概了解,來(lái)看下完成的進(jìn)程和內(nèi)存的交互情況,可以根據(jù)前面的理解將整個(gè)交互流程串聯(lián)一下。
針對(duì)Oracle存儲(chǔ)結(jié)構(gòu)將分別從物理存儲(chǔ)結(jié)構(gòu)和邏輯存儲(chǔ)結(jié)構(gòu)兩個(gè)維度來(lái)進(jìn)行闡述。
物理存儲(chǔ)結(jié)構(gòu)
所謂外部文件,意味著這些文件從嚴(yán)格意義上來(lái)講并不屬于Oracle數(shù)據(jù)庫(kù)的一部分。
控制文件:
控制文件雖小,但作用重大,它包含指向數(shù)據(jù)庫(kù)其余部分的指針(包括重做日志文件,數(shù)據(jù)文件,歸檔日志文件等的位置),存儲(chǔ)重要的序列號(hào)和時(shí)間戳,存儲(chǔ)RMAN備份的詳細(xì)信息。控制文件一旦受損,那實(shí)例會(huì)立馬終止,一般對(duì)數(shù)據(jù)文件的保護(hù)采用多路復(fù)用機(jī)制,就是冗余多份在不同物理位置。
重做日志文件
重做日志文件的作用在講解內(nèi)存和進(jìn)程結(jié)構(gòu)的時(shí)候有提到過(guò),重做日志按時(shí)間順序存儲(chǔ)應(yīng)用于數(shù)據(jù)庫(kù)的一連串的變更向量(包含聯(lián)機(jī)重做日志文件和歸檔日志文件)。由SMON在數(shù)據(jù)庫(kù)啟動(dòng)時(shí)自動(dòng)執(zhí)行的實(shí)例恢復(fù) 和 磁盤損壞所要求的提取備份恢復(fù)都會(huì)應(yīng)用到重做日志進(jìn)行相應(yīng)的數(shù)據(jù)恢復(fù)
重做日志文件也建議進(jìn)行多路復(fù)用,一個(gè)數(shù)據(jù)庫(kù)至少要有兩組重做日志文件。一組供LGWR進(jìn)行寫入,日志文件是固定大小,業(yè)務(wù)高峰期會(huì)很快寫滿,寫滿之后會(huì)切換到第二組上,在配置為歸檔模式的數(shù)據(jù)庫(kù)中,這時(shí)由歸檔進(jìn)程(ARCn)開(kāi)始將第一組的內(nèi)容進(jìn)行歸檔備份,如此循環(huán)地進(jìn)行寫入和歸檔。需要注意的是,在歸檔進(jìn)程還未對(duì)當(dāng)前組的日志歸檔完畢前,是不允許LGWR對(duì)其進(jìn)行重寫的。
數(shù)據(jù)文件
數(shù)據(jù)文件存儲(chǔ)著實(shí)際的數(shù)據(jù),DBWn會(huì)將數(shù)據(jù)庫(kù)緩沖區(qū)中的內(nèi)容寫入到這類文件中去,數(shù)據(jù)文件的大小和數(shù)量是不受限制的。Oracle從10g開(kāi)始,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)至少需要兩個(gè)數(shù)據(jù)文件,一個(gè)用于SYSTEM表空間,該表空間用來(lái)存儲(chǔ)數(shù)據(jù)字典;一個(gè)用于SYSAUX表空間,這個(gè)表空間用來(lái)存儲(chǔ)一些數(shù)據(jù)字典的輔助數(shù)據(jù)。
數(shù)據(jù)文件由一個(gè)個(gè)的Oracle塊組成,這是Oracle的I/O基礎(chǔ)單元,與操作系統(tǒng)塊是不同的概念,Oracle塊要比操作系統(tǒng)塊大,這當(dāng)然有處于性能的一些考慮,但我們考慮這樣一種情況,當(dāng)用戶使用操作系統(tǒng)命令進(jìn)行數(shù)據(jù)文件的備份的時(shí)候(假設(shè)1個(gè)Oracle塊=8個(gè)操作系統(tǒng)塊),已經(jīng)復(fù)制了4個(gè)操作系統(tǒng)塊,然后CPU被DBWn搶占了,DBWn又重新對(duì)這個(gè)Oracle塊進(jìn)行了更新,這時(shí),當(dāng)復(fù)制命令又得到了CPU時(shí)間去復(fù)制剩余的4個(gè)塊的時(shí)候,就造成了整個(gè)Oracle塊的數(shù)據(jù)不一致,所以,這也是在執(zhí)行這種備份(用戶自行備份)的時(shí)候,需要做一些額外處理,比如將表空間置為備份模式的原因。當(dāng)然,使用RMAN是不存在這樣的問(wèn)題的,RMAN的備份機(jī)制是肯定可以得到數(shù)據(jù)一致的塊的。(這塊內(nèi)容作了解即可)
對(duì)于數(shù)據(jù)文件的保護(hù),一般可進(jìn)行定期備份,或者使用RAID也可以。
實(shí)例參數(shù)文件
這個(gè)文件存儲(chǔ)了數(shù)據(jù)庫(kù)所需的一些參數(shù)設(shè)置,比如各個(gè)內(nèi)存區(qū)域的大小,可允許的最大進(jìn)程數(shù),最大會(huì)話數(shù),控制文件的位置,數(shù)據(jù)庫(kù)的名稱等等,參數(shù)文件也是實(shí)例啟動(dòng)時(shí)首先要加載的文件。
口令文件
一般稱為外部口令文件。一般的用戶名和口令是存放在數(shù)據(jù)字典中,不會(huì)存放在這個(gè)文件中。在一些特殊場(chǎng)景下,比如實(shí)例還未啟動(dòng),這時(shí),我可能需要以管理員的身份登入系統(tǒng)去執(zhí)行一些恢復(fù)或者啟動(dòng)操作,然而此時(shí),數(shù)據(jù)字典由于實(shí)例還沒(méi)啟動(dòng)是不存在的,這時(shí)就需要外部口令文件進(jìn)行用戶身份的驗(yàn)證。
歸檔日志文件
ARCn將聯(lián)機(jī)重做日志文件會(huì)備份歸檔到這類文件中去,歸檔日志文件保留了數(shù)據(jù)更改的完整歷史信息。
邏輯存儲(chǔ)結(jié)構(gòu)
Oracle將其物理結(jié)構(gòu)從邏輯存儲(chǔ)結(jié)構(gòu)中抽象出來(lái),物理機(jī)構(gòu)是系統(tǒng)管理員能看到的,邏輯結(jié)構(gòu)則是用戶所能感知到的。比較典型的邏輯結(jié)構(gòu)就是 "段"和"表空間"。
段:
段就是包含所有數(shù)據(jù)的邏輯結(jié)構(gòu),比較典型的段就是"表",稱為表段,還有索引段,撤銷段等等。
表空間
表空間從邏輯上是多個(gè)段的結(jié)合,在物理上是多個(gè)數(shù)據(jù)文件的集合,相當(dāng)于在段和數(shù)據(jù)文件的對(duì)應(yīng)中加入了一個(gè)中間層來(lái)解決這種多對(duì)多的關(guān)系。
在早期的一些數(shù)據(jù)庫(kù)設(shè)計(jì)中,段和數(shù)據(jù)文件是一對(duì)一的關(guān)系,一個(gè)段一個(gè)數(shù)據(jù)文件,這種設(shè)計(jì)有很多弊端,首先,段的數(shù)量是不固定的,有可能一個(gè)系統(tǒng)中上千張表,那就得需要上千個(gè)數(shù)據(jù)文件,系統(tǒng)管理員要管理這么多文件肯定會(huì)抓狂的;還有一種情況就是某些歷史表可能特別大,大到底層系統(tǒng)對(duì)單個(gè)文件的限制,用一個(gè)數(shù)據(jù)文件去承載的話肯定是不行的。表空間則完美解決了這樣的問(wèn)題。
還有一些邏輯結(jié)構(gòu)如區(qū)間和Oracle塊(Oracle塊前面有提到過(guò),區(qū)間則為塊的集合),下面通過(guò)一張圖對(duì)Oracle的存儲(chǔ)結(jié)構(gòu)進(jìn)行整體的宏觀的認(rèn)識(shí),進(jìn)一步加深些理解
本文博主對(duì)Oracle的體系結(jié)構(gòu)做了相對(duì)全面的介紹,包括內(nèi)存結(jié)構(gòu),進(jìn)程結(jié)構(gòu),存儲(chǔ)結(jié)構(gòu)等等,相信大家對(duì)其全貌也有了基本的了解。
本文作者:chengxiao
原文地址: https://www.cnblogs.com/chengxiao/p/5904783.html
本文分享自微信公眾號(hào) - 有關(guān)SQL(SQLHub)