詳解Oracle實例內(nèi)存結(jié)構(gòu)和進程結(jié)構(gòu)
由于內(nèi)存結(jié)構(gòu)和進程結(jié)構(gòu)關(guān)系較緊密,進程會作用到對應(yīng)的內(nèi)存區(qū)域,比如數(shù)據(jù)庫寫入器作用到數(shù)據(jù)庫緩沖區(qū)緩存中,日志寫入器會作用到日志緩沖區(qū),所以在這里我把內(nèi)存結(jié)構(gòu)和進程結(jié)構(gòu)會相互配合地進行描述~
Oracle實例內(nèi)存結(jié)構(gòu)的組成結(jié)構(gòu):

實例內(nèi)存結(jié)構(gòu)
oracle實例內(nèi)存結(jié)構(gòu)由兩部分組成SGA(系統(tǒng)全局區(qū))和PGA(用戶全局區(qū))組成,SGA是一塊共享的內(nèi)存區(qū)域,也是***的一塊內(nèi)存區(qū)域;PGA則是用戶會話專有的內(nèi)存區(qū)域,每個會話在服務(wù)器端都有一塊專有的內(nèi)存區(qū)域就是PGA。
SGA組成

篇幅有限,下面對數(shù)據(jù)庫緩沖區(qū)、日志緩沖區(qū)、共享池做主要介紹
數(shù)據(jù)庫緩沖區(qū)緩存

通過指定 DB_CACHE_SIZE 參數(shù)的值,可以配置緩沖區(qū)高速緩存。緩沖區(qū)高速緩存可存放數(shù)據(jù)文件中塊大小為 DB_BLOCK_SIZE 的數(shù)據(jù)塊的副本。緩沖區(qū)高速緩存是 SGA 的一部分;因此所有用戶都可以共享這些塊。 緩沖區(qū)緩存 是Oracle用來執(zhí)行sql 的工作區(qū)域,在更新數(shù)據(jù)時,用戶會話不會直接去更新磁盤上的數(shù)據(jù),想想,如果允許這么做,那么頻繁的磁盤IO對于系統(tǒng)性能的影響是毀滅性的。所以,實際的處理流程是這樣的:
select ename,salary from emp where name='阿里巴巴';
首先,當用戶提交了該條sql語句,由對應(yīng)的用戶進程(比如我們常用的sql developer)將其發(fā)送給服務(wù)器,監(jiān)聽程序監(jiān)聽到該條請求,會為其建立一個對應(yīng)的服務(wù)器進程,然后服務(wù)器進程會先掃描緩沖區(qū)中有沒有包含關(guān)鍵行("阿里巴巴")的數(shù)據(jù)塊,如果有,這就算一次緩存***了,然后相關(guān)行會傳輸?shù)絇GA進行進一步處理,最終經(jīng)過格式化后展示給用戶;如果沒有***,那么服務(wù)器進程會首先將對應(yīng)行復(fù)制到緩沖區(qū)內(nèi),然后再返回給客戶端。
DML(insert,update,delete)操作同理,加入用戶發(fā)送一條update語句,服務(wù)進程依然先去掃描緩沖區(qū),如果緩存***,則直接更新,數(shù)據(jù)變臟;如果沒有***,由服務(wù)器進程將對應(yīng)數(shù)據(jù)塊先從磁盤上復(fù)制到緩沖區(qū)內(nèi),再進行更新操作。
臟緩沖區(qū)
如果緩沖區(qū)存儲的塊和磁盤上的塊不一致,該緩沖區(qū)就叫做“臟緩沖區(qū)”,臟緩沖區(qū)最終會由數(shù)據(jù)庫寫入器(DBWn)寫入到磁盤中去。
數(shù)據(jù)庫寫入器(DBWn)
數(shù)據(jù)庫寫入器是Oracle的一個后臺進程,所謂后臺進程是相對于前臺進程(服務(wù)器進程)來講的。DBWn的"n"意味著一個實例是可以有多個數(shù)據(jù)庫寫入器的。
作用:簡而言之,DBWn的作用就是將變臟了的緩沖區(qū)從數(shù)據(jù)庫緩沖區(qū)緩存中寫入到磁盤中的數(shù)據(jù)文件中去。
數(shù)據(jù)庫緩沖區(qū)緩存這塊內(nèi)存區(qū)域和數(shù)據(jù)庫寫入器這塊是比較重要的概念,別的數(shù)據(jù)庫產(chǎn)品像mySql也都有對應(yīng)的實現(xiàn),只不過叫法不一樣罷了。了解這塊的時候,要時刻意識到會話是不會直接更新磁盤數(shù)據(jù)的,會話的更新,插入,刪除包括查詢等都是先作用到緩沖區(qū)上,隨后,DBWn會將其中的臟緩沖區(qū)轉(zhuǎn)儲到磁盤上去。
DBWn什么時候?qū)懭?
DBWn是個比較懶的進程,它會盡可能少的進行寫入,在以下四種情況它會執(zhí)行寫入:
a.沒有任何可用緩沖區(qū)(不得不寫啊)
b.臟緩沖區(qū)過多
c.3秒超時(最晚3秒會執(zhí)行一次寫入)
d.遇到檢查點,即checkPoint(檢查點),檢查點是個Oracle事件,遇到檢查點,DBWn會執(zhí)行寫入。比如實例有序關(guān)閉的時候會有檢查點,DBWn會將所有臟緩沖區(qū)寫入到磁盤上去的,這很容易理解,要保持數(shù)據(jù)文件的一致性。
日志緩沖區(qū)

