首页 > 代码库 > [转]Oracle DB进程体系结构

[转]Oracle DB进程体系结构

1、进程体系结构
 
Oracle DB 系统中的进程主要分为两组:
? 运行应用程序或Oracle 工具代码的用户进程
? 运行Oracle DB 服务器代码的Oracle DB 进程(包括服务器进程和后台进程
当用户运行应用程序或Oracle 工具(例如SQL*Plus)时,Oracle DB 会创建一个“用户进程”以运行该用户的应用程序。
Oracle DB 还会创建一个“服务器进程”以执行该用户进程发出的命令,可以连接到oracle实例,它在用户建立会话时启动
此外,Oracle 服务器还会为实例创建一组“后台进程”,在启动oracle实例时启动,这些进程不仅彼此交互,而且还与操作系统交互,以便管理内存结构,通过异步执行I/O 操作将数据写入磁盘,并执行其它需要的任务。
对于不同的Oracle DB 配置,进程结构也有所不同,具体取决于操作系统和选择的Oracle DB 选件。已连接用户的代码可以配置为专用服务器或共享服务器
专用服务器:对于每个用户,运行数据库应用程序的用户进程都由执行Oracle DB 服务器代码的专用服务器进程提供服务。
共享服务器:不必为每个连接都提供一个专用服务器进程。分派程序将多个传入网络会话请求引到共享服务器进程池。共享服务器进程为所有客户机请求提供服务。
 
 
 
服务器进程
Oracle DB 创建服务器进程以处理连接到实例的用户进程的请求。在某些情况下,当应用程序和Oracle DB 在同一台计算机上操作时,可以将用户进程和相应的服务器进程合并为
一个进程,以减少系统开销。但是,当应用程序和Oracle DB 在不同计算机上运行时,用户进程总是通过单独的服务器进程与Oracle DB 通信。
代表每个用户的应用程序创建的服务器进程可以执行以下一项或多项操作:
? 对通过应用程序发出的SQL 语句进行语法分析和运行
? 从磁盘上的数据文件中将必要的数据块读取到SGA 的共享数据库缓冲区中(如果相应的数据块目前尚未在SGA 中)
? 返回结果,使应用程序可以处理信息
 
后台进程
为了最大限度地提高性能并满足多个用户的需要,多进程Oracle DB 系统使用一些称为“后台进程”的附加Oracle DB 进程。一个Oracle DB 实例可以有多个后台进程。
 
非RAC、非ASM 环境中的常见后台进程包括:
? 数据库写进程(DBWn)
? 日志写进程(LGWR)
? 检查点进程(CKPT)
? 系统监视器进程(SMON)
? 进程监视器进程(PMON)
? 恢复器进程(RECO)
? 作业队列进程
? 归档进程(ARCn)
? 队列监视器进程(QMNn)
 
在更高级配置(如RAC)中可能还会有其它后台进程。有关后台进程的详细信息,可参见V$BGPROCESS视图。
有些后台进程是在启动实例时自动创建的,而其它后台进程是按需要启动的。
 
其它进程结构不是特定于单个数据库的,而是可以在同一个服务器上的多个数据库间共享。
Grid Infrastructure 进程和网络进程即属于此类。
Linux 和Unix 系统上的Oracle Grid Infrastructure 进程包括:
? ohasd:Oracle 高可用性服务守护程序,负责启动Oracle Clusterware 进程
? ocssd:集群同步服务守护程序
? diskmon:磁盘监视器守护程序,负责HP Oracle Exadata Storage Server 的输入和输出防护
? cssdagent:启动、停止和检查CSS 守护程序ocssd 的状态
? oraagent:扩展集群件以支持特定于Oracle 的要求和复杂资源
? orarootagent:一个专用的Oracle 代理进程,可帮助管理root 用户所拥有的资源(如网络)
 
 
 
 
2、数据库写进程(DBWn)
 
 
 
数据库写进程(DBWn) 可以将缓冲区的内容写入数据文件。DBWn进程负责将数据库缓冲区高速缓存中经过修改的缓冲区(灰数据缓冲区)写入磁盘。虽然对于大多数系统来说,一个数据库写进程(DBW0) 已经足够,但如果系统需要频繁修改数据,则可以配置附加进程(DBW1到DBW9以及DBWa到DBWj)以改进写性能。这些附加DBWn进程在单处理器系统中没有用。
 
当数据库缓冲区高速缓存中的某个缓冲区被修改时,系统会将其标记为灰数据缓冲区,并将其添加到按SCN 顺序存放的灰数据缓冲区的LRUW(LRU 写)列表中。因此,该顺序与为这些更改的缓冲区写入重做日志的重做操作的顺序相匹配。当缓冲区高速缓存中的可用缓冲区的数量低于某个内部阈值(达到服务器进程发现很难获取可用缓冲区的程度)时,DBWn会将灰数据缓冲区写入数据文件,写入顺序与按照LRUW 列表的顺序修改灰数据缓冲区的顺序相同。
 
 
SGA 包含的内存结构具有重做流中的某个位置的重做字节地址(RBA),当实例发生故障时,将从该位置开始恢复。此结构充当指向重做的指针,并且由CKPT 进程按照每三秒一次的频率写入控制文件。由于DBWn按照SCN 顺序写入灰数据缓冲区,而重做按照SCN 顺序执行,因此每当DBWn从LRUW 列表写灰数据缓冲区时,还会将SGA 内存结构中保持的指针前移,以便实例恢复(如果需要)从近似正确的位置开始读取重做,并避免不需要的I/O。这称为“增量检查点”。
 
注:还有其它一些DBWn可能会执行写操作的情况,例如,当表空间被设置为只读或被置于脱机状态时。在这些情况下,不会出现增量检查点,因为仅属于相应数据文件的灰数据缓冲区在写入数据库时的顺序与SCN 顺序无关。
 
LRU 算法将更频繁访问的块保存在缓冲区高速缓存中,这样,在将缓冲区写入磁盘时,缓冲区不大可能包含将很快有用的数据。
DB_WRITER_PROCESSES初始化参数指定DBWn进程数。DBWn进程的最大数目为20。
 
如果用户在启动过程中未指定该进程数,Oracle DB 将根据CPU 和处理器组的数量来决定如何设置DB_WRITER_PROCESSES。
在以下情况下,DBWn进程将灰数据缓冲区写入磁盘:
? 当服务器进程在扫描阈值数目的缓冲区之后找不到干净的可重用缓冲区时,通知DBWn执行写操作。DBWn在执行其它处理的同时,将灰数据缓冲区异步写入磁盘。
?DBWn定期写缓冲区以推进检查点。检查点是重做线程(日志)中开始执行实例恢复的位置。该日志位置由缓冲区高速缓存中最旧的灰数据缓冲区确定。
在所有情况下,DBWn均执行成批(多块)写操作以提高效率。多块写操作中写入的块数因操作系统而异。
 
 
 
3、志写进程(LGWR)
 
 
日志写进程(LGWR) 负责管理重做日志缓冲区,方法是将重做日志缓冲区条目写入磁盘上的重做日志文件。LGWR 会写入自上次写入以来复制到缓冲区中的所有重做条目。
重做日志缓冲区是循环缓冲区。当LGWR 将重做日志缓冲区中的重做条目写入重做日志文件后,服务器进程可以将新条目复制到重做日志缓冲区中的那些已写入磁盘的条目之上。
 
 
LGWR 的写入速度通常足够快,可以确保缓冲区中始终有空间可供新条目使用,即使对重做日志的访问量很大时也是如此。LGWR 将缓冲区的一个连续部分写入磁盘。
LGWR 在以下情况下执行写操作:
? 用户进程提交事务处理时
? 重做日志缓冲区的三分之一已满时
? 重做日志缓冲区达到1M的redo条目
? 在DBWn进程将经过修改的缓冲区写入磁盘(如果需要)之前
? 每隔3 秒
 
必须在与缓冲区更改相关联的所有重做记录写入磁盘后,DBWn才可以向磁盘写入经过修改的缓冲区(先行写协议)。
如果DBWn发现一些重做记录尚未写入,则会通知LGWR将这些重做记录写入磁盘,并等待LGWR 完成重做日志缓冲区的写入操作,然后再写数据缓冲区。LGWR 将向当前的日志组进行写入。如果该组中的某个文件已损坏或不可用,LGWR 将继续写入该组中的其它文件,并在LGWR 跟踪文件和系统预警日志中记录一个错误。如果某个组中的所有文件均已损坏,或者该组由于尚未归档而不可用,则LGWR无法继续工作。
 
 
当用户发出COMMIT语句时,LGWR 会将一条提交记录放在重做日志缓冲区中,并立即将该记录随同事务处理的重做日志一起写入磁盘中。对数据块进行的相应更改将延迟,直到能够更为高效地写入这些更改时才会执行。这称为“快速提交机制”。包含事务处理提交记录的重做条目的原子写是单个事件,该事件可以确定事务处理是否已提交。OracleDB 为提交的事务处理返回一个成功代码,尽管数据缓冲区尚未写入磁盘中。
 
如果需要更多缓冲区空间,LGWR 有时会在提交事务处理之前写入重做日志条目。仅当稍后提交了该事务处理之后,这些条目才会成为永久条目。当用户提交事务处理时,该事务处理将被分配一个系统更改号(SCN),Oracle DB 将该号码与事务处理的重做条目一起记录在重做日志中。SCN 记录在重做日志中,以便可以在Real Application Clusters 和分布式数据库之间同步恢复操作。
 
当活动比较频繁时,LGWR 可以通过使用组提交来写入重做日志文件。例如,假设用户提交一个事务处理。LGWR 必须将该事务处理的重做条目写入磁盘。发生该情况时,其他用户将发出COMMIT语句。但是,LGWR 在完成其上一个写操作之前,无法写入重做日志文件以提交这些事务处理。在第一个事务处理的条目写入重做日志文件之后,可以在一次操作中将正在等待(尚未提交)的事务处理的整个重做条目列表写入磁盘,这比分别处理各个事务处理条目所需的I/O 要少。因此,Oracle DB 可以将磁盘I/O 降至最少,并最大限度地提高LGWR 的性能。如果提交请求的速率一直较高,则从重做日志缓冲区进行的每个写操作(由LGWR 执行)都可能包含多个提交记录。
 
 
 
4、检查点进程(CKPT)
“检查点”是一种数据结构,用于定义数据库的重做线程中的系统更改号(SCN)。
检查点被记录在控制文件和每个数据文件头中。它们是恢复操作的关键元素。
 
出现检查点时,Oracle DB 必须更新所有数据文件的头,以记录该检查点的详细信息。这是由CKPT 进程完成的。CKPT 进程不会将块写入磁盘;该工作都是由DBWn执行。文
件头中记录的SCN 可保证将该SCN 之前对数据库块进行的所有更改写入到磁盘中。
Oracle Enterprise Manager 中的SYSTEM_STATISTICS监视器将显示统计信息DBWR 检查点,由其指示已完成的检查点请求的数目。
 
 
 
5、系统监视器进程(SMON)
 
系统监视器进程(SMON) 在实例启动时执行恢复(如果需要)。
SMON 还负责清除不再使用的临时段。如果在实例恢复过程中由于文件读取或脱机错误跳过任何已终止的事务处
理,则SMON 将在表空间或文件重新联机时恢复这些事务处理。
SMON 定期检查以查看是否需要该进程。其它进程在检测到需要SMON 时也可以调用它。
 
 
 
6、程监视器进程(PMON)
进程监视器进程(PMON) 在用户进程失败时执行进程恢复。PMON 负责清除数据库缓冲区高速缓存以及释放该用户进程使用的资源。例如,它重置活动事务处理表的状态,释放锁,并且从活动进程列表中删除该进程ID。
 
PMON 定期检查分派程序和服务器进程的状态,并重新启动任何已停止运行(但并非Oracle DB 故意终止)的分派程序和服务器进程。PMON 还将有关实例和分派程序进程的信息注册到网络监听程序
与SMON 一样,PMON 定期检查以查看是否需要执行;如果其它进程检测到需要该进程,也可以调用它。
 
 
 
7、恢复器进程(RECO)
恢复器进程(RECO) 是用于分布式数据库配置的后台进程,自动解决涉及分布式事务处理的故障。实例的RECO 进程会自动连接到其它那些与有问题的分布式事务处理有关的数据库
当RECO 进程在涉及到的数据库服务器之间重新建立连接时,它会自动解决所有有问题的事务处理,从每个数据库的暂挂事务处理表中删除所有对应于已解决的有问题事务处理的行
如果RECO 进程无法与远程服务器连接,RECO 会在某个计时间隔之后自动尝试重新连接。但是,RECO 在重新尝试连接之前,会等待一段时间,此时间会不断增加(呈幂指数增长)。
 
 
 
8、归档进程(ARCn)
 
发生日志切换之后,归档进程(ARCn) 会将重做日志文件复制到指定的存储设备,可以收集事务重做数据,并将该数据传输到备用目标位置
仅当数据库处于ARCHIVELOG模式且已启用自动归档时,才会存在ARCn进程。
如果预计归档的工作负荷很重(例如在成批加载数据期间),则可以使用LOG_ARCHIVE_MAX_PROCESSES初始化参数增加最大归档进程数。
ALTER SYSTEM语句可以动态更改该参数的值,以增加或减少ARCn进程数。
 
 
 
9、其它进程
? MMON:执行与可管理性相关的后台任务
? MMNL:执行与可管理性相关的频繁的、轻量级任务
? MMAN:执行自动内存管理任务
? CJQ0:运行批处理中使用的用户作业
? QMNC:监视流高级排队消息队列
 
 
还有其它几种可能运行的后台进程,它们包括:
可管理性监视器进程(MMON),可执行各种与可管理性相关的后台任务,例如:
? 每当给定的度量超过其阈值时发出预警
? 通过衍生附加进程(MMON 从属进程)获取快照
? 捕获近期已做修改的SQL 对象的统计值
 
轻量可管理性监视器进程(MMNL),可执行与轻量可管理性相关的频繁任务,例如会话历史记录捕获和度量计算。
 
内存管理器进程(MMAN),用于内部数据库任务。它管理自动内存管理处理,以帮助在需要内存时动态分配内存,以避免发生内存不足或缓冲区高速缓存性能下降的情况。
 
重新平衡进程(RBAL) 协调自动存储管理实例中的磁盘组的重新平衡活动。它负责对自动存储管理磁盘执行全局打开操作。
 
ARBn执行自动存储管理实例中的实际重新平衡数据区移动。可能同时存在多个这样的进程,这些进程名为ARB0、ARB1 等等。
 
自动存储管理进程(ASMB) 存在于使用自动存储管理磁盘组的数据库实例中。它与自动存储管理实例通信。
 
作业队列进程用于批处理。它们运行用户作业,可将它们视为调度程序服务,用于将作业作为Oracle DB 实例上的PL/SQL 语句或过程来调度。
 
CJQ0 的协调程序进程定期从系统JOB$表中选择需要运行的作业。CJQ0 进程动态衍生作业队列从属进程(J000 到J999)以运行作业。作业队列进程运行由CJQ0 进程选择执行的作业之一。这些进程一次运行一个作业。
 
队列监视器进程(QMNC) 是监视消息队列的Oracle Streams Advanced Queuing 的可选后台进程。最多可以配置10 个队列监视器进程。
 
来源:http://blog.csdn.net/rlhua/article/details/12232625