上次我们介绍了: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 process cleanup
- 00 DIAG diagnosibility process
- 00 FMON File Mapping Monitor Process
- 00 LMON global enqueue servicemonitor
- 00 LMD0 global enqueue servicedaemon 0
- .....
- 00 ASMB ASM Background
- 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 系统上,启动实例后,有以下进程:
- [oracle@db1 ~]$ 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 配置,即集群中的多个实例可以装载和打开一个数据库,其中每个实例在一个单独的节点上运行(通常节点是一个单独的物理计算机)。这样,你就能有多个实例访问(以一种全读写方式)同样的一组数据库文件。
RAC 的主要目标有两个:
高度可用性:利用Oracle RAC,如果集群中的一个节点/计算机由于软件、硬件或人为错误而失败,其他节点可以继续工作,还可以通过其他节点访问数据库。你也许会丧失一些计算能力,但是不会因此而无法访问数据库。
可扩缩性:无需购买更大的机器来处理越来越大的工作负载(这称为垂直扩缩),RAC 允许以另一种方式增加资源,即在集群中增加更多的机器(称为水平扩缩)。举例来说,不必把你的4 CPU 机器扩缩为有8 个或16 个CPU,通过利用RAC,你可以选择增加另外一个相对廉价的4 CPU机器(或多台这样的机器)。
以下进程是RAC 环境所特有的:
锁监视器(Lockmonitor,LMON)进程:LMON 监视集群中的所有实例,检测是否有实例失败。这有利于恢复失败实例持有的全局锁。它还负责在实例离开或加入集群时重新配置锁和其他资源(实例失败时会离开集群,恢复为在线时又会加入集群,或者可能有新实例实时地增加到集群中)。
锁管理器守护(Lockmanager daemon,LMD)进程:LMD 进程为全局缓存服务(保持块缓冲区在实例间一致)处理锁管理器服务请求。它主要作为代理(broker)向一个队列发出资源请求,这个队列由LMSn 进程处理。LMD 会处理全局死锁的检测/解析,并监视全局环境中的锁超时。
锁管理器服务器(Lockmanager server,LMSn)进程:前面已经提到,在一个RAC 环境中,各个Oracle 实例在集群中的不同机器上运行,它们都以一种读写方式访问同样的一组数据库文件。为了达到这个目的,SGA 块缓冲区缓存相互之间必须保持一致。这也是LMSn 进程的主要目标之一。在以前版本的Oracle 并行服务器(Oracle Parallel Server,OPS)中,这是通过ping实现的。也就是说,如果集群中的一个节点需要块的一个读一致视图,而这个块以一种独占模式被另一个节点锁定,数据的交换就要通过磁盘刷新输出来完成(块被ping)。如果本来只是要读取数据,这个操作(ping)的代价就太昂贵了。现在则不同,利用LMSn,可以在集群的高速连接上通过非常快速的缓存到缓存交换来完成数据交换。每个实例可以有多达10 个LMSn 进程。
锁(Lock,LCK0)进程:这个进程的功能与前面所述的LMD 进程非常相似,但是它处理所有全局资源的请求,而不只是数据库块缓冲区的请求。
可诊断性守护(Diagnosabilitydaemon,DIAG)进程:DIAG 只能用于RAC 环境中。它负责监视实例的总体“健康情况”,并捕获处理实例失败时所需的信息。
工具后台进程
这些后台进程全都是可选的,可以根据你的需要来选用。它们提供了一些工具,不过这些工具并不是每天运行数据库所必需的,除非你自己要使用(如作业队列),或者你要利用使用了这些工具的特性(如新增的Oracle 10g 诊断功能)。
在UNIX 中,这些进程可以像其他后台进程一样可见,如果你执行ps 命令,就能看到这些进程。
- [oracle@db1 ~]$ 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_.*_dave*
CJQ0 和Jnnn 进程:作业队列
在第一个7.0 版本中,Oracle 通过一种称为快照(snapshot)的数据库对象来提供复制特性。作业队列就是刷新快照(或将快照置为当前快照)时使用的内部机制。
作业队列进程监视一个作业表,这个作业表告诉它何时需要刷新系统中的各个快照。在Oracle 7.1中,Oracle 公司通过一个名为DBMS_JOB 的数据库包来提供这个功能。所以,原先7.0 中与快照相关的进程到了7.1及以后版本中变成了“作业队列”。后来,控制作业队列行为的参数(检查的频度,以及应该有
多少个队列进程)的名字也发生了变化,从SNAPSHOT_REFRESH_INTERVAL 和SNAPSHOT_REFRESH_PROCESSES变成了JOB_QUEUE_INTERVAL 和JOB_QUEUE_PROCESSES。在当前的版本中,只有JOB_QUEUE_PROCESSES 参数的设置是用户可调的。
最多可以有1000 个作业队列进程。名字分别是J000,J001,…,J999。这些进程在复制中大量使用,并作为物化视图刷新进程的一部分。基于流的复制(Oracle9iRelease 2 中新增的特性)使用AQ 来完成复制,因此不使用作业队列进程。
开发人员还经常使用作业队列来调度一次性(后台)作业或反复出现的作业,例如,在后台发送一封电子邮件,或者在后台完成一个长时间运行的批处理。通过在后台做这些工作,就能达到这样一种效果:尽管一个任务耗时很长,但在性急的最终用户看来所花费的时间并不多(他会认为任务运行得快多了,但事实上可能并非如此)。这与Oracle 用LGWR 和DBWn 进程所做的工作类似,他们在后台做大量工作,所以你不必实时地等待它们完成所有任务。
Jnnn 进程与共享服务器很相似,但是也有专用服务器中的某些方面。它们处理完一个作业之后再处理下一个作业,从这个意义上讲是共享的,但是它们管理内存的方式更像是一个专用服务器(其UGA 内存在PGA 中,而不是在SGA 中)。每个作业队列进程一次只运行一个作业,一个接一个地运行,直至完成。正因为如此,如果我们想同时运行多个作业,就需要多个进程。这里不存在多线程或作业的抢占。一旦运行一个作业,就会一直运行到完成(或失败)。
你会注意到,经过一段时间,Jnnn 进程会不断地来来去去,也就是说,如果配置了最多1 000 个Jnnn进程,并不会看到真的有1 000 个进程随数据库启动。相反,开始时只会启动一个进程,即作业队列协调器(CJQ0),它在作业队列表中看到需要运行的作业时,会启动Jnnn 进程。如果Jnnn 进程完成其工作,并发现没有要处理的新作业,此时Jnnn 进程就会退出,也就是说,会消失。因此,如果将大多数作业都调度为在凌晨2:00运行(没有人在场),你可能永远也看不到这些Jnnn 进程。
QMNC 和Qnnn:高级队列
QMNC进程对于AQ 表来说就相当于CJQ0 进程之于作业表。QMNC 进程会监视高级队列,并警告从队列中删除等待消息的“出队进程”(dequeuer):已经有一个消息变为可用。QMNC和Qnnn 还要负责队列传播(propagation),也就是说,能够将在一个数据库中入队(增加)的消息移到另一个数据库的队列中,从而实现出队(dequeueing)。
Qnnn 进程对于QMNC 进程就相当于Jnnn 进程与CJQ0 进程的关系。QMNC 进程要通知Qnnn 进程需要完成什么工作,Qnnn 进程则会处理这些工作。
QMNC 和Qnnn 进程是可选的后台进程。参数AQ_TM_PROCESSES 可以指定最多创建10 个这样的进程(分别名为Q000,…,Q009),以及一个QMNC 进程。如果AQ_TM_PROCESSES 设置为0,就没有QMNC或Qnnn 进程。
不同于作业队列所用的Jnnn进程,Qnnn 进程是持久的。如果将AQ_TM_PROCESSES 设置为10,数据库启动时可以看到10 个Qnnn 进程和一个QMNC 进程,而且在实例的整个生存期中这些进程都存在。
EMNn:事件监视器进程(Event Monitor Process)
EMNn进程是AQ 体系结构的一部分,用于通知对某些消息感兴趣的队列订购者。通知会异步地完成。
可以用一些Oracle 调用接口(Oracle Call Interface,OCI)函数来注册消息通知的回调。回调是OCI 程序中的一个函数,只要队列中有了订购者感兴趣的消息,就会自动地调用这个函数。EMNn 后台进程用于通知订购者, 第一次向实例发出通知时会自动启动EMNn 进程。然后应用可以发出一个显式的message_receive(dequeue)来获取消息。
MMAN:内存管理器(Memory Manager)
这个进程是Oracle 10g 中新增的,自动设置SGA 大小特性会使用这个进程。MMAN 进程用于协调共享内存中各组件(默认缓冲区池、共享池、Java 池和大池)的大小设置和大小调整。
MMON、MMNL 和Mnnn:可管理性监视器(Manageability Monitor)
这些进程用于填充自动工作负载存储库(Automatic WorkloadRepository,AWR),这是Oracle 10g中新增的一个特性。
MMNL进程会根据调度从SGA 将统计结果刷新输出至数据库表。
MMON进程用于“自动检测”数据库性能问题,并实现新增的自调整特性。 Mnnn 进程类似于作业队列的Jnnn 或Qnnn 进程;MMON 进程会请求这些从属进程代表它完成工作。Mnnn 进程本质上是临时性的,它们将根据需要来来去去。
CTWR:修改跟踪进程(Change Tracking Process)
这是Oracle 10g 数据库中新增的一个可选进程。CTWR 进程负责维护新的修改跟踪文件。
RVWR:恢复写入器(Recovery Writer)
这个进程也是Oracle 10g 数据库中新增的一个可选进程,负责维护闪回恢复区中块的“前”映像,要与FLASHBACKDATABASE 命令一起使用。
其他工具后台进程
还有另外一些工具进程没有列出。例如,Oracle Data Guard 有一组与之相关的进程,有利于将重做信息从一个数据库移送到另一个数据库,并应用这些重做信息。还有一些进程与Oracle 10g 新增的数据泵工具有关,在某些数据泵操作中会看到这些进程。另外还有一些流申请和捕获进程。不过,以上所列已经基本涵盖了你可能遇到的大多数常用的后台进程。
关于Oracle数据库进程之后台进程的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!
【编辑推荐】