Oracle数据库基础与应用教程
上QQ阅读APP看书,第一时间看更新

4.2 进程结构

Oracle进程主要由用户进程、服务器进程和后台进程组成。用户进程通过监听器来访问Oracle实例,触发生成一个服务器进程,用来处理该用户进程的请求进程。后台进程主要用来对Oracle数据库进行各种维护和操作。

4.2.1 用户进程

用户进程运行于客户端,将用户的SQL语句传递给服务器进程,是一个需要与Oracle服务器进行交互的程序。用户进程向Oracle服务器发出调用,但它并不与Oracle服务器直接交互,而是通过服务器进程与Oracle服务器进行交互。

当用户运行一个Oracle工具或应用程序(如SQL*Plus)时创建用户进程,当用户退出应用程序时结束用户进程。

连接(Connection)与会话(Session)这两个概念与用户进程之间具有紧密的关系,但二者又具有不同的含义。连接是用户进程和服务器进程之间的通信通道。这个通信通道是通过进程间的通信机制(在同一主机上运行用户进程和Oracle进程)或网络软件(当数据库应用程序与Oracle服务器运行在不同的主机上时,就需要通过网络来通信)来建立的。

会话是用户通过用户进程与Oracle实例创建的连接,如当用户启动SQL*Plus时必须提供有效的用户名和密码,服务器经过认证后开始创建会话。从用户开始连接到用户断开连接,或退出数据库应用程序期间,会话一直持续。同一个用户可以同时创建多个会话,如图4-3所示,以用户hr两次连接到同一个Oracle实例,创建两个会话。

图4-3 连接和会话

当Oracle运行在专用服务器模式下时,为每一个用户会话创建一个服务器进程。而当Oracle运行在共享服务器模式下时,多个用户会话可以共享同一个服务器进程。

4.2.2 服务器进程

服务器进程用来处理连接到Oracle实例的用户进程提交的请求,是一个直接与Oracle服务器交互的程序。在应用程序和Oracle服务器运行在一台主机的情况下,可以将用户进程和对应的服务器进程合并来降低系统开销。但是当应用程序和Oracle服务器运行在不同的主机时,用户进程必须通过一个服务器进程来连接Oracle服务器。

服务器进程可以执行以下工作内容。

➢ 解析和执行应用程序提交的SQL语句。

➢ 如果数据在SGA中不存在,则将所需的数据块从磁盘上的数据文件读入SGA的数据库缓冲区高速缓存。

➢ 以应用程序可以理解的形式返回SQL语句的执行结果。

服务器进程可以分为以下两类。

(1)专用服务器进程

一个服务器进程对应一个用户进程,主要运行在专用服务器模式下。

(2)共享服务器进程

一个服务器进程对应多个用户进程,轮流为用户进程提供服务,主要运行在共享服务器模式下。

4.2.3 后台进程

后台进程是Oracle的程序,用来管理数据库的读写、恢复和监视等相关工作。服务器进程主要是通过后台进程和用户进程进行联系和沟通的,并由后台进程和用户进程进行数据的交换。在Linux系统上,Oracle后台进程相对于操作系统进程,一个Oracle后台进程将启动一个操作系统进程;在Windows系统上,Oracle后台进程相对于操作系统线程,打开任务管理器,只能看到一个oracle.exe进程(但是通过其他工具,可以看到包含在该进程中的线程)。数据库的物理结构与内存结构之间的交互需要通过后台进程来完成。

一个Oracle实例中可以包含多种后台进程,这些进程不一定全部出现在实例中。系统中运行的后台进程数量非常多,可以通过V$BGPROCESS动态性能视图查询后台进程的信息。

1. DBWn

DBWn(数据库写入进程)将数据库缓冲区高速缓存(Database Buffer Cache)中修改后的数据块写入数据文件中。Oracle数据库最多允许36个数据库写入进程(DBW0~DBW9和DBWa~DBWj)。使用DB_WRITER_PROCESSES初始化参数指定DBWn进程的进程数量。

Oracle采用最近最少使用(Least Recently Used,LRU)算法保持内存中的数据块是最近使用的,使I/O操作最小。数据库缓冲区高速缓存内的某个缓冲区被修改过以后,将被标记为脏缓冲区。DBWn进程将LRU的脏缓冲区写入磁盘文件,使得能够找到LRU的干净缓冲区,用于将新数据块写入到数据库缓冲区高速缓存内。当某个缓冲区的内容被用户进程修改后,此缓冲区将不能再用于写入新数据。如果数据库缓冲区高速缓存内的可用缓冲区数量过少,就无法找到足够的空间写入新的数据块。DBWn进程能够有效地管理数据库缓冲区高速缓存,保证总是能够获得可用的缓冲区。

DBWn进程总是将LRU的脏缓冲区写入磁盘文件,这样既减少了找到可用缓冲区的时间,同时令最近使用较频繁的缓冲区能够保留在内存中。例如,存储访问频率较高的小表或索引的数据块能够被保留在内存中,而不需要反复地从磁盘文件中读取。

