本节书摘来自异步社区出版社《Oracle数据库管理与维护实战》一书中的第2章,第2.4节,作者: 何伟娜 , 常建功,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.4 Oracle后台进程结构
Oracle数据库管理与维护实战
后台进程存在于操作系统中,和实例同时启动,由Oracle服务器管理。后台进程维持数据库的物理结构和内存结构,如图2-9所示。
后台进程运行时会创建一个跟踪文件,用以保存实例的操作。后台进程跟踪文件的命名方法和位置随操作系统和数据库版本的不同而不同。一般来说,跟踪文件含有后台进程名或后台进程的操作系统进程ID。用户可以通过设置初始化参数文件的BACKGROUND_DUMP_DEST参数来规定后台进程跟踪文件的位置,但是有些版本的Oracle忽略这种设置。
排除数据库故障时,跟踪文件就显得非常重要。影响后台进程的严重问题通常记录在数据库的跟踪文件上。跟踪文件位于BACKGROUND_DUMP_DEST目录下。这个目录默认是%ORACLE_BASE%/admin/<实例名称>/bdump目录。
2.4.1 SMON系统监控进程
在数据库启动时,SMON系统监视进程会使用联机重做日志文件恢复崩溃的实例。实例启动后,SMON还会清除不经常使用的临时段、合并表空间中连续的自由空间。在并行数据库服务器环境下,SMON对有故障的CPU或实例进行实例恢复。
Oracle会定期唤醒SMON,以检查系统是否需要它。其他进程也可以调用SMON系统监控进程。
2.4.2 PMON进程监控进程
PMON进程主要用来监视用户进程的运行,当用户进程失败时,清除失败的用户进程和失败进程所占用的资源。PMON能清除数据库缓冲区的数据,断开异常中断的连接,释放失败进程对数据库对象的锁定,将失败进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动。
同SMON进程一样,PMON进程会被定期地唤醒,以检查是否需要它执行任务;其他进程也可以调用PMON进程。
2.4.3 DBWR数据库写入进程
DBWR进程负责管理数据库缓冲区及数据字典缓冲区。DBWR以批的形式将数据库缓冲区的内容写到磁盘上。当数据库缓冲区的内容被修改时,服务器进程会对已修改的数据块做已修改标记,但不立即启动DBWR进程,而是等被修改的数据块累积到一定数量后才将修改的数据保存到磁盘。
发生下面情况会激发DBWR写磁盘。
当服务器进程向Dirty List添加一个新的已修改数据块时,发现Dirty List已达到指定的长度,服务器进程就通知DBWR写磁盘。这个长度由初始化参数DBBLOCK
WRITE_BATCH决定。
当服务器进程要向数据库缓冲区写数据时,如果搜索LRU清单超过DB_BLOCK_MAX SCAN_CNT次,通知DBWR写磁盘,以腾出空间。
当超时发生(每3秒钟)时,DBWR写磁盘。
当检查点发生时,LGWR通知DBWR写磁盘。
一个数据库实例中只有一个SMON和一个PMON进程,但有的操作系统可以设置多个DBWR进程。使用多个DBWR进程有助于减少DBWR冲突。DBWR的数量由初始化参数DB_WRITE_PROCESS决定。如果系统支持异步I/O,用户可以创建多个DBWR I/O从进程。DBWR I/O从进程的数量由初始化参数DB_I/O_SLAVES参数决定。
如果配置了多个DBWR进程,DBWR就不再叫作DBWR,而分别称DBW0、DBW1、DBW2……
2.4.4 LGWR日志写入进程
LGWR进程负责将重做日志缓冲区的内容写入联机重做日志文件。正常情况下,LGWR是唯一从重做日志缓冲区中读数据并向联机重做日志文件写数据的进程。LGWR按顺序向联机重做日志文件写数据。
LGWR是向一组联机重做日志文件写数据,如果一个联机重做日志文件损坏,LGWR则向组内的其他联机重做日志文件写,同时将出错信息写到LGWR跟踪文件和系统的警告日志文件中。
重做日志缓冲区是个循环缓冲区,Oracle只有在缓冲区数据写到联机重做日志文件后才允许新的重做数据覆盖旧的缓冲区。
Oracle实行这样的机制,当数据库缓冲区的修改数据要写到磁盘上,Oracle要先通知LGWR将重做信息写入磁盘。也就是说,当数据库要改变时,LGWR总是要先记录改变内容,然后才允许改变发生。这样如果发生意外,用户可以从重做日志文件中恢复。所以重做日志缓冲区中总是包含着数据库的最新状态。
Oracle使用一种“快速提交机制”,当用户发出提交命令时,先将提交记录放入重做日志缓冲区,与其相应的数据要等到写数据文件时才放到重做日志缓冲区。
当提交一个事务时,Oracle为这个事务分配一个系统改变号(System Change Number) SCN。SCN与事务的重做数据一起放在重做日志文件中。在并行服务器结构和分布式数据库系统中,SCN可以实现数据库同步恢复。
下列情况会激发LGWR写磁盘。
当用户发出commit命令时,LGWR写磁盘。
当重做日志缓冲区的1/3满时,LGWR写磁盘。
当DBWR或DBWn要写磁盘时,LGWR写磁盘。
当超时发生(每3秒钟)时,LGWR写磁盘。
2.4.5 CKPT检查点进程
检查点进程的作用是控制数据文件、控制文件和重做日志文件之间的协调同步,检查点进程一般和数据库写进程DBWR合作。检查点是在数据库中做一个记号,表示记号之前的数据库是完全正确的,如果数据发生意外,可以恢复到之前这个完全正确的检查点,如图2-10所示。
检查点进程在检查点出现时,对全部数据文件标题进行修改,标识该检查点。在通常的情况下,该任务由LGWR执行。如果检查点明显地降低系统性能,可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现。对于许多应用情况,CKPT进程不是必须有的。只有当数据库有许多数据文件、LGWR在检查点时明显地降低性能时才运行CKPT。CKPT进程不将块写入磁盘,该工作是由DBWR完成的。检查点进程由初始化参数CHECKPOINT_PROCESS设定,值为True表示使用检查点进程,而值为False表示不使用,缺省时为False。下列情况会产生检查点。
上一个检查点之后,超过了初始化参数LOG_CHECKPOINT_TIMEOUT设定的时间,产生检查点。
上一个检查点之后,当写入磁盘的重做日志块数量超过了初始化参数LOG_ CHECKPOINT_INTERVAL的值时,产生检查点。
日志文件切换时,产生检查点。
实例关闭时,产生检查点。
DBA发出强制命令要求产生检查点时,产生检查点。
表空间脱机时(offline),产生检查点。
2.4.6 RECO恢复进程
恢复进程用于恢复分布式数据库环境中失败的事务。数据库恢复进程会自动连接失败的数据库实例,连接成功后,将删除失败的事务和对应的数据行;如果连接失败,恢复进程会在一定时间后再次尝试连接。
要使用恢复进程,数据库实例必须允许分布式事务处理,同时初始化参数DISTRIBUTED_ TRANSACTIONS大于0。
2.4.7 ARCH归档进程
LGWR进程以循环方式向联机重做日志文件写入日志数据,当写满第一个日志文件后,就开始向第二个日志文件写入;第二个日志文件被写满后,再向第三个日志文件写入。当最后一个重做日志文件被写满,LGWR就又重写第一个重做日志文件,并将以前的数据覆盖。
ARCH进程作用,就是将填满的重做日志文件转储到指定的设备上。这样先前的重做日志文件不至于被覆盖。
数据库必须在归档(Archivelog)模式下才能使用归档进程。在初始化参数LOG_ ARCHIVE_MAX_PROCESSES内用户可以设置数据库最大的可使用归档进程。
2.4.8 SNPn作业队列进程
SNPn进程用来完成一些应用程序的周期性执行工作。SNPn能周期性地唤醒作业队列中的作业,并完成这些作业,自动刷新分布式数据库中表的快照。
在分布式事务处理时,一个数据库实例可以启动36个快照刷新和作业队列进程,这些后台进程的名字以字母SNP开头,以数字或字母结束。当这些进程被定期唤醒,则自动刷新分布式系统中表的快照和执行DBMS_JOB包的数据库作业。
初始化参数JOB_QUEUE_PROCESSES用于设定每一个实例中的刷新和作业进程数。
2.4.9 LCKn锁进程
LCKn锁进程用于锁定数据库对象不被数据库其他进程更改。LCKn锁进程用于并行数据库环境中,在并行数据环境中经常会出现多个进程同时读取同一数据库对象,例如同时读取同一张数据库表。考虑到安全性和数据的一致性,当一个进程在更改这个表时,使用LCKn锁进程锁定这个表,其他进程就不能对这张表进行更改。锁进程最多有10个,分别命名为LCK0~LCK9。LCKn锁进程的个数由参数GC_LCK_PROCS决定。
2.4.10 Dnnn调度进程
调度进程是共享服务器的一部分,调度进程可以减少多重连接所需要的资源。一个数据库服务器可以建立多个调度进程,支持Oracle服务器的每一个协议都至少创建一个调度进程。调度进程根据服务器的网络配置,在数据库启动时创建,也在数据库启动后再创建或取消。
2.4.11 Snnn共享服务器进程
Snnn共享服务器进程存在于共享服务器中,给共享服务器提供类似于专用服务器的数据库连接,只是共享服务器不与特定用户进程关联。Snnn共享服务器进程的数量在初始化参数SHARED_SERVERS和MAX_SHARED_SERVERS参数之间。
2.4.12 QMNn队列监视进程
QMNn队列监视进程是Oracle高级队列选项所用的后台进程,用于监视实例中的消息队列。初始化参数AQ_TM_PROCESSES值指定了队列监视进程的个数,最大可设为10。QMNn进程和SNPn进程的失败不会引起实例的失败,Oracle会自动重启这些进程;而其他进程的失败则会引起整个实例的失败。