前面我們說過,Oracle的執行個體由記憶體結構和一組背景進程組成。Oracle的後台進程比較重要的包括以下幾個:
·SMON
·PMON
·DBWR
·LGWR
·ARCH
·CKPT
下面我們將逐一介紹各個進程的作用。
一、SMON
SMON(System Monitor)-系統監控進程,在執行個體啟動時執行執行個體恢複,並負責清理不再使用的臨時段。
SMON進程要完成所有“系統級”任務。PMON感興趣的是單個的進程,而SMON與之不同,它以系統級為出發點,這是一種資料庫“垃圾收集器”。SMON所做的工作包括:
·清理臨時空間
·合并空閑空間
·針對原來停用檔案恢複活動的事務
·執行RAC中失敗節點的執行個體恢複
·清理OBJ$
·收縮復原段
·“離線”復原段
二、PMON
PMON (進程監控程式)後台進程清除失敗使用者的進程,釋放使用者當時正在使用的資源。PMON負責釋放鎖並使其可以被其他使用者使用。同SMON一樣,PMON周期性地喚醒檢測它是否需要被使用。
PMON負責在出現異常中止的串連之後完成清理-釋放資源,復原未提交的事務工作
PMON還負責監視其他的Oracle後台進程,並在必要時重啟這些後台進程。
PMON還會為執行個體做另外一件事,這就是向Oracle TNS監聽器註冊這個執行個體。
三、DBWR
DBWR (資料庫寫入程式)後台進程負責管理資料區塊緩衝區及字典緩衝區的內容。它以批方式把修改塊從SGA寫到資料檔案中。
儘管每一個資料庫執行個體只有一個SMON和一個PMON進程在運行,但是根據平台和作業系統的不同,使用者可以同時擁有多個DBWR進程。
DBWn會寫出緩衝區快取中的髒塊,通常是為了在緩衝中騰出更多的空間(釋放緩衝區來讀入其他資料),或者是為了推進檢查點(將線上重做記錄檔中的位置前移,如果出現失敗,Oracle會從這個位置開始獨取來恢複執行個體。)
可以看到,DBWn的效能可能很重要。如果它寫出塊的速度不夠快,不能很快地釋放緩衝區,就會看到Free Buffer Waits和Write Complete Waits的等待數和等待時間開始增長。可以配置多個DBWn;實際上可以配置多達20個的DBWn。
最好的情況下,DBWn使用非同步I/O將塊寫至磁碟。採用非同步I/O,DBWn會收集一批要寫的塊,並把它們交給作業系統。DBWn並不等待作業系統真正將塊寫出;而是立即返回,並收集下一批要寫的塊。當作業系統完成寫操作時,它會非同步地通知DBWn寫操作已經完成。這樣,與所有的操作都串列進行相比,DWBn可以更快地工作。
根據定義,塊寫入器進程會把塊寫出到所有磁碟,即分散到各個磁碟上;也就是說,DBWn會做大量的分散寫。執行一個更新時,你會修改多處儲存的索引塊,還可能修改隨機地分布到磁碟上的資料區塊。另一方面,LGWR則是向重做日誌完成大量的順序寫。這是一個很重要的區別。
分散寫比順序寫慢多了。通過在SGA中緩衝髒塊,並由LGWR進程完成大規模順序寫,這樣可以提升效能。DBWn在後台完成它的任務(很慢),而LGWR在使用者等待時完成自己的任務(這個任務比較快),這樣我們就能夠得到更好的整體效能。
四、LGWR
LGWR(日誌寫入程式)後台進程負責把聯機重做日誌緩衝區的內容寫入聯機重做記錄檔。
LGWR分批將日誌條目寫入聯機重做記錄檔。重做日誌緩衝區條目總是包含著資料庫的最新狀態,這是因為DBWR進程可以一直等待到把資料區塊緩衝區中的修改資料區塊寫入到資料檔案中。
LGWR是資料庫正常操作時唯一向聯機重做記錄檔寫入內容並從重做日誌緩衝區直接讀取內容的進程。與DBWR對資料檔案執行的完全隨機訪問相反,聯機重做記錄檔以序列形式寫入。如果聯機重做記錄檔是鏡像檔案, LGWR同時向鏡像記錄檔中寫內容。
對於Oracle 8,可以建立多個LGWR I/O從進程以改善向聯機重做記錄檔的寫入效能,其個數由資料庫的init.ora檔案的LGWR _IO_SL AVES參數決定。在Oracle 8 i中,這個參數已不能用, LGWR I/O從進程由DBWR _ IO _SLAVES設定值派生而來。
如果滿足以下某個條件,LGWR進程就會把重做日誌緩衝區的內容重新整理輸出到磁碟上:
·每3秒鐘會重新整理輸出一次
·任何事務發出一個提交時
·重做日誌緩衝區1/3滿,或者已經包含1MB的緩衝資料
由於這些原因,分配超大的重做日誌緩衝區並不實際,Oracle根本不可能完全使用這個緩衝區。
五、ARCH
LGWR後台進程以迴圈方式向聯機重做記錄檔寫入;當填滿第一個記錄檔後,就開始向第二個記錄檔寫入;第二個記錄檔填滿後,再向第三個記錄檔寫入。一旦最後一個重做記錄檔填滿, LGWR就開始重寫第一個重做記錄檔的內容。
當Oracle以ARCHIVELOG (歸檔日誌)模式運行時,資料庫在開始重寫重做記錄檔之前先對其進行備份。這些歸檔的重做記錄檔通常寫入一個磁碟裝置中。也可以直接寫入磁帶裝置中,但是這往往要增加操作員的勞動強度。
這種歸檔功能由ARCH (歸檔進程)後台進程完成,利用該效能的資料庫在處理大資料事務時將遇到重做日誌磁碟衝突問題,這是因為當LGWR準備寫入一個重做記錄檔時, ARCH正準備讀取另一個。如果歸檔日誌目標磁碟寫滿,資料庫還將遇到資料庫鎖定問題。此時,ARCH凍結,禁止LGW R寫入;從而禁止在資料庫中出現進一步的交易處理;這種情況一起延續到歸檔重做記錄檔的空間清空為止。
線上重做日誌(LGWR)用於在出現電源故障(執行個體中止)時“修正”資料檔案,而歸檔重做日誌則不同,它是在出現硬碟故障時用於“修正”資料檔案。
ARCH通常將線上重做記錄檔複製到至少兩個位置(冗餘正是不遺失資料的關鍵所在!)。這些位置可能是本地機器上的磁碟,或者更確切地講,至少有一個在另一台機器上,以應付災難性失敗。
六、CKPT
CKPT (檢查點進程)用來減少執行執行個體恢複所需的時間。檢查點使DBWR把上一個檢查點以後的全部已修改資料區塊寫入資料檔案,並更新資料檔案頭部和控制檔案以記錄該檢查點。
當一個聯機重做記錄檔被填滿時,檢查點進程會自動出現。可以用資料庫執行個體的init.ora檔案中的LOG_CHECKPOINT_INTERVAL參數來設定一個頻繁出現的檢查點。
注意:
檢查點進程並不像它的名字所暗示的那樣,真的建立檢查點--建立檢查點是主要是DBWn的任務。CKPT只是更新資料檔案的檔案首部,以輔助真正建立檢查點的進程(DBWn)。
註:本文所有內容均摘自CSDN網友方友松的技術Blog(作者的Blog地址為:http://blog.csdn.net/truexf/)
以及Tom kyte的《Oracle9i&10g編程藝術》人民郵電出版社