本文我们主要介绍一下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 后台进程。
启动实例时也许不会看到所有这些进程,但是其中一些主要的进程肯定存在。如果在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 配置,即集群中的多个实例可以装载和打开一个数据库,其中每个实例在一个单独的节点上运行(通常节点是一个单独的物理计算机)。这样,你就能有多个实例访问(以一种全读写方式)同样的一组数据库文件