以下是DBWn后台进程工作触发条件。

➢ 出现检查点。

➢ 脏数据块的数量达到阈值。

➢ 不能找到任何空闲的缓冲区。

➢ 出现超时。

➢ 使表空间处于脱机状态。

➢ 使表空间处于只读模式。

➢ 删除或截断表。

➢ 开始备份表空间。

2. LGWR

LGWR(日志写入进程)是一个负责管理重做日志缓冲区的Oracle后台进程,它将重做日志缓冲区(Redo Log Buffer)中的重做日志条目按照一定的条件顺序写入联机重做日志文件。LGWR是一个必须和用户进程通信的进程。

当LGWR将日志缓冲区的重做日志条目写入联机重做日志文件以后,服务器进程可以将新的重做日志条目写入到重做日志缓冲区。通常LGWR写入非常快,确保重做日志缓冲区总有空间可写入新的重做日志条目。

以下是LGWR后台进程工作触发条件。

➢ 通过COMMIT语句提交当前事物。

➢ 每隔3秒钟。

➢ 当重做日志缓冲区中的记录超过1 MB。

➢ 当重做日志缓冲区中的记录超过三分之一。

➢ 在DBWn进程将数据库缓冲区高速缓存中修改的块写入到数据文件时。

3. CKPT

CKPT(检查点进程)进程用于发出检查点,同步控制文件、数据文件和联机重做日志文件。CKPT进程会更新控制文件和数据文件的头信息,同时会促使DBWn进程将所有的脏缓冲区写入到数据文件中。CKPT进程写入控制文件和数据文件头部的检查点信息包括检查点位置、SCN(系统更改号)、重做日志中恢复操作的起始位置以及有关日志的信息等。

当发出检查点时,不仅后台进程CKPT和DBWn要开始工作,LGWR也会将重做日志缓冲区写入到联机重做日志文件,从而确保数据文件、控制文件、联机重做日志文件的一致性。

以下是CKPT后台进程工作触发条件。

➢ 发生日志切换。

➢ 关闭实例(SHUTDOWN ABORT语句除外)。

➢ 手动执行检查点操作(执行ALTER SYSTEM CHECKPOINT语句)。

➢ 执行热备份。

➢ 将表空间或数据文件设置为只读模式。

➢ 手动设置FAST_START_MTTR_TARGET初始化参数。

4. SMON

SMON(系统监视器)主要作用是在实例启动时,判断实例上次是否正常关闭,如果是不正常关闭,则完成系统实例的恢复,清理不再使用的临时段。另外SMON还会合并数据文件中相连的空闲空间。

在实例恢复过程中,如果由于文件读取错误或所需文件处于脱机状态而导致某些异常终止的事务未被恢复,SMON将在表空间或文件恢复联机状态后再次恢复这些事务。SMON将定期地检查系统中是否存在问题。系统内的其他进程需要服务时也能够调用SMON进程。

5. PMON

PMON(进程监视器)用于清除失效的用户进程,执行进程恢复,清理缓存,并释放用户进程所使用的资源。PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源。

6. ARCn

ARCn(归档进程)用于将重做日志的事务变化复制到归档日志文件中,并重做日志的备份,这样就保留了数据库的全部更改记录,ARCn是一个可选的后台进程。当数据库以归档日志(ARCHIVELOG)模式运行时,Oracle就会启动ARCn进程。当联机重做日志文件被写满时,日志文件会进行切换,旧的联机重做日志文件就会被一个或多个ARCn进程复制到指定的归档存储目录。

一个Oracle实例中最多可以运行30个ARCn进程(ARC0 ~ ARCt),可以通过LOG_ARCHIVE_MAX_PROCESSES初始化参数设置ARCn进程的数量。实际上用户无需修改此参数的值,因为系统能够自动地决定需要多少个ARCn进程,而且当数据库负载增大时,LGWR进程能够自动地启动新的ARCn进程。

7. RECO

RECO(恢复进程)是在分布式数据库环境中自动解决分布式事务错误的后台进程。RECO进程连接到出现了不可信的分布式事务的数据库以后,将负责对此事务进行处理,并从相关数据库的活动事务表中移除与此事务有关的数据。

如果远程服务器不可用或网络连接不能建立时,RECO进程无法连接到远程数据库,该进程将在一定时间间隔后尝试再次连接。每次重新连接的时间间隔会以指数级的方式增长。只有实例允许分布式事务时才会启动RECO进程,实例中不会限制并发的分布式事务的数量。

8. Dnnn

Dnnn(调度进程)是一个可选的后台进程,目前只在共享服务器配置上使用。该进程允许用户进程共享有限的服务器进程。没有Dnnn时,每个用户进程需要一个专用的服务器进程。在一个数据库实例中可以创建多个Dnnn。数据库管理员根据操作系统中每个进程可连接数目的限制,来决定启动的Dnnn的最优数量,在实例运行时可以动态地增加或删除Dnnn。