程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle 的服務器進程(PMON, SMON,CKPT,DBWn,LGWR,ARCn)

oracle 的服務器進程(PMON, SMON,CKPT,DBWn,LGWR,ARCn)

編輯:Oracle教程

來著TOM的《oracle 編程藝術 9i,10g,11g》

 

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的時候,恢復數據文件。


轉自:http://zzwssfd.iteye.com/blog/1554629

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved