oracle 後臺程式的理解筆記

li__hl8888發表於2016-06-02

PMON

PMON,程式監視。PMON主要有3個用途:

1,在程式非正常中斷後,做清理工作。例如:dedicated server失敗了或者因為一些原因被殺死,這是PMON的工作分兩種。第一,是對dedicated server所做的工作進行恢復或撤銷。第二:是釋放dedicated server佔用的資源。PMON會把失敗程式的未提交的工作進行rollback,釋放鎖,釋放SGA空間

2,在程式abort後,PMON進行清理工作。PMON會監視oracle其他的後臺程式,並在需要的時候對它們進行重建。如果shared server或者dispatcher失敗後,PMON會介入其中,並在清理完失敗程式後,重建一個shared server或dispatcher。例如:在資料庫進行寫日誌的時候LGWR程式失敗,這是個很嚴重的錯誤。解決這種問題最安全的方法是立即中斷例項,並恢復。

3,PMON的第三個用途是,向Oracle TNS listener註冊例項資訊。在例項啟動的時候,PMON會查詢oracle的預設埠(1521埠)是否處於工作狀態。如果這個埠已經處於工作狀態,那麼該例項就可以啟動,PMON把例項的相關資訊告訴listener,包括服務名、例項的資訊等。如果listener沒有啟動,PMON就會定期的嘗試去連線listener。這裡要注意如果oracle沒有是預設的1521埠,而是使用其他的埠時,PMON和listener的連線過程和使用1521埠還是很相似的,除了,在使用非預設埠時,listener的地址要在引數LOCAL_LISTENER中指定。

 

SMON

SMON,系統監視。SMON的工作如下:

1,清理臨時空間。

2,聚合空閒空間。如果使用dictionary-managed 方式來管理表空間,SMON就要負責把空閒的extent聚合成大的空閒extent。這種情況只有在表空間的管理方式是dictionary-managed ,且引數PCTINCREASE被設定成非零值的時候才會發生。

3,對不可用檔案的事務恢復。在資料庫啟動的時候,SMON會恢復失敗的事務,這些事務是在例項恢復或crash恢復的時候被跳過的。例如:在磁碟上某哥檔案不可用了,在這個檔案又重新可用後,SMON會恢復它。

4,在RAC的單節點故障上進行例項恢復。在RAC 環境下,如果cluster(簇群)中有一個例項失敗了(如:例項所在的機器掛掉了),在這個cluster上的其他的節點會開啟失敗例項的redo log,並恢復失敗例項

5,清理OBJ$。OBJ$是個低階別的資料字典,它幾乎包含了資料庫中所有的objects的entry。多數時候,有的entries的objects已經被刪除了,或者當前的entry代表的不再是最新的objects。SMON就負責刪除這些entry資訊了

6,收縮undo segments。SMON會自動把rollback segment收縮到最優的大小

7,離線rollback segments。DBA可能需要把一個處於active狀態的事務的rollback segment離線。此時如果事務正在使用這個已經離線的rollback segment,那麼這個segment並未真的離線,而是被標記為“pending offline"。在後臺,SMON會一直嘗試離線這個segment,直到成功。

此外,SMON還會重新整理檢視DBA_TAB_MONITORING的統計資訊等。SMON會消耗大量的CPU。SMON會定期地,或被其他後臺程式喚醒,來執行清理工作。

 

CKPT

CKPT,檢查點程式。CKPT程式並不像它的名字說的那樣進行checkpoint,執行checkpoint是DBWn的工作。它只是來更新資料檔案頭的。oracle8.0之前,CKPT只是一個可選的程式。但oracle8.0之後,CKPT程式就程式被開啟。過去更新資料檔案頭的checkpoint 資訊是LGWR的工作,然而,隨著資料庫檔案的增加,LGWR的負擔也變得越來越重。如果LGWR要更新100,甚至1000哥檔案頭,那麼就會有很多的session等待很長時間去commit。所有CKPT就把這個工作承擔下來了

 

DBWn

DBWn,資料寫程式。DBWn負責把緩衝區的髒資料寫到磁碟上。在oracle發生switch log files的時候,會發生checkpoint。checkpoint發生後,在redo log中的資料就可以被覆蓋了。如果在redo log被填滿,且要重新利用redo log 來存放新的資料時,而此時checkpoint還為完成,oracle就會返回”checkpoint not complete“。

DBWn的效能相當重要。如果DBWn寫資料的速度不夠快,這樣釋放出空閒buffer的速度也就不會快。那麼Free Buffer Waits 和Write Complete Waits的值就會很快的增長。

oracle可以配置多達36個DBW程式。從DBW0到DBW35.多數系統只有一個DBW程式,但在多CPU系統中就可能不止一個DBW程式了。這樣做的目的是分散寫資料的負擔,保證SGA中有足夠的空閒空間。

最佳化情況下,DBW是透過非同步(asynchronous)I/O向磁碟寫資料的。透過非同步I/O,DBW先把blocks組成一個batch(一捆),再把batch遞交給OS,DBW不會等待OS把batch寫入到磁碟,而是返回,繼續收集下一個batch。當OS完成寫後,會非同步通知DBW程式,已經把batch成功的寫入到磁碟了。

最後,DBW程式是分散地把資料寫到磁碟上的。而LGWR是連續寫redo log。分散寫要比連續寫耗時的多。但是,DBW是在後臺進行分散寫的,而LGWR做連續寫是為了減少使用者等待的時間。

疑問:TOM說DBWn是把blocks組成一個batch,然後非同步交給OS,讓OS寫到磁碟的。為啥又說DBWn是分散寫資料的,寫資料的活不是OS乾的嗎?

 

LGWR

LGWR,日誌寫程式。LGWR是把SGA中redo log buffer的資訊寫到redo log file的程式。LGWR會在下面情況發生:

1,每個3秒鐘,進行一次LGWR

2,任何事務進行了commit

3,當redo log buffer是1/3滿,或者裡面有1MB的資料

基於以上的原因,把redo log buffer設定的很大就沒必要的。

 

ARCn

ARCn,歸檔程式。ARCn的工作是在LGWR把onlone redo log填滿後,ARCn把redo log file的內容copy到其他的地方。歸檔日誌可以用來做media recovery。online redo log 是被用來為例項失敗的時候,恢復資料檔案。而歸檔日誌是被用來在media recovery的時候,恢復資料檔案。

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

相關文章