天天看點

Oracle資料庫程序之背景程序詳解

本文我們主要介紹一下Oracle資料庫的背景程序的相關知識,我們知道,Oracle執行個體包括兩部分:SGA 和一組背景程序。背景程序執行保證資料庫運作所需的實際維護任務。

  例如,有一個程序為我們維護塊緩沖區緩存,根據需要将塊寫出到資料檔案。另一個程序負責當線上重做日志檔案寫滿時将它複制到一個歸檔目标。另外還有一個程序負責在異常中止程序後完成清理,等等。每個程序都專注于自己的任務,但是會與所有其他程序協同工作。例如,負責寫日志檔案的程序填滿一個日志後轉向下一個日志時,它會通知負責對填滿的日志檔案進行歸檔的程序,告訴它有活幹了。

  可以使用一個V$視圖檢視所有可能的Oracle 背景程序,确定你的系統中正在使用哪些背景程序:

  SQL> select paddr, name, descriptionfrom v$bgprocess order by paddr desc; PADDR NAME DESCRIPTION -------- --------------------------------------------------------------------- 3621D49C QMNC AQ Coordinator 3621CEE8 ARC2 Archival Process 2 3621C934 ARC1 Archival Process 1 3621C380 ARC0 Archival Process 0 3621A148 MMNL Manageability Monitor Process 2 36219B94 MMON Manageability Monitor Process 362195E0 CJQ0 Job Queue Coordinator 3621902C RECO distributed recovery 36218A78 SMON System Monitor Process 362184C4 CKPT checkpoint 36217F10 LGWR Redo etc. PADDR NAME DESCRIPTION -------- --------------------------------------------------------------------- 3621795C DBW0 db writer process 0 362173A8 MMAN Memory Manager 36216DF4 PSP0 process spawner 0 36216840 PMON processcleanup 00 DIAG diagnosibility process 00 FMON File Mapping Monitor Process 00 LMON global enqueue servicemonitor 00 LMD0 global enqueue servicedaemon 0 ..... 00 ASMB ASMBackground 00 GMON diskgroup monitor 157 rows selected.

  注意:這個視圖中PADDR 不是00 的行都是系統上配置和運作的程序(線程)。有兩類背景程序:有一個中心(focused)任務的程序(如前所述)和完成各種其他任務的程序(即工具程序)。

  例如,内部作業隊列( jobqueue)有一個工具背景程序,可以通過DBMS_JOB 包使用它。這個程序會監視作業隊列,并運作其中的作業。在很多方面,這就像一個專用伺服器程序,但是沒有客戶連接配接。

  下面會分析各種背景程序,先來看有中心任務的程序,然後再介紹工具程序。

  中心背景程序

  圖5-4 展示了有一個中心(focused)用途的Oracle 背景程序。

Oracle資料庫程式之背景程式詳解

  啟動執行個體時也許不會看到所有這些程序,但是其中一些主要的程序肯定存在。如果在ARCHIVELOG 模式下,你可能隻會看到ARCn(歸檔程序),并啟用自動歸檔。如果運作了Oracle RAC,這種Oracle 配置允許一個叢集中不同機器上的多個執行個體裝載并打開相同的實體資料庫,就隻會看到LMD0、LCKn、LMON 和LMSn。

  意為簡潔起見,圖5-4 中沒有畫出共享伺服器排程器(Dnnn)和共享伺服器(Snnn)程序。是以,圖5-4 大緻展示了啟動Oracle 執行個體并裝載和打開一個資料庫時可能看到哪些程序。例如,在我的Linux 系統上,啟動執行個體後,有以下程序:

  [[email protected] ~]$ ps -ef|grep 'ora_.*_dave*' oracle 4123 1 0 20:13 ? 00:00:05 ora_pmon_dave1 oracle 4125 1 0 20:13 ? 00:00:05 ora_psp0_dave1 oracle 4127 1 0 20:13 ? 00:00:02 ora_mman_dave1 oracle 4129 1 0 20:13 ? 00:00:05 ora_dbw0_dave1 oracle 4131 1 0 20:13 ? 00:00:21 ora_lgwr_dave1 oracle 4133 1 0 20:13 ? 00:00:13 ora_ckpt_dave1 oracle 4135 1 1 20:13 ? 00:01:12 ora_smon_dave1 oracle 4137 1 0 20:13 ? 00:00:04 ora_reco_dave1 oracle 4139 1 0 20:13 ? 00:00:16 ora_cjq0_dave1 oracle 4141 1 1 20:13 ? 00:01:33 ora_mmon_dave1 oracle 4143 1 0 20:13 ? 00:00:08 ora_mmnl_dave1 oracle 4145 1 0 20:13 ? 00:00:00 ora_d000_dave1 oracle 4147 1 0 20:13 ? 00:00:00 ora_s000_dave1 oracle 4156 1 0 20:13 ? 00:00:01 ora_arc0_dave1 oracle 4158 1 0 20:13 ? 00:00:05 ora_arc1_dave1 oracle 4163 1 0 20:14 ? 00:00:03 ora_qmnc_dave1 oracle 4167 1 0 20:15 ? 00:00:24 ora_q000_dave1 oracle 4169 1 020:15 ? 00:00:00 ora_q001_dave1 oracle 5109 1 1 21:48 ? 00:00:00 ora_j000_dave1 oracle 5141 5111 0 21:49 pts/4 00:00:00 grep ora_.*_dave2*

  這些程序命名規則:程序名都以ora_開頭。後面是4 個字元,表示程序的具體名字,再後面是ORACLE_SID,(站點辨別符)。

  在UNIX 上,可以很容易地辨別出Oracle背景程序,并将其與一個特定的執行個體關聯(在Windows 上則沒有這麼容易,因為在Windows 上這些背景程序實際上隻是一個更大程序中的線程)。

  這些程序實際上都是同一個二進制可執行程式,對于每個“程式”,并沒有一個單獨的可執行檔案。你可以盡可能地查找一下,但是不論在磁盤的哪個位置上肯定都找不到一個arc0 二進制可執行程式,同樣也找不到LGWR或DBW0。這些程序實際上都是oracle(也就是所運作的二進制可執行程式的名字)。它們隻是在啟動時對自己建立别名,以便更容易地辨別各個程序。這樣就能在UNIX 平台上高效地共享大量對象代碼。Windows上就沒有什麼特别的了,因為它們隻是程序中的線程,是以,當然隻是一個大的二進制檔案。

  自動存儲管理背景(Automatic Storage Management Background,ASMB)程序:ASMB 程序在使用了ASM 的資料庫執行個體中運作。它負責與管理存儲的ASM 執行個體通信、向ASM 執行個體提供更新的統計資訊,并向ASM 執行個體提供一個“心跳”,讓ASM 執行個體知道它還活着,而且仍在運作。

  重新平衡(Rebalance,RBAL)程序:RBAL 程序也在使用了ASM 的資料庫執行個體中運作。向ASM磁盤組增加或去除磁盤時,RBAL 程序負責處理重新平衡請求(即重新分布負載的請求)。

  以下程序出現在Oracle RAC 執行個體中。RAC 是一種Oracle 配置,即叢集中的多個執行個體可以裝載和打開一個資料庫,其中每個執行個體在一個單獨的節點上運作(通常節點是一個單獨的實體計算機)。這樣,你就能有多個執行個體通路(以一種全讀寫方式)同樣的一組資料庫檔案