ORACLE體系結構總結

一、ORACLE體系結構組成

ORACLE體系結構主要分為:記憶體結構、程序結構、儲存結構。記憶體結構主要由SGA和PGA構成;程序結構主要由使用者程序和ORACLE程序組成;儲存結構主要由邏輯儲存和物理儲存構成。

ORACLE體系結構總結

二、ORACLE記憶體結構

1、SGA系統全域性區是Oracle Instance的基本組成部分,在例項啟動時分配。是一組包含一個Oracle例項的資料和控制資訊的共享記憶體結構。主要是用於儲存資料庫資訊的記憶體區,該資訊為資料庫程序所共享(PGA不能共享的)。它包含Oracle 伺服器的資料和控制資訊,它是在Oracle伺服器所駐留的計算機的實際記憶體中得以分配,如果實際記憶體不夠再往虛擬記憶體中寫。

2、PGA是一塊包含一個服務程序的資料和控制資訊的記憶體區域。你每啟動一個數據庫程序就會在記憶體中建立一個pga,它是獨有的,非共享。

三、SGA概述

系統全域性區是資料服務中例項的必要組成部分,由很多小記憶體區共同構成,各個小記憶體區存放不同的資訊,系統全域性區用於暫存可以被所有程序( 服務程序和後臺程序 )共享的資訊,對系統的執行效能有好處,SGA在例項啟動的時候自動分配 ,例項關閉時自動釋放。SGA暫存系統的大量共享資料,對系統性能影響很大,所以需要為SGA選擇適當的管理方式。

1、共享池(Shared Pool)

(1)資料字典快取區(Data Dictionary Cache)

用於存放SQL語句相關的資料檔案、表、索引、列、使用者、其他的資料物件的定義和許可權資訊等。

(2)庫快取區(Librabry Cache)

該區域存放共享SQL和PL/SQL程式碼。伺服器程序在執行語句時,首先會匹配庫快取,如果存在相同語句則無需編譯直接使用已編譯的執行計劃。繫結變數不是在編譯階段賦值的,而是在執行階段賦值的,因此含有繫結變數的SQL語句可以不用重新編譯。

(3)SQL和PL/SQL結果快取

2、大池(Large Pool)

大池是個可選的記憶體區域,可提供一個大的緩衝區供資料庫的備份與恢復操作過程使用。資料庫的備份恢復、執行具有大量排序操作的SQL語句、並行化的資料庫操作時可能需要用到大池。

3、Java池(Java Pool)

JAVA池在資料庫中支援JAVA 的執行,存放JAVA程式碼和JAVA語句的語法分析表

4、流池(Stream Pool)

用於快取流程序在資料庫間移動/複製資料時使用的佇列訊息。一般從重做日誌中提取變更記錄的程序和應用變更記錄的程序會用到流池。

5、資料庫快取區(Database Buffer Cache)

用於快取當前或最近使用的從磁碟讀取的資料塊的複製,來最佳化資料庫的I/O減少物理讀/寫。Oralce依據LRU演算法對該記憶體區域進行block-level的更新。LRU演算法(簡單理解就是最近最小使用的資料調出記憶體)。

(1)髒快取快(Dirty buffers)

資料被修改過並且已經commit但是還未寫入磁碟的資料快取塊,髒快取塊最終被DBWn程序寫入到磁碟的資料檔案中永久儲存。

(2)命中快取塊(Pinned buffers)

最近正在被訪問的快取塊,始終被保留在資料快取記憶體中,不會被寫入資料檔案。

(3)空閒快取塊(Free buffers)

該快取塊中沒有資料,等待被寫入資料。oracle從資料檔案中讀取資料後,尋找空閒快取塊,以便寫入其中。

6、日誌緩衝區(Redo Log Buffer)

日誌緩衝區是一塊比較小的記憶體區域,它是用來短期儲存將寫入到磁碟中的重做日誌資訊。日誌緩衝區也是為了減少磁碟IO,減少使用者的等待時間。

