下面就來介紹一下這些在後台辛勤工作的進程們。系統檢測器(System Monitor,SMON)、進程監視器(Process Monitor,PMON)、數據庫寫入器(Database Writer,DBWn)、日志寫入器(Log Writer,LGWR)、檢查點進程(Checkpoint Process,CKPT)
1、SMON:安裝和打開數據庫。通過查找和驗證數據庫控制文件來安裝數據庫。此後,通過查找和驗證所有數據文件和聯機日志文件打開數據庫。一旦打開數據庫並使數據庫處於使用狀態,SMON就負責執行各種內部管理任務。
2、PMON:用戶會話是連接到服務器進程的用戶進程。服務器進程在會話創建時啟動,在繪畫結束時銷毀。如果會話正常結束,則用戶執行的任何工作都會有序完成,服務器進程將終止。如果非正常終止會話,PMON將銷毀服務器進程,將其PGA內存返回給操作系統,並回滾任何尚在進行的未提交完成的事務。
3、DBWn:會話不直接將數據寫入磁盤,而是寫入到數據庫高速緩存區。然後又數據庫寫入器負責將緩沖區寫入到磁盤。一般來說一個實例可能有多個寫入器。依次為DBW0,DBW1等。默認情況是8個CPU對應一個數據庫寫入器。
通常情況下,Oracle會盡可能的減少寫入緩沖區的數量。因為IO操作會降低性能。真實情況中,如果出現會話對某些緩沖區執行寫作,那麼通常還會有會話對其進行操作。這樣,就沒有必要將其寫入到磁盤了。
DBWn采用極懶算法執行寫入:盡可能少,在盡可能少。有四種情況需要進行些操作:沒有可用緩沖區、髒緩沖區過多、遇到三秒超時,遇到檢查點。
沒有可用緩沖區:服務器進程在將塊復制到高速緩沖區之前,需要查找可用緩沖區。可用緩沖區是既不髒也未被占用的緩沖區。如果查找可用緩沖區時間過長(Oracle內部自行設定),則會將髒緩沖區寫入到磁盤,以清理緩沖區。
髒緩沖區數量過多:在什麼情況下謂多,有Oracle的內部阈值確定,如果超過了,就會將一些緩沖區寫到磁盤
三秒超時:DBWn每三秒會對一些緩沖區清理一次。即使系統處於閒置狀態,也會清理緩沖區。
請求檢查點:遇到檢查點時,會寫入所有的緩沖區數據。此時系統性能下降。檢查點只有在不得已的情況下才會設置。關閉數據庫和關閉實例時會設置檢查點,也可以使用命令來設置。
在這裡需要注意一點,在會話提交事務時,DBWn什麼也不做,DBWn按照自己的方式執行。此時需要執行的操作是:寫入日志緩沖區的數據。
4、LGWR:日志寫入器將日志緩沖區的內容寫入到磁盤上的聯機日志文件中。當會話發出COMMIT時,LGWR會實時寫入:在LGWR將緩沖區寫入磁盤時,會話將會被掛起。在Oracle體系結構中,LGWR是最大的瓶頸之一。DML的速度不能超過LGWR將更改矢量寫入到磁盤的速度。在以下三種情況發生時,LGWR將轉儲日志緩沖區:
提交寫入時:已提交事務的每個更改矢量都可以再磁盤上的重做日志中得到,並可以再此後應用於數據文件備份。
日志緩沖區的占用率達到1/3:在應用程序中,通常在非常短的時間內就能填充滿日志緩沖區的1/3,這時強制LGWR將更改矢量准實時的寫入磁盤。此後,當會話發生COMMIT時,幾乎沒有什麼要寫入的內容:COMMIT可以立即完成。
DBWn需要將髒緩沖區從數據庫高速緩存區寫入到數據文件時:在DBWn執行寫入操作之前,總會執行LGWR的寫入操作。目的是:始終可以逆轉未提交的事務。DBWn可能會將未提交的事務寫入數據文件,如果能過獲取逆轉事務所需的數據和更改矢量,這樣做就不會產生問題。所以,在DBWn執行寫入之前,需要執行LGWR的寫入,以確保這些數據進入重做日志文件中。
5、CKPT:系統崩潰後,必須從重做日志提取與髒緩沖區對應的所有更改矢量,並將其應用於數據塊。這就是恢復過程。頻繁的檢查點確保:可以將髒緩沖區快速寫入磁盤,從而最大程度的減少崩潰發生後必須應用的重做量。在Oracle8i之後,采用增量檢查點機制,DBWn以固定速率寫出髒緩沖區,因此DBWn和LGWR之間始終有一個可以預見的差距。使用增量檢查點時系統性能更加平穩,恢復時間可以預測。
當然,在10g之後,Oracle又新增了幾個進程,這裡簡單介紹一下:
MMON:管理監視器(Maniageability Monitor),數據塊的自我監視和自我調整的支持進程。
MMNL:MMON的輔助進程。
MMAN:支持內存分布的自動調整。