天天看點

《Oracle資料庫管理與維護實戰》——2.4 Oracle背景程序結構

本節書摘來自異步社群出版社《oracle資料庫管理與維護實戰》一書中的第2章,第2.4節,作者: 何偉娜 , 常建功,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

oracle資料庫管理與維護實戰

背景程序存在于作業系統中,和執行個體同時啟動,由oracle伺服器管理。背景程序維持資料庫的實體結構和記憶體結構,如圖2-9所示。

《Oracle資料庫管理與維護實戰》——2.4 Oracle背景程式結構

背景程序運作時會建立一個跟蹤檔案,用以儲存執行個體的操作。背景程序跟蹤檔案的命名方法和位置随作業系統和資料庫版本的不同而不同。一般來說,跟蹤檔案含有背景程序名或背景程序的作業系統程序id。使用者可以通過設定初始化參數檔案的background_dump_dest參數來規定背景程序跟蹤檔案的位置,但是有些版本的oracle忽略這種設定。

排除資料庫故障時,跟蹤檔案就顯得非常重要。影響背景程序的嚴重問題通常記錄在資料庫的跟蹤檔案上。跟蹤檔案位于background_dump_dest目錄下。這個目錄預設是%oracle_base%/admin/<執行個體名稱>/bdump目錄。

在資料庫啟動時,smon系統監視程序會使用聯機重做日志檔案恢複崩潰的執行個體。執行個體啟動後,smon還會清除不經常使用的臨時段、合并表空間中連續的自由空間。在并行資料庫伺服器環境下,smon對有故障的cpu或執行個體進行執行個體恢複。

oracle會定期喚醒smon,以檢查系統是否需要它。其他程序也可以調用smon系統監控程序。

pmon程序主要用來監視使用者程序的運作,當使用者程序失敗時,清除失敗的使用者程序和失敗程序所占用的資源。pmon能清除資料庫緩沖區的資料,斷開異常中斷的連接配接,釋放失敗程序對資料庫對象的鎖定,将失敗程序的id從活動程序表中移去。pmon還周期地檢查排程程序(dispatcher)和伺服器程序的狀态,如果已死,則重新啟動。

同smon程序一樣,pmon程序會被定期地喚醒,以檢查是否需要它執行任務;其他程序也可以調用pmon程序。

dbwr程序負責管理資料庫緩沖區及資料字典緩沖區。dbwr以批的形式将資料庫緩沖區的内容寫到磁盤上。當資料庫緩沖區的内容被修改時,伺服器程序會對已修改的資料塊做已修改标記,但不立即啟動dbwr程序,而是等被修改的資料塊累積到一定數量後才将修改的資料儲存到磁盤。

發生下面情況會激發dbwr寫磁盤。

當伺服器程序向dirty list添加一個新的已修改資料塊時,發現dirty list已達到指定的長度,伺服器程序就通知dbwr寫磁盤。這個長度由初始化參數dbblock

write_batch決定。

當伺服器程序要向資料庫緩沖區寫資料時,如果搜尋lru清單超過db_block_max scan_cnt次,通知dbwr寫磁盤,以騰出空間。

當逾時發生(每3秒鐘)時,dbwr寫磁盤。

當檢查點發生時,lgwr通知dbwr寫磁盤。

一個資料庫執行個體中隻有一個smon和一個pmon程序,但有的作業系統可以設定多個dbwr程序。使用多個dbwr程序有助于減少dbwr沖突。dbwr的數量由初始化參數db_write_process決定。如果系統支援異步i/o,使用者可以建立多個dbwr i/o從程序。dbwr i/o從程序的數量由初始化參數db_i/o_slaves參數決定。

如果配置了多個dbwr程序,dbwr就不再叫作dbwr,而分别稱dbw0、dbw1、dbw2……

lgwr程序負責将重做日志緩沖區的内容寫入聯機重做日志檔案。正常情況下,lgwr是唯一從重做日志緩沖區中讀資料并向聯機重做日志檔案寫資料的程序。lgwr按順序向聯機重做日志檔案寫資料。

lgwr是向一組聯機重做日志檔案寫資料,如果一個聯機重做日志檔案損壞,lgwr則向組内的其他聯機重做日志檔案寫,同時将出錯資訊寫到lgwr跟蹤檔案和系統的警告日志檔案中。

重做日志緩沖區是個循環緩沖區,oracle隻有在緩沖區資料寫到聯機重做日志檔案後才允許新的重做資料覆寫舊的緩沖區。

oracle實行這樣的機制,當資料庫緩沖區的修改資料要寫到磁盤上,oracle要先通知lgwr将重做資訊寫入磁盤。也就是說,當資料庫要改變時,lgwr總是要先記錄改變内容,然後才允許改變發生。這樣如果發生意外,使用者可以從重做日志檔案中恢複。是以重做日志緩沖區中總是包含着資料庫的最新狀态。

oracle使用一種“快速送出機制”,當使用者發出送出指令時,先将送出記錄放入重做日志緩沖區,與其相應的資料要等到寫資料檔案時才放到重做日志緩沖區。

當送出一個事務時,oracle為這個事務配置設定一個系統改變号(system change number) scn。scn與事務的重做資料一起放在重做日志檔案中。在并行伺服器結構和分布式資料庫系統中,scn可以實作資料庫同步恢複。

