Oracle后台进程

转自 http://blog.chinaunix.net/uid-20807166-id-1833979.htmlhtml

 

后台进程

为了实现为多用户提供服务且保证系统性能,在一个多进程  Oracle 系统( multiprocess Oracle system)中,存在多个被称为后台进程( background process)的  Oracle 进程。
一个  Oracle 实例中能够包含多种后台进程,这些进程不必定所有出如今实例中。系统中运行的后台进程数量众多,用户能够经过 V$BGPROCESS 视图查询关于后台进程的信息。 Oracle 实例中可能运行的后台进程有:
·数据写入进程( DBWn
·日志写入进程( LGWR
·检查点进程( CKPT
·系统监控进程( SMON
·进程监控进程( PMON
·恢复进程( RECO
·做业队列进程
·归档进程( ARCn
·队列监控进程( QMNn
·其余后台进程
在许多操做系统中,后台进程在实例启动时可以被自动地建立。

图示

下图显示了后台进程如何与  Oracle 数据库的各部分交互,后续将讲述这些后台进程。
多进程  Oracle  实例中的后台进程
本图中间为  SGA。上部为  RECOPMON,及  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)算法选择出的,最近最少使用的 bufferDBWn进程将冷端的、脏的 buffer写入磁盘,这样用户进程就能够查找冷端、干净的 buffer用于将新的数据块读入 cache中。当一个 buffer被用户进程修改 (弄脏 ),此 buffer就再也不是 free buffer,不能用于新数据的写入。若是 free buffer数量过少,用户进程就会找不到足够的空间用于数据写入。而 DBWn进程有效地管理了 buffer cache,让用户进程老是可以得到 free buffer
DBWn进程老是将冷端、脏 buffer写入磁盘, DBWn在改善查找 free buffer性能的同时,也另最近频繁使用的 buffer保留在内存中。例如,储存那些频繁访问且较小的表或索引的数据块,能够 keepcache中,不必反复地从磁盘中读取。因为 LRU算法将访问频率高的数据块保留在 buffer cache中,因此一个 buffer被写入磁盘中,该 buffer所包含的数据被立刻访问的几率较小。
知足如下条件时, DBWn进程会将脏数据缓冲区 (dirty buffers)写入磁盘:
·当服务器进程扫描了必定数量的 buffer以后,没有找到干净的可用的 buffer,它通知 DBWn写入。 DBWnbuffer写入磁盘的操做是异步的,由于在 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 processSMON)将负责进行恢复( recovery)工做。此外, SMON 还负责清除系统中再也不使用的临时段( temporary segment),以及为数据字典管理的表空间( dictionary managed tablespace)合并相邻的可用数据扩展( extent)。在实例恢复过程当中,若是因为文件读取错误或所需文件处于脱机状态而致使某些异常终止的事务未被恢复, SMON 将在表空间或文件恢复联机状态后再次恢复这些事务。 SMON进程按期检查本身是否被须要,系统内的其余进程发觉须要时也可以调用 SMON 进程。
          RAC 环境中,一个实例的  SMON 进程可以为出错的  CPU  实例进行实例恢复( instance recovery)。

进程监控进程(PMON)

当一个用户进程( user process)失败后,进程监控进程( process monitorPMON)将对其进行恢复。 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 processARCn)在发生日志切换( 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)

         调度进程 DispatcherDnnn)是一个可选的 Oracle后台进程,只存在于共享服务器环境中。

内存管理进程(MMAN)

内存管理进程 Memory Manager(MMAN)是一个 SGA后台进程。 10g新特性,自动共享内存管理 Automatic Shared Memory Management(ASMM)启用时,会有这个新的后台进程。 MMAN服务像是 SGA内存的经纪人 (SGA Memory Broker)同样,协调内存各组成部分的大小。 SGA Memory Broker很清楚内存各组成部分的大小,和有待调整的操做。

恢复写入进程 (RVWR)

Flashback DatabaseOracle10g的新增功能,在启动 Flashback Database以后,它按期将已发生变化的块写入闪回日志的日志文件中。这些日志不是由传统的 Log Writer (LGWR) 过程写入,而是由一种称做 Recovery Writer (RVWR)的新过程写入。
这是 Oracle10g的新增进程。闪回数据库是指将数据库返回到一个早前的数据库状态,闪回数据库特性提供了一种快速的方法,将数据库迅速地返回到早前的某个时间点,它不一样于传统的基于时间的恢复。
         数据库闪回只能从如下错误中恢复:
·因为逻辑错误致使的。
·因为用户错误致使的。
不能从介质错误中经过闪回特性恢复数据库。
闪回数据库所需的时间是与被改变的数据成正比的,而不是数据库的大小。
注意,一旦 resetlogs以后,将不能再 flashbackresetlogs以前的时间点。

内存管理进程 (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 进程,分别为 ORB0ORB1,以此类推。
当数据库实例使用  ASM 磁盘组时,还要启动  OSMB 进程。此进程负责和  ASM 实例( Automatic Storage Management instance)通讯。
LMSGlobal Cache Service)进程,在 RAC环境中存在,该进程管理资源,并提供实例资源交互控制。
Change Tracking Writer (CTWR)进程,是 10g中的新进程,用于对最近的改变的块进行跟踪,让 RMAN能够更快地进行增量备份。
相关文章
相关标签/搜索