重做日志緩沖區(qū)是一個循環(huán)緩沖區(qū);服務(wù)器進程可以用新條目覆蓋重做日志緩沖區(qū)中已寫入磁盤的條目。LGWR 進程的寫速度通常都很快,足以確保緩沖區(qū)中始終有存儲新條目的空間。LGWR 進程將重做日志緩沖區(qū)寫入磁盤上的活動聯(lián)機重做日志文件(或活動組成員)中。LGWR 進程將 LGWR 上次寫入磁盤以來進入緩沖區(qū)的所有重做條目復(fù)制到磁盤。
當我們執(zhí)行一些DML操作(insert,update,delete),數(shù)據(jù)塊發(fā)生改變了,產(chǎn)生的變更向量則會寫入到重做日志文件中去。有了這些記錄,當系統(tǒng)由于斷電等因素突然宕掉,數(shù)據(jù)庫緩沖區(qū)緩存內(nèi)的大量臟數(shù)據(jù)還沒來得及寫入到數(shù)據(jù)文件中去,在重新啟動的時候,會有一個實例恢復(fù)的過程,在此過程中就應(yīng)用了重做日志記錄來使數(shù)據(jù)保持一致;或者數(shù)據(jù)庫遭遇了物理損壞,比如磁盤損壞了,此時可以通過Oracle的備份恢復(fù)工具(如RMAN)進行數(shù)據(jù)恢復(fù),原理就是 提取備份集-->應(yīng)用重做日志文件中的變更記錄。
日志緩沖區(qū)
日志緩沖區(qū)是一塊比較小的內(nèi)存區(qū)域,它是用來短期存儲將寫入到磁盤中的重做日志文件中的變更向量的。
日志緩沖區(qū)存在的意義依然是為了減少磁盤IO,減少用戶的等待時間,試想下,如果每一次用戶DML操作都要進行等待重做記錄被寫入到磁盤中去,體驗會有多差勁。
日志寫入器(LGWR)
顧名思義,日志寫入器(LGWR)就是把日志緩沖區(qū)內(nèi)的內(nèi)容寫入到磁盤的重做日志文件中去,相比數(shù)據(jù)庫寫入器(DBWn),日志寫入器就勤快多了。
以下三種情況LGWR會執(zhí)行寫入:
a.commit時寫入
前面提過,DBWn的寫入和commit沒有任何關(guān)系,如果commit時數(shù)據(jù)庫沒有任何記錄,那數(shù)據(jù)就真的丟失了,Oracle 的重做日志就是為了保證數(shù)據(jù)安全而存在的,commit時,會話會先掛起,等待LGWR將這些記錄寫入到磁盤上的重做日志文件中,才會通知用戶提交完成。所以,LGWR在commit時執(zhí)行寫入,是為了確保事務(wù)永不丟失。
b.日志緩沖區(qū)的占用率達到1/3。
c.DBWn要寫入臟緩沖區(qū)前
共享池

共享池是最復(fù)雜的SGA結(jié)構(gòu),大小通過 SHARED_POOL_SIZE 指定。
常見的幾個共享池組件:
1.庫緩存:庫緩存這塊內(nèi)存區(qū)域會按已分析的格式緩存最近執(zhí)行的代碼,這樣,同樣的sql代碼多次執(zhí)行的時候,就不用重復(fù)地去進行代碼分析,可以很大程度上提高系統(tǒng)性能。
2.數(shù)據(jù)字典緩存:存儲oracle中的對象定義(表,視圖,同義詞,索引等數(shù)據(jù)庫對象),這樣在分析sql代碼的時候,就不用頻繁去磁盤上讀取數(shù)據(jù)字典中的數(shù)據(jù)了
3.PL/SQL區(qū):緩存存儲過程、函數(shù)、觸發(fā)器等數(shù)據(jù)庫對象,這些對象都存儲在數(shù)據(jù)字典中,通過將其緩存到內(nèi)存中,可以在重復(fù)調(diào)用的時候提高性能。
作為DBA,以上內(nèi)容是必須掌握的,如果大家有興趣的話可以多了解下這方面內(nèi)容~















 
 
 


 
 
 
 