下列情況會激發lgwr寫磁盤。

當使用者發出commit指令時,lgwr寫磁盤。

當重做日志緩沖區的1/3滿時,lgwr寫磁盤。

當dbwr或dbwn要寫磁盤時,lgwr寫磁盤。

當逾時發生(每3秒鐘)時,lgwr寫磁盤。

檢查點程序的作用是控制資料檔案、控制檔案和重做日志檔案之間的協調同步,檢查點程序一般和資料庫寫程序dbwr合作。檢查點是在資料庫中做一個記号,表示記号之前的資料庫是完全正确的,如果資料發生意外,可以恢複到之前這個完全正确的檢查點,如圖2-10所示。

《Oracle資料庫管理與維護實戰》——2.4 Oracle背景程式結構

檢查點程序在檢查點出現時,對全部資料檔案标題進行修改,辨別該檢查點。在通常的情況下,該任務由lgwr執行。如果檢查點明顯地降低系統性能,可使ckpt程序運作,将原來由lgwr程序執行的檢查點的工作分離出來,由ckpt程序實作。對于許多應用情況,ckpt程序不是必須有的。隻有當資料庫有許多資料檔案、lgwr在檢查點時明顯地降低性能時才運作ckpt。ckpt程序不将塊寫入磁盤,該工作是由dbwr完成的。檢查點程序由初始化參數checkpoint_process設定,值為true表示使用檢查點程序,而值為false表示不使用,預設時為false。下列情況會産生檢查點。

上一個檢查點之後,超過了初始化參數log_checkpoint_timeout設定的時間,産生檢查點。

上一個檢查點之後,當寫入磁盤的重做日志塊數量超過了初始化參數log_ checkpoint_interval的值時,産生檢查點。

日志檔案切換時,産生檢查點。

執行個體關閉時,産生檢查點。

dba發出強制指令要求産生檢查點時,産生檢查點。

表空間脫機時(offline),産生檢查點。

恢複程序用于恢複分布式資料庫環境中失敗的事務。資料庫恢複程序會自動連接配接失敗的資料庫執行個體,連接配接成功後,将删除失敗的事務和對應的資料行;如果連接配接失敗,恢複程序會在一定時間後再次嘗試連接配接。

要使用恢複程序,資料庫執行個體必須允許分布式事務處理,同時初始化參數distributed_ transactions大于0。

lgwr程序以循環方式向聯機重做日志檔案寫入日志資料,當寫滿第一個日志檔案後,就開始向第二個日志檔案寫入;第二個日志檔案被寫滿後,再向第三個日志檔案寫入。當最後一個重做日志檔案被寫滿,lgwr就又重寫第一個重做日志檔案,并将以前的資料覆寫。

arch程序作用,就是将填滿的重做日志檔案轉儲到指定的裝置上。這樣先前的重做日志檔案不至于被覆寫。

資料庫必須在歸檔(archivelog)模式下才能使用歸檔程序。在初始化參數log_ archive_max_processes内使用者可以設定資料庫最大的可使用歸檔程序。

snpn程序用來完成一些應用程式的周期性執行工作。snpn能周期性地喚醒作業隊列中的作業,并完成這些作業,自動重新整理分布式資料庫中表的快照。

在分布式事務處理時,一個資料庫執行個體可以啟動36個快照重新整理和作業隊列程序,這些背景程序的名字以字母snp開頭,以數字或字母結束。當這些程序被定期喚醒,則自動重新整理分布式系統中表的快照和執行dbms_job包的資料庫作業。

初始化參數job_queue_processes用于設定每一個執行個體中的重新整理和作業程序數。

lckn鎖程序用于鎖定資料庫對象不被資料庫其他程序更改。lckn鎖程序用于并行資料庫環境中,在并行資料環境中經常會出現多個程序同時讀取同一資料庫對象,例如同時讀取同一張資料庫表。考慮到安全性和資料的一緻性,當一個程序在更改這個表時,使用lckn鎖程序鎖定這個表,其他程序就不能對這張表進行更改。鎖程序最多有10個,分别命名為lck0~lck9。lckn鎖程序的個數由參數gc_lck_procs決定。

排程程序是共享伺服器的一部分,排程程序可以減少多重連接配接所需要的資源。一個資料庫伺服器可以建立多個排程程序,支援oracle伺服器的每一個協定都至少建立一個排程程序。排程程序根據伺服器的網絡配置,在資料庫啟動時建立,也在資料庫啟動後再建立或取消。

snnn共享伺服器程序存在于共享伺服器中,給共享伺服器提供類似于專用伺服器的資料庫連接配接,隻是共享伺服器不與特定使用者程序關聯。snnn共享伺服器程序的數量在初始化參數shared_servers和max_shared_servers參數之間。

qmnn隊列監視程序是oracle進階隊列選項所用的背景程序,用于監視執行個體中的消息隊列。初始化參數aq_tm_processes值指定了隊列監視程序的個數,最大可設為10。qmnn程序和snpn程序的失敗不會引起執行個體的失敗,oracle會自動重新開機這些程序;而其他程序的失敗則會引起整個執行個體的失敗。