Oracle 後臺程式 說明

xulongxc發表於2014-09-16

後臺程式

為了實現為多使用者提供服務且保證系統效能,在一個多程式 Oracle 系統(multiprocess Oracle system)中,存在多個被稱為後臺程式(background process)的 Oracle 程式。
一個 Oracle 例項中可以包含多種後臺程式,這些程式不一定全部出現在例項中。系統中執行的後臺程式數量眾多,使用者可以通過V$BGPROCESS 檢視查詢關於後臺程式的資訊。Oracle 例項中可能執行的後臺程式有:
·資料寫入程式(DBWn
·日誌寫入程式(LGWR
·檢查點程式(CKPT
·系統監控程式(SMON
·程式監控程式(PMON
·恢復程式(RECO
·作業佇列程式
·歸檔程式(ARCn
·佇列監控程式(QMNn
·其他後臺程式
在許多作業系統中,後臺程式在例項啟動時能夠被自動地建立。

圖示

下圖顯示了後臺程式如何與 Oracle 資料庫的各部分互動,後續將講述這些後臺程式。
多程式 Oracle 例項中的後臺程式
Oracle 後臺程式 說明
本圖中間為 SGA。上部為 RECOPMON,及 SMON 程式,其間的雙向箭頭表示各程式與例項間的通訊。下部左側為 DBW0 LGWR 程式,這兩個程式分別和資料快取區與重做日誌緩衝區進行通訊,同時還分別訪問資料檔案和重做日誌檔案。
本圖中還展示了一些其他程式,例如 ARC0,需要訪問離線儲存裝置和控制檔案;以及 CKPT,需要訪問資料檔案和控制檔案。

資料庫寫入程式(DBWn)

資料庫寫入程式database writer process (DBWn),將buffer中的內容寫入資料檔案中。DBWn程式負責將在buffer cache中的那些修改的buffer,也就是髒資料寫入磁碟中。
對於大多數系統來說,1個程式(DBW0)就足夠了,但也可以通過設定初始化引數DB_WRITER_PROCESSES,增加資料庫寫入程式,編號從DBW0-DBW9以及DBWa-DBWj,最多可以20個程式。但是前提是必須有足夠多的CPU供這些程式使用,在一個單CPU的系統中,額外地配置該程式並不能提高效能,所以需要根據CPU及處理器的個數決定如何設定該引數。
當一個buffer在資料庫的buffer cache中被修改了,就會被標記為髒資料(dirty)Buffer cache的冷端(cold buffer)是指根據LRU(least recently used)演算法選擇出的,最近最少使用的bufferDBWn程式將冷端的、髒的buffer寫入磁碟,這樣使用者程式就可以查詢冷端、乾淨的buffer用於將新的資料塊讀入cache中。當一個buffer被使用者程式修改(弄髒),此buffer就不再是free buffer,不能用於新資料的寫入。如果free buffer數量過少,使用者程式就會找不到足夠的空間用於資料寫入。而DBWn程式有效地管理了buffer cache,讓使用者程式總是能夠獲得free buffer
DBWn程式總是將冷端、髒buffer寫入磁碟,DBWn在改善查詢free buffer效能的同時,也另最近頻繁使用的buffer保留在記憶體中。例如,儲存那些頻繁訪問且較小的表或索引的資料塊,可以keepcache中,沒必要反覆地從磁碟中讀取。由於LRU演算法將訪問頻率高的資料塊保留在buffer cache中,所以一個buffer被寫入磁碟中,該buffer所包含的資料被馬上訪問的概率較小。
滿足以下條件時,DBWn程式會將髒資料緩衝區(dirty buffers)寫入磁碟:
·當伺服器程式掃描了一定數量的buffer之後,沒有找到乾淨的可用的buffer,它通知DBWn寫入。DBWnbuffer寫入磁碟的操作是非同步的,因為在DBWn工作的同時還有其他程式在執行。
·DBWn週期性地寫buffer,從而使得checkpoint前移,checkpoint是當一個例項需要例項恢復時,應用重做日誌的起始位置。這個位置是由buffer中最早的髒資料緩衝區(dirty buffers)決定的。
無論那種情況,DBWn程式都是批量(一次多資料塊)地寫入以提高效能。一次批量寫入的資料塊的數量隨作業系統的不同而改變,沒有固定值。

日誌寫入程式(LGWR)

         日誌寫入程式log writer process (LGWR)負責管理日誌緩衝區,將日誌緩衝區寫入磁碟上的日誌檔案。LGWR將從上次之後才複製到buffer中的重做條目寫入磁碟。
         日誌緩衝區(redo log buffer)是一個環形的緩衝區(circular buffer)。當LGWR程式將日誌緩衝區的重做條目寫入日誌檔案,伺服器程式同時也將新的條目複製到日誌緩衝區覆蓋那些已經寫入磁碟的條目。LGWR通常需要保證足夠快地寫入,即使在頻繁訪問redo log時也要確保緩衝區有足夠的空間用於寫入新的條目。
         LGWR將一部分連續的buffer寫入磁碟。LGWR寫入的內容有:
·一個使用者程式提交事務的提交記錄。
·Redo log buffer,以下3個條件,滿足其中一個就寫入。
·每三秒寫入一次。
·當日志緩衝區使用了三分之一。
·當DBWn程式向磁碟寫入髒緩衝區,但需要寫入的日誌還沒有寫入。
注意:
DBWn程式向磁碟寫入髒資料之前,所有與修改資料相關的重做記錄都必須被寫入磁碟,這就是先寫日誌原則(write-ahead protocol)。如果DBWn發現有一些重做記錄沒有寫入磁碟,會通知LGWR將它們寫入,並等待將LGWR程式將重做日誌緩衝區內的相關資料寫入磁碟後,才能將資料緩衝區寫入磁碟。
LGWR同步地向一個日誌組的多個映象成員寫入。如果其中的一個成員檔案損壞了,LGWR繼續向其他成員寫入,並將錯誤記錄到LGWR程式的trace檔案和alert log中。如果一個日誌組的所有成員檔案都損壞了,或者日誌組由於未歸檔而暫時不可用,那麼LGWR就無法繼續工作了。
         當使用者執行了一句commit時,LGWR將提交記錄放進日誌緩衝區,並且將它與事務的重做條目一起立即寫入磁碟。而相關的被修改的資料塊要等待更高效的時機時才寫入磁碟。這被成為快速提交(fast commit)機制。一個事務的提交記錄及相關的重做條目將通過一個原子性(atomic)的寫操作記錄到磁碟上,這個單一事件決定了事務是否被成功地提交。儘管此時被修改的資料緩衝區還沒有寫入磁碟,Oracle 已經能夠向使用者返回事務提交成功的資訊。
注意:
有時,如果重做日誌緩衝區內空間不足,LGWR 程式會在事務提交前就將重做日誌條目寫入磁碟。這樣的重做日誌條目只有在相關事務提交後才能永久地儲存。
         當一個使用者提交一個事務時,這個事務就被賦予了一個系統改變號system change number (SCN)Oracle 將在事務的重做條目中記錄此編號。SCN是被記錄在redo log中的,所以恢復(recovery)操作可以在RAC、分散式資料上同步地進行。
在資料修改操作較頻繁時,LGWR 程式能夠採取批量提交(group commits)技術向重做日誌檔案寫入資料。例如,當一個使用者提交了一個事務後,LGWR 程式會將此事務的重做條目(redo entry)寫入磁碟,與此同時系統中的其他使用者也可能在執行 COMMIT 語句。但是LGWR 程式需要在之前的寫入操作完成後,才能為後續的提交事務寫入重做資訊。當第一個事務的重做條目被寫入磁碟後,在此期間等待提交的事物的重做條目可以被一起寫入磁碟,這比分別寫入每個事務的重做條目所需的 I/O 操作要少。Oracle 通過這種辦法減少了磁碟 I/O 並提升了 LGWR 程式的效能。如果系統中的提交頻率一直很高,那麼 LGWR 程式每次從重做日誌緩衝區向磁碟的寫入資料中都包含多個提交事務的資訊。

檢查點程式(CKPT)

         當一個checkpoint發生時,Oracle必須更新所有資料檔案的檔案頭,記錄這個checkpoint的詳細資訊。這個動作是由CKPT程式完成的,但是CKPT程式並不將資料塊寫入磁碟,寫入的動作總是由DBWn 程式完成的。
         由企業管理器(Enterprise Manager) System_Statistics 監視器顯示的DBWR checkpoints統計資訊顯示了系統中需要完成的檢查點操作。

系統監控程式(SMON)

例項啟動時如有需要,系統監控程式(system monitor processSMON)將負責進行恢復(recovery)工作。此外,SMON 還負責清除系統中不再使用的臨時段(temporary segment),以及為資料字典管理的表空間(dictionary managed tablespace)合併相鄰的可用資料擴充套件(extent)。在例項恢復過程中,如果由於檔案讀取錯誤或所需檔案處於離線狀態而導致某些異常終止的事務未被恢復,SMON 將在表空間或檔案恢復聯機狀態後再次恢復這些事務。SMON程式定期檢查自己是否被需要,系統內的其他程式發覺需要時也能夠呼叫SMON 程式。
          RAC 環境中,一個例項的 SMON 程式能夠為出錯的 CPU  例項進行例項恢復(instance recovery)。

程式監控程式(PMON)

當一個使用者程式(user process)失敗後,程式監控程式(process monitorPMON)將對其進行恢復。PMON 程式負責清理資料緩衝區(database buffer cache)並釋放使用者程式使用的資源。例如,它可以重置活動事務表(active transaction table)的狀態,釋放鎖,將某個程式ID從活動程式列表中移除。
PMON 程式會週期性地對排程器(dispatcher)和服務程式(server process)進行檢查,重新啟動停止執行的程式(不包括 Oracle 有意停止的程式)。PMON 程式還負責將例項和排程器程式的資訊註冊到網路監聽器(network listener)。
SMON一樣,PMON程式定期檢查自己是否被需要,系統內的其他程式發覺需要時也能夠呼叫 PMON 程式。

恢復程式(RECO)

         恢復程式recoverer process (RECO)用於分散式資料庫結構,自動解決分散式事務的錯誤。一個節點的RECO程式會自動地連線到一個有疑問的分散式事務的相關其他資料庫。當RECO重新連線到相關的資料庫服務時,它會自動地解決有疑問的事務。並從相關資料庫的活動事務表(pending transaction table)中移除和此事務有關的資料。
         如果RECO程式無法連線到遠端服務,RECO會在一定時間間隔後嘗試再次連線。但是每次嘗試連線的時間間隔會以指數級的方式增長。只有例項允許分散式事務時才會啟動 RECO程式。例項中不會限制併發的分散式事務的數量。

作業佇列程式(Job Queue Processes)

         一般由兩類程式組成:
作業佇列協調程式coordinator job queue process (CJQn),起到對作業佇列的監控作用。
執行作業的佇列程式job queue processes (Jnnn),由CJQn完成排程產生。
作業佇列程式用於批處理,執行使用者job,可以將它們看做一個排程服務,用於排程Oracle例項上如PL/SQL語句或儲存過程的job。提供開始的時間和排程的時間間隔,作業佇列程式可以根據這個配置,自動地週期性地執行。
         作業佇列程式可以被動態地管理。可以允許作業佇列客戶端根據需要使用多個作業佇列程式,當一個作業佇列程式進入空閒狀態(idle)後,其使用的資源將被釋放。
         動態的作業佇列程式可以按指定的時間間隔執行大量的作業。使用者的作業是由 CJQ 程式交給作業佇列程式執行的。具體步驟如下:
1. 名為 CJQ0 的協調程式(coordinator process)定期地從系統JOB$表中選擇需要執行的job。被選出的作業將按照時間排序。
2. CJQ0程式動態地產生job佇列的slave程式來執行這些job,編號從J000-J999
3. 作業佇列程式執行一個由 CJQ 程式選出的作業。每個程式每次只能執行一個job
4. 當一個工作佇列程式執行完一個作業後,就能夠接受下一個作業。如果此時系統中已經沒有需要被排程的作業了,此程式將進入休眠狀態(sleep state);此程式還會定期地甦醒(wake up)等待分配其他作業。如果在預設的時間內沒有新的作業,此程式將終止。
初始化引數JOB_QUEUE_PROCESSES表示例項中可以並行執行的最大作業佇列程式數。但是,客戶端不應該假設所有的作業佇列程式都用於執行job
注意:
如果初始化引數JOB_QUEUE_PROCESSES被設定為 0,協調程式(CJQ )將不會被啟動。

歸檔程式(ARCn)

歸檔程式(archiver processARCn)在發生日誌切換(log switch)時將重做日誌檔案複製到指定的儲存裝置中。只有當資料庫執行在ARCHIVELOG模式下,且自動歸檔功能被開啟時,系統才會啟動ARCn程式。
         一個 Oracle 例項中最多可以執行 10  ARCn 程式(ARC0  ARC9)。如果當前的 ARCn 程式還不能滿足工作負載的需要,LGWR 程式將啟動新的ARCn程式。Alert log會記錄LGWR啟動ARCn程式。
         如果預計系統存在繁重的歸檔任務,例如將進行大批量資料裝載,可以通過設定初始化引數LOG_ARCHIVE_MAX_PROCESSES來指定多個歸檔程式,通過ALTER SYSTEM語句可以動態地修改該引數,增加或減少歸檔程式的數量。然而,通常不需要去改變該引數,該引數預設值為1,因為當系統負載增大時,LGWR程式會自動地啟動新的ARCn程式。

佇列監控程式(QMNn)

         佇列監控程式是一個可選擇的程式,它提供Oracle工作流高階佇列,用於監控資訊佇列。可以配置最多10個監控程式。這些程式類似作業佇列程式與其他 Oracle 後臺程式的區別在於,這兩類程式出錯不會導致整個例項出錯。

排程程式(Dnnn)

         排程程式DispatcherDnnn)是一個可選的Oracle後臺程式,只存在於共享伺服器環境中。

記憶體管理程式(MMAN)

記憶體管理程式Memory Manager(MMAN)是一個SGA後臺程式。10g新特性,自動共享記憶體管理Automatic Shared Memory Management(ASMM)啟用時,會有這個新的後臺程式。MMAN服務像是SGA記憶體的經紀人(SGA Memory Broker)一樣,協調記憶體各組成部分的大小。SGA Memory Broker很清楚記憶體各組成部分的大小,和有待調整的操作。

恢復寫入程式 (RVWR)

Flashback DatabaseOracle10g的新增功能,在啟動Flashback Database之後,它定期將已發生變化的塊寫入閃回日誌的日誌檔案中。這些日誌不是由傳統的Log Writer (LGWR) 過程寫入,而是由一種稱作Recovery Writer (RVWR)的新過程寫入。
這是Oracle10g的新增程式。閃回資料庫是指將資料庫返回到一個早前的資料庫狀態,閃回資料庫特性提供了一種快速的方法,將資料庫迅速地返回到早前的某個時間點,它不同於傳統的基於時間的恢復。
         資料庫閃回只能從以下錯誤中恢復:
·由於邏輯錯誤導致的。
·由於使用者錯誤導致的。
不能從介質錯誤中通過閃回特性恢復資料庫。
閃回資料庫所需的時間是與被改變的資料成正比的,而不是資料庫的大小。
注意,一旦resetlogs之後,將不能再flashbackresetlogs之前的時間點。

記憶體管理程式 (MMON)

記憶體管理程式memory monitor (MMON)10g的新程式,它聯合AWR新特性負責執行多種和可管理性相關(manageability-related)的後臺任務,例如:
·當某個測量值(metrics)超過了預設的限定值(threshold value)後提交警告
·建立新的 MMON 隸屬程式(MMON slave process)來進行快照(snapshot
·捕獲最近修改過的 SQL 物件的統計資訊
它的slave程式是M000

其他後臺程式

Oracle 資料庫中還可能執行其他後臺程式。包括:
Memory Monitor Light (MMNL)程式負責執行輕量級的且頻率較高的和可管理性相關的後臺任務,例如捕獲會話歷史資訊,測量值計算等。它與AWR一起起作用,將需要的buffer統計資訊寫入磁碟。
MMAN程式負責執行資料庫系統的內部任務。
在使用了自動儲存管理(Automatic Storage Management)的例項中,RBAL 程式負責協調磁碟組間的負載平衡工作。她可以使多個例項同時訪問一個 ASM 磁碟(global open)。最終由 ORBn 程式實際執行資料擴充套件的負載均衡。例項中可以執行多個 ORBn 程式,分別為ORB0ORB1,以此類推。
當資料庫例項使用 ASM 磁碟組時,還要啟動 OSMB 程式。此程式負責和 ASM 例項(Automatic Storage Management instance)通訊。
LMSGlobal Cache Service)程式,在RAC環境中存在,該程式管理資源,並提供例項資源互動控制。
Change Tracking Writer (CTWR)程式,是10g中的新程式,用於對最近的改變的塊進行跟蹤,讓RMAN可以更快地進行增量備份。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29440247/viewspace-1270823/,如需轉載,請註明出處,否則將追究法律責任。

相關文章