2020年8月12日 星期三

4.3 Oracle Background Process

Oracle Instance 在啟動的過程中,除了向作業系統獲取需要的資源外,另外也同時產生運行 Instance 所必需的 Background Process。隨著 Oracle 資料庫版本日新月異,新功能推陳出新,使得 Instance 初始所產生的 Background Process 也越來越多,但其中有五個 Background Process 是 Oracle 資料庫的根本,這五個 Background Process 缺一不可,只要其中一個異常,便會造成資料庫無法運行,這五個 Background Process 分別為: SMON (System Monitor Process)、PMON (Process Monitor Process) 、DBWn (Database Writer Process) 、LGWR (Log Writer Process) ,CKPT (Checkpoint Process)。其功能說明如下:


SMON (System Monitor Process):

 SMON 主要的任務有兩個,其一為當資料庫異常中止或未經正常程序關閉時,下次重新啟動就必須要進行 Instance Recovery,而這個工作就是交由 SMON 來執行;另外一項任務就是負責回收資料庫所使用完畢的 Temporary Segment,例如 SQL Statement 所進行的排序行為、或是使用 Temporary Table 進行操作,這些作業結束後都會交由 SMON 來回收 Temporary Segment。


PMON (Process Monitor Process):

 PMON 顧名思義就是用來監控 Process 的狀態,當 user process 異常終止時,PMON 會將未完成的交易進行 rollback,同時清理此 process 所使用的 buffer cache 並且釋放此 process 所佔用的資源,例如釋放 process 所佔用的 lock;此外,若是於 sqlnet 有設定 session timeout,PMON 也會定期檢查 idle session 是否已達到所設定的 timeout 時間。PMON 的最後一項任務則是將資料庫服務註冊到 Listener 上,但這項任務於 Oracle 12c 之後已被另一個 process LREG (Listener Registration Process) 所取代。


DBWn (Database Writer Process):

 DBWn 的 “n” 代表數字,表示 Database Writer Process 可以有多個,由參數 db_writer_processes 設定,此參數設定完畢後資料庫需重新啟動才會生效,例如 db_writer_processes=4,則 Database Writer Process 會有四個 DBW0~DBW3。DBWn 主要的任務是將資料庫的 Dirty Buffer 寫入磁碟當中,資料庫在運行的過程當中,為了提高效能,資料庫上的操作都盡可能的使用記憶體 (Buffer),不論是讀取或是寫入,當讀取資料時,首先會從記憶體中尋找是否有此筆資料,如果沒有的話再從磁碟讀取,而這筆讀取過的資料便會佔存在記憶體中供下次的讀取;同理當資料有新增或更新時,也會將新的資料佔存在記憶體中,此時記憶體中存放的資料與磁碟上存放的資料就會有不一致的情形,而這不一致的資料便稱做 Dirty Buffer。當 DBWn 要寫入 Dirty Buffer 之前,會先去檢查 Redo Log 於上個 checkpoint 到這個 checkpoint 之中有哪些交易,確認哪些資料是屬於 Dirty Buffer,確認完畢後再將其寫入 Disk。


LGWR (Log Writer Process):

 LGWR 主要的任務是將 Log Buffer 中的交易訊息寫入到 Redo Log,符合下列事件時便會觸發 LGWR:交易進行 commit 時、Log Buffer 1/3 滿、每 3 秒鐘,DBWn 要寫入 Dirty Buffer 時。由於 DBWn 需於 Redo Log 確認 Dirty Buffer,因此在這之前 LGWR 必須先將 Log Buffer 中的交易寫入 Redo Log,這樣才能使得 DBWn 獲得正確的資訊。


CKPT (Checkpoint Process):

 CKPT 主要的任務是用來更新資料庫的 SCN (System Change Number)。SCN 由一串數字所組成,此數字由資料庫自行維護並且累積遞增,主要的功能是用來確保資料庫所有的檔案在某個時間點,其內容都是一致的。SCN 主要存放於 Control file 以及每個 Datafile 的 file header 中,Control file 存放的是 System SCN 與每個 Datafile 的 SCN,而 Datafile 的 file header 則是只存放此 Datafile 的 SCN,當資料庫正常關閉時,所有檔案的 SCN 都會更新為一致才將資料庫關閉;同理在資料庫啟動時也會檢查是否所有檔案的 SCN 均為一致才會將資料庫啟動,若有不一致的情形,此時資料庫就必須進行 recovery 的動作了。


隨著 Oracle 資料庫版本的更新,資料庫所產生的 Background Process 也越來越多,例如 Oracle 10g 開始多了 AWR 、 ASH 與自動化記憶體管理功能,所以系統便多了 MMON、MMNL 與 MMAN 這些 Background Process 來運行這些功能。MMON 預設每 60 分鐘收集一次 AWR Data;MMNL 用來 Flush ASH Buffer 至 AWR,MMAN 則是當使用自動記憶體管理時,用來調配各 pool 的大小。但不論 Oracle 的版本如何演進,SMON、PMON、DBWn、LGWR,CKPT 這五個最根本的 Background Process 都是不會改變的。

沒有留言:

張貼留言