四、PGA

PGA是指單個伺服器程序或者單個後臺程序所需的資料和控制資訊。PGA是在使用者程序連線到資料庫並建立一個會話時自動分配。該區域內保留每個與oracle資料庫連線的使用者程序所需的記憶體,當一個使用者會話結束,PAG就會釋放。排序區

1、排序區

當用戶需要對資料進行排序時,系統會將需要排序的資料儲存到PGA中的排序區內,然後在這個排序區內對這些資料進行排序。如果發現使用者的很多操作都需要用到排序,那麼為使用者設定比較大的排序區,可以提高使用者訪問資料的效率。

2、會話區

會話區儲存了會話所具有的許可權、角色、效能統計等資訊,通常都是由資料庫系統自我維護。

3、 堆疊區

儲存著繫結變數、會話變數、SQL語句執行時的記憶體結構等重要的資訊,通常都是由資料庫系統自我維護

4、遊標區

遊標區是一個動態的區域,當用戶執行遊標語句開啟遊標時,系統會在PGA中建立遊標區,當關閉遊標時,這個區域就會被釋放。建立與釋放需要佔用一定的系統資源,花費一定的時間,如果頻繁的開啟和關閉遊標,就會降低語句的執行效能。

五、程序結構

1、SMON

系統監視器程序,負責開啟資料庫時候的恢復、整理資料庫表(段)空間的碎片等。它透過驗證所有資料檔案和聯機重做日誌檔案來開啟資料庫。資料庫狀態置為open之後,SMON的主要工作內容就放在各種內部任務上,如合併空閒空間,處理表(段)空間碎片。

2、PMON

程序監視器程序,負責監視所有伺服器程序,並且檢查連線會話中的問題。如果會話異常中止,PMON會及時銷燬對應的伺服器程序,將PGA記憶體返回給系統空閒記憶體池,並回滾所有未提交的事務。

3、DBWn

資料庫寫程序,它主要負責將Database Buffer Cache中的髒緩衝區寫入資料檔案,做持久化。這裡需要再次宣告,資料庫寫程序DBWn是不受我們commit影響的,我們commit影響的是日誌寫程序LGWR。DBWn選擇要寫入的髒緩衝區的原則是:最近最少使用。也就是說,DBWn將最近最少使用的髒緩衝區寫入資料檔案。

以下四種情況,DBWn將執行寫操作:

(1)沒有可用的緩衝區

當資料被讀取到Database Buffer Cache時,需要先查詢空閒的緩衝區,也就是說既不髒也沒被佔用的緩衝區。如果長時間找不到空閒緩衝區,那麼DBWn就會將某些髒緩衝區寫入磁碟。完成之後,就有可用的空閒緩衝區了。

(2)髒緩衝區過多

第二種情況是髒緩衝區過多,這個多是由Oracle一個內部值決定的。

(3)每三秒鐘(三秒鐘超時)

第三種情況,三秒鐘超時。DBWn每三秒鐘會對一些緩衝區進行寫操作。前面兩種情況是強制寫,而三秒鐘超時意味著即使沒有髒緩衝區,也要DBWn也要執行一次清理。

(4)遇到檢查點

前面三種情況是部分寫入(稱為增量檢查點或提高增量檢查點位置),最後這種情況是全部寫入,把所有的髒緩衝區全部寫入資料檔案。前三種情況是在Oracle執行過程中自動執行的,不會給系統的I/O造成比較大的壓力。但是在執行檢查點的情況下,可能同時有非常大量的髒緩衝區需要寫入磁碟,所以當時的磁碟I/O會到達頂峰,CPU使用率很可能會爆高到100%。因此,一般在不得已的時候才使用檢查點:

4、LGWR

