图示
下图显示了后台进程如何与 Oracle 数据库的各部分交互,后续将讲述这些后台进程。
多进程 Oracle 实例中的后台进程
本图中间为 SGA。上部为 RECO,PMON,及 SMON 进程,其间的双向箭头表示各进程与实例间的通信。下部左侧为 DBW0 和LGWR 进程,这两个进程分别和数据缓存区与重做日志缓冲区进行通信,同时还分别访问数据文件和重做日志文件。
本图中还展示了一些其他进程,例如 ARC0,需要访问脱机存储设备和控制文件;以及 CKPT,需要访问数据文件和控制文件。
数据库写入进程(DBWn)
数据库写入进程database writer process (DBWn),将buffer中的内容写入数据文件中。DBWn进程负责将在buffer cache中的那些修改的buffer,也就是脏数据写入磁盘中。
对于大多数系统来说,1个进程(DBW0)就足够了,但也可以通过设置初始化参数DB_WRITER_PROCESSES,增加数据库写入进程,编号从DBW0-DBW9以及DBWa-DBWj,最多可以20个进程。但是前提是必须有足够多的CPU供这些进程使用,在一个单CPU的系统中,额外地配置该进程并不能提高性能,所以需要根据CPU及处理器的个数决定如何设置该参数。
当一个buffer在数据库的buffer cache中被修改了,就会被标记为脏数据(dirty)。Buffer cache的冷端(cold buffer)是指根据LRU(least recently used)算法选择出的,最近最少使用的buffer。DBWn进程将冷端的、脏的buffer写入磁盘,这样用户进程就可以查找冷端、干净的buffer用于将新的数据块读入cache中。当一个buffer被用户进程修改(弄脏),此buffer就不再是free buffer,不能用于新数据的写入。如果free buffer数量过少,用户进程就会找不到足够的空间用于数据写入。而DBWn进程有效地管理了buffer cache,让用户进程总是能够获得free buffer。
DBWn进程总是将冷端、脏buffer写入磁盘,DBWn在改善查找free buffer性能的同时,也另最近频繁使用的buffer保留在内存中。例如,储存那些频繁访问且较小的表或索引的数据块,可以keep在cache中,没必要反复地从磁盘中读取。由于LRU算法将访问频率高的数据块保留在buffer cache中,所以一个buffer被写入磁盘中,该buffer所包含的数据被马上访问的概率较小。
满足以下条件时,DBWn进程会将脏数据缓冲区(dirty buffers)写入磁盘:
·当服务器进程扫描了一定数量的buffer之后,没有找到干净的可用的buffer,它通知DBWn写入。DBWn将buffer写入磁盘的操作是异步的,因为在DBWn工作的同时还有其他进程在执行。
·DBWn周期性地写buffer,从而使得checkpoint前移,checkpoint是当一个实例需要实例恢复时,应用重做日志的起始位置。这个位置是由buffer中最早的脏数据缓冲区(dirty buffers)决定的。
无论那种情况,DBWn进程都是批量(一次多数据块)地写入以提高性能。一次批量写入的数据块的数量随操作系统的不同而改变,没有固定值。
日志写入进程(LGWR)
日志写入进程log writer process (LGWR)负责管理日志缓冲区,将日志缓冲区写入磁盘上的日志文件。LGWR将从上次之后才复制到buffer中的重做条目写入磁盘。
日志缓冲区(redo log buffer)是一个环形的缓冲区(circular buffer)。当LGWR进程将日志缓冲区的重做条目写入日志文件,服务器进程同时也将新的条目复制到日志缓冲区覆盖那些已经写入磁盘的条目。LGWR通常需要保证足够快地写入,即使在频繁访问redo log时也要确保缓冲区有足够的空间用于写入新的条目。
LGWR将一部分连续的buffer写入磁盘。LGWR写入的内容有:
·一个用户进程提交事务的提交记录。
·Redo log buffer,以下3个条件,满足其中一个就写入。
·每三秒写入一次。
·当日志缓冲区使用了三分之一。
·当DBWn进程向磁盘写入脏缓冲区,但需要写入的日志还没有写入。
注意:
在DBWn进程向磁盘写入脏数据之前,所有与修改数据相关的重做记录都必须被写入磁盘,这就是先写日志原则(write-ahead protocol)。如果DBWn发现有一些重做记录没有写入磁盘,会通知LGWR将它们写入,并等待将LGWR进程将重做日志缓冲区内的相关数据写入磁盘后,才能将数据缓冲区写入磁盘。
LGWR同步地向一个日志组的多个镜像成员写入。如果其中的一个成员文件损坏了,LGWR继续向其他成员写入,并将错误记录到LGWR进程的trace文件和alert log中。如果一个日志组的所有成员文件都损坏了,或者日志组由于未归档而暂时不可用,那么LGWR就无法继续工作了。
当用户执行了一句commit时,LGWR将提交记录放进日志缓冲区,并且将它与事务的重做条目一起立即写入磁盘。而相关的被修改的数据块要等待更高效的时机时才写入磁盘。这被成为快速提交(fast commit)机制。一个事务的提交记录及相关的重做条目将通过一个原子性(atomic)的写操作记录到磁盘上,这个单一事件决定了事务是否被成功地提交。尽管此时被修改的数据缓冲区还没有写入磁盘,Oracle 已经能够向用户返回事务提交成功的信息。
注意:
有时,如果重做日志缓冲区内空间不足,LGWR 进程会在事务提交前就将重做日志条目写入磁盘。这样的重做日志条目只有在相关事务提交后才能永久地存储。
当一个用户提交一个事务时,这个事务就被赋予了一个系统改变号system change number (SCN),Oracle 将在事务的重做条目中记录此编号。SCN是被记录在redo log中的,所以恢复(recovery)操作可以在RAC、分布式数据上同步地进行。
在数据修改操作较频繁时,LGWR 进程能够采取批量提交(group commits)技术向重做日志文件写入数据。例如,当一个用户提交了一个事务后,LGWR 进程会将此事务的重做条目(redo entry)写入磁盘,与此同时系统中的其他用户也可能在执行 COMMIT 语句。但是LGWR 进程需要在之前的写入操作完成后,才能为后续的提交事务写入重做信息。当第一个事务的重做条目被写入磁盘后,在此期间等待提交的事物的重做条目可以被一起写入磁盘,这比分别写入每个事务的重做条目所需的 I/O 操作要少。Oracle 通过这种办法减少了磁盘 I/O 并提升了 LGWR 进程的性能。如果系统中的提交频率一直很高,那么 LGWR 进程每次从重做日志缓冲区向磁盘的写入数据中都包含多个提交事务的信息。
检查点进程(CKPT)
当一个checkpoint发生时,Oracle必须更新所有数据文件的文件头,记录这个checkpoint的详细信息。这个动作是由CKPT进程完成的,但是CKPT进程并不将数据块写入磁盘,写入的动作总是由DBWn 进程完成的。
由企业管理器(Enterprise Manager)的 System_Statistics 监视器显示的DBWR checkpoints统计信息显示了系统中需要完成的检查点操作。
系统监控进程(SMON)
实例启动时如有需要,系统监控进程(system monitor process,SMON)将负责进行恢复(recovery)工作。此外,SMON 还负责清除系统中不再使用的临时段(temporary segment),以及为数据字典管理的表空间(dictionary managed tablespace)合并相邻的可用数据扩展(extent)。在实例恢复过程中,如果由于文件读取错误或所需文件处于脱机状态而导致某些异常终止的事务未被恢复,SMON 将在表空间或文件恢复联机状态后再次恢复这些事务。SMON进程定期检查自己是否被需要,系统内的其他进程发觉需要时也能够调用SMON 进程。
在 RAC 环境中,一个实例的 SMON 进程能够为出错的 CPU 或 实例进行实例恢复(instance recovery)。
进程监控进程(PMON)
当一个用户进程(user process)失败后,进程监控进程(process monitor,PMON)将对其进行恢复。PMON 进程负责清理数据缓冲区(database buffer cache)并释放用户进程使用的资源。例如,它可以重置活动事务表(active transaction table)的状态,释放锁,将某个进程ID从活动进程列表中移除。
PMON 进程会周期性地对调度器(dispatcher)和服务进程(server process)进行检查,重新启动停止运行的进程(不包括 Oracle 有意停止的进程)。PMON 进程还负责将实例和调度器进程的信息注册到网络监听器(network listener)。
同SMON一样,PMON进程定期检查自己是否被需要,系统内的其他进程发觉需要时也能够调用 PMON 进程。
恢复进程(RECO)
恢复进程recoverer process (RECO)用于分布式数据库结构,自动解决分布式事务的错误。一个节点的RECO进程会自动地连接到一个有疑问的分布式事务的相关其他数据库。当RECO重新连接到相关的数据库服务时,它会自动地解决有疑问的事务。并从相关数据库的活动事务表(pending transaction table)中移除和此事务有关的数据。
如果RECO进程无法连接到远程服务,RECO会在一定时间间隔后尝试再次连接。但是每次尝试连接的时间间隔会以指数级的方式增长。只有实例允许分布式事务时才会启动 RECO进程。实例中不会限制并发的分布式事务的数量。
作业队列进程(Job Queue Processes)
一般由两类进程组成:
作业队列协调进程coordinator job queue process (CJQn),起到对作业队列的监控作用。
执行作业的队列进程job queue processes (Jnnn),由CJQn完成调度产生。
作业队列进程用于批处理,执行用户job,可以将它们看做一个调度服务,用于调度Oracle实例上如PL/SQL语句或存储过程的job。提供开始的时间和调度的时间间隔,作业队列进程可以根据这个配置,自动地周期性地执行。
作业队列进程可以被动态地管理。可以允许作业队列客户端根据需要使用多个作业队列进程,当一个作业队列进程进入空闲状态(idle)后,其使用的资源将被释放。
动态的作业队列进程可以按指定的时间间隔运行大量的作业。用户的作业是由 CJQ 进程交给作业队列进程执行的。具体步骤如下:
1. 名为 CJQ0 的协调进程(coordinator process)定期地从系统JOB$表中选择需要运行的job。被选出的作业将按照时间排序。
2. CJQ0进程动态地产生job队列的slave进程来运行这些job,编号从J000-J999。
3. 作业队列进程执行一个由 CJQ 进程选出的作业。每个进程每次只能执行一个job。
4. 当一个工作队列进程执行完一个作业后,就能够接受下一个作业。如果此时系统中已经没有需要被调度的作业了,此进程将进入休眠状态(sleep state);此进程还会定期地苏醒(wake up)等待分配其他作业。如果在预设的时间内没有新的作业,此进程将终止。
初始化参数JOB_QUEUE_PROCESSES表示实例中可以并行执行的最大作业队列进程数。但是,客户端不应该假设所有的作业队列进程都用于执行job。
注意:
如果初始化参数JOB_QUEUE_PROCESSES被设置为 0,协调进程(CJQ )将不会被启动。
归档进程(ARCn)
归档进程(archiver process,ARCn)在发生日志切换(log switch)时将重做日志文件复制到指定的存储设备中。只有当数据库运行在ARCHIVELOG模式下,且自动归档功能被开启时,系统才会启动ARCn进程。
一个 Oracle 实例中最多可以运行 10 个 ARCn 进程(ARC0 到 ARC9)。如果当前的 ARCn 进程还不能满足工作负载的需要,LGWR 进程将启动新的ARCn进程。Alert log会记录LGWR启动ARCn进程。
如果预计系统存在繁重的归档任务,例如将进行大批量数据装载,可以通过设置初始化参数LOG_ARCHIVE_MAX_PROCESSES来指定多个归档进程,通过ALTER SYSTEM语句可以动态地修改该参数,增加或减少归档进程的数量。然而,通常不需要去改变该参数,该参数默认值为1,因为当系统负载增大时,LGWR进程会自动地启动新的ARCn进程。
队列监控进程(QMNn)
队列监控进程是一个可选择的进程,它提供Oracle工作流高级队列,用于监控信息队列。可以配置最多10个监控进程。这些进程类似作业队列进程与其他 Oracle 后台进程的区别在于,这两类进程出错不会导致整个实例出错。
调度进程(Dnnn)
调度进程Dispatcher(Dnnn)是一个可选的Oracle后台进程,只存在于共享服务器环境中。
内存管理进程(MMAN)
内存管理进程Memory Manager(MMAN)是一个SGA后台进程。10g新特性,自动共享内存管理Automatic Shared Memory Management(ASMM)启用时,会有这个新的后台进程。MMAN服务像是SGA内存的经纪人(SGA Memory Broker)一样,协调内存各组成部分的大小。SGA Memory Broker很清楚内存各组成部分的大小,和有待调整的操作。
恢复写入进程 (RVWR)
Flashback Database是Oracle10g的新增功能,在启动Flashback Database之后,它定期将已发生变化的块写入闪回日志的日志文件中。这些日志不是由传统的Log Writer (LGWR) 过程写入,而是由一种称作Recovery Writer (RVWR)的新过程写入。
这是Oracle10g的新增进程。闪回数据库是指将数据库返回到一个早前的数据库状态,闪回数据库特性提供了一种快速的方法,将数据库迅速地返回到早前的某个时间点,它不同于传统的基于时间的恢复。
数据库闪回只能从以下错误中恢复:
·由于逻辑错误导致的。
·由于用户错误导致的。
不能从介质错误中通过闪回特性恢复数据库。
闪回数据库所需的时间是与被改变的数据成正比的,而不是数据库的大小。
注意,一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点。
内存管理进程 (MMON)
内存管理进程memory monitor (MMON)是10g的新进程,它联合AWR新特性负责执行多种和可管理性相关(manageability-related)的后台任务,例如:
·当某个测量值(metrics)超过了预设的限定值(threshold value)后提交警告
·创建新的 MMON 隶属进程(MMON slave process)来进行快照(snapshot)
·捕获最近修改过的 SQL 对象的统计信息
它的slave进程是M000。
其他后台进程
Oracle 数据库中还可能运行其他后台进程。包括:
Memory Monitor Light (MMNL)进程负责执行轻量级的且频率较高的和可管理性相关的后台任务,例如捕获会话历史信息,测量值计算等。它与AWR一起起作用,将需要的buffer统计信息写入磁盘。
MMAN进程负责执行数据库系统的内部任务。
在使用了自动存储管理(Automatic Storage Management)的实例中,RBAL 进程负责协调磁盘组间的负载平衡工作。她可以使多个实例同时访问一个 ASM 磁盘(global open)。最终由 ORBn 进程实际执行数据扩展的负载均衡。实例中可以运行多个 ORBn 进程,分别为ORB0,ORB1,以此类推。
当数据库实例使用 ASM 磁盘组时,还要启动 OSMB 进程。此进程负责和 ASM 实例(Automatic Storage Management instance)通信。
LMS(Global Cache Service)进程,在RAC环境中存在,该进程管理资源,并提供实例资源交互控制。
Change Tracking Writer (CTWR)进程,是10g中的新进程,用于对最近的改变的块进行跟踪,让RMAN可以更快地进行增量备份。