日誌寫程序,負責將日誌緩衝區Log Buffer中的內容寫入到磁碟的聯機(重做)日誌檔案中,這個寫入的過程稱為“日誌緩衝區轉儲”。當我們對資料做任何更改時(包括增刪改),這個更改會寫入到兩個緩衝區,一個是Database Buffer Cache ,用於寫入到資料檔案;另一個是Redo Log Buffer,用於寫入聯機重做日誌檔案。為了防止丟失更改,LGWR程序幾乎實時地將Redo Log Buffer寫入到聯機重做日誌檔案中。當我們commit時,會話掛起,LGWR執行寫入操作,寫入完成,事務標記為不可callback的已提交返回給會話,會話重新可用。

(1)會話發出commit

保證了已提交commit的事務中的所有變更都可以在聯機重做日誌中記錄,這是資料庫資料不丟失的保證。如果資料庫損壞,可以在還原上一次備份的基礎上,利用自上次備份以來的(歸檔)聯機重做日誌進行事務重做。當然,commit的事務會重新寫入資料檔案,未提交的事務不會持久化儲存。

(2)日誌緩衝區1/3滿

日誌緩衝區三分之一滿的時候,也會使LGWR執行寫操作。一般來說日誌緩衝區只有MB級大小,應用程式(比如JAVA程式)會在不到一秒的時間生成足以充滿1/3的重做內容(更改),所以說,LGWR會幾乎實時地執行寫操作。此後,在會話發出commit命令的時候,由於沒有太多要一次性寫入到日誌中的內容,所以commit也幾乎是實時完成的。

(3)DBWn要寫入資料檔案

為了防止瞬間斷電等突發情況的發生而導致資料的不一致,DBWn在寫入資料檔案之前要執行日誌寫操作,因為日誌寫操作能提供資料在沒有寫入資料檔案情況下的資料可恢復性。另外由於DBWn的寫操作是有三秒鐘超時的,而日誌寫操作必須要在DBWn之前執行一次,所以LGWR也就有了三秒鐘超時的觸發條件。

5、CKPT

執行CKPT程序會使得DBWn進行寫操作。CKPT不再必須執行完全檢查點,但是它必須跟蹤重做日誌中的增量檢查點位置。在必要的時候,CKPT會執行增量檢查點,以使得增量檢查點的位置前移。增量檢查點位置是發生故障時,重做開始的位置。CKPT使用當前檢查點位置去重新整理控制檔案。

6、MMON

可管理性監視器程序,以前也叫Memory Monitor,記憶體監視器程序用於支援Oracle資料庫的自我管理和自我調整的程序,簡單地理解為“監視器的監視器”。

7、MMAN

MMAN,Memory Manager,記憶體管理程序,支援記憶體分配的自動管理。有了這個程序,我們DBA只需要去設定總的記憶體大小,SGA以及PGA等,MMAN會在DBA設定的總體大小範圍內進行自動分配。

8、LREG

偵聽器註冊程序,它註冊了有關資料庫例項和Oracle網路監聽排程程式的資訊。這樣,使用者就可以透過偵聽器連線到資料庫。同時LREG還能根據工作負載與效能資訊更新偵聽器,這在多例項環境下是比較智慧的。之前這個功能是由PMON來實現的。

9、ARCn

它將聯機重做日誌檔案的內容寫入到歸檔日誌檔案中。由於聯機重做日誌檔案只有那麼幾組,每組幾個檔案,每個檔案就幾兆,它們會頻繁地被重新整理,不可能保留長期且完整的重做條目,所以,為了保證可恢復性,必須在聯機重做日誌檔案被重新整理前將其歸檔。如果啟用了歸檔模式,ARCn將會啟動,一旦ARCn異常,資料庫例項將會掛起。ARCn最多有30個,命名為ARC1~ARC30。

10、RECO

RECO,Recoverer,恢復程序。它是在分散式架構下,解決分散式事務失敗問題的程序。

ORACLE體系結構總結