盒子
盒子
文章目录
  1. Oracle 进程详解

Oracle 进程详解

Oracle 进程详解

参与数据库活动的进程可以分成两大类,分别是用户进程和 Oracle 进程,而后者又可以分成服 务进程(Server Process )和后台进程(Background Process)。

1.用户进程

Oracle 提供的若干管理工具是典型的用户进程,比如RMAN 、SQL*PLUS 、EXP 、IMP 、SQLLDR 等。当然也包括用户自己开发的各种应用程序,这些程序的特点是为用户提供了输入接口,用户可 以通过这些程序向Oracle 数据库发送指令。但是这些进程都不能直接操作数据库文件、不能访问 Oracle 实例的 SGA 内存空间。如果是客户自己开发的程序,还必须借助Oracle 提供的驱动库才能 工作。

2.服务进程

用户进程因为种种原因不能直接操作数据库文件或者SGA 内存(可能是代码安全问题、或者 跨越网络无法直接操作)。因此用户进程必须借助于Oracle 本地进程完成操作。这类进程的作用就 是用户进程的代理,就像是用户进程的影子一样,所以也叫做影子进程。因为影子进程的代码是由 Oracle 开发的,所以Oracle 完全信任这些代码是安全的,因此这些进程可以直接操作数据文件和 SGA 内存。这些进程接受用户进程发送的指令,并完成相应的操作,并给用户进程返回结果。这类进程 和后台进程可以操作数据文件、共享Oracle 实例的 SGA 内存空间。

我们可以用一个实例来区分下两种进程:

(1)首先用SQL*PLUS登录数据库,保持这个连接,也就是不要退出这个SQL*PLUS 会话环 境:

1
[oracle@testdb ~]$ sqlplus system/password

(2)在另一个窗口使用操作系统的 ps 命令来查看SQL*PLUS 对应的进程:

1
2
[oracle@ testdb ~]$ ps -ef|grep sqlplus 
oracle 13245 5924 0 14:43 pts/2 00:00:00 sqlplus

SQL*PLUS 这个客户进程的PID 是13245。

(3 )回到SQL*PLUS 窗口,用下面语句查看对应的服务进程:

1
2
3
4
5
6
SQL> select spid,username,terminal,program from v$process 
where addr in (select paddr from v$session where username='SYSTEM');

SPID USERNAME TERMIN PROGRAM
------------ ---------- ------ ----------------------------------------
13246 oracle pts/2 oracle@shandongdbp (TNS V1-V3)

这个PID=13246 的进程就是为这个 PID=13245 的客户进程提供服务的服务进程。

(4 )我们可以从 OS上查看这个进程:

1
2
3
[oracle@ testdb ~]$ ps -ef|grep 13246 

oracle 13246 13245 0 14:43 ? 00:00:00 oraclewxxrdb (DESCRIPTION=(LOCAL=YES) (ADDRESS=(PROTOCOL=beq)))

这是一个典型的服务进程,进程名字采用的是oracleSID这种格式。 服务进程可以直接操作数据库文件和SGA 进程,因此服务进程可以执行以下几种操作。

  • 逻辑读:一个服务进程从 Buffer Cache 中读取一个数据块的内容,就叫做逻辑读。
  • 物理读:一个服务进程无法从 Buffer Cache 中得到它需要的数据时,就要通过物理读把数 据从数据文件中读到 Buffer Cache 中。
  • 直接读 (Direct Read):当服务进程通过并行操作(包括全表扫描、分区扫描、Fast Full Index Scan)方式读取数据时,可以采用直接读方式,这种操作读入的数据不经过 Buffer Cache, 而是直接读取到 PGA 中。
  • 直接写(Direct Write):在某些场合,服务进程可以把数据块内容直接写到数据文件中。
  • 物理写(Physical Write) :和物理读对应的写操作就是物理写,虽然物理写和服务进程没有 关系,不过为了帮助读者建立完整的知识体系,这里一并介绍下物理写。

注意:常规的文件写操作是由DBWR进程完成的,而不是由服务进程完成的。

3.后台进程

后台进程是伴随着实例的启动而启动的,这些进程的功能是维护数据库系统的稳定运行,并不 直接对用户提供服务。每个后台进程都有一个专门的名称,提供专门的功能。有些后台进程是所有 数据库都需要的关键进程,而有些进程是根据数据库使用的功能不同才激活的可选进程。

查看后台进程的方法:

1
2
3
4
5
6
7
[oracle@testdb ~]$ ps -ef|grep oracle|grep -v oraclewxxrdb 

oracle 5105 1 0 Oct29 ? 00:00:39 ora_pmon_wxxrdb
oracle 5107 1 0 Oct29 ? 00:00:00 ora_psp0_wxxrdb
oracle 5109 1 0 Oct29 ? 00:00:21 ora_mman_wxxrdb
oracle 5111 1 0 Oct29 ? 00:12:08 ora_dbw0_wxxrdb
....

可以看到,每个后台进程的名称都不一样,但是都遵循ora_func_sid 这样一个格式。中间这 4 个字母就代表了这个进程的功能。

4.三种进程的关系

可以用一个例子来描述这3 种进程的关系。我们去银行办理存款、取款业务都必须通过窗口进 行办理。窗口工作人员是经过专业培训的,银行相信他们的行为是安全的,而用户的行为是不安全 的。因此银行只允许其工作人员接触金库而不允许我们去接触金库。因此用户必须在窗口外活动, 由窗口工作人员完成客户的指令。

对应到Oracle 数据库,Oralce 认为客户进程是不安全的(客户进程不限于 Oracle 自己提供的工 具,还包括其他厂商的工具,包括你自己写的程序),因此客户程序不能直接操作数据库(包括数据 文件、SGA 内存),但是服务进程是 Oracle 自己写的,相当于经过培训的窗口工作人员,Oracle 认 为这些进程才是安全的,所以用户进程必须把指令交给服务进程,由服务进程完成真正的工作。银 行并不只有窗口工作人员,还有许多其他员工,这些员工各司其职才保证了整个银行正常运转。 Oracle 也同样还有许多后台进程,这些后台进程维护整个数据库的正常运行。

因此每当用户进程要访问数据库时,Oracle 分配一个服务进程给这个用户进程,用户进程和服 务进程进行通信,比如用户进程发送 SELECT 语句给服务进程,然后服务进程从数据文件中读取数 据,执行排序、过滤等操作,最终把结果返回给用户进程。

每当用户运行一个客户端应用,比如 SQL*PLUS 或者用户自己开发的应用程序,Oracle 就会创 建一个服务进程。这个进程会持续用户的整个生命周期。用户发出的每个SQL 语句,用户进程负责 进行语法检查、执行,从数据文件中把数据读入内存(如果数据还没有在SGA 中),最后把 SQL 结 果返回给用户。

根据服务进程的分配方式,Oracle 提供了两种方案:专有模式(Dedicated Mode)和共享模式 (Shared Mode)。在专有模式下,用户进程和服务进程之间是 1 :1 的关系,而在共享模式下,用户的 请求通过转发器进程(Dispatcher)转给一个服务进程,多个用户共享使用预先创建的几个服务进程。 专有模式是最常用的方法,配置、调整都很简单,并且性能也是较好的。当然需要更多的资源,比 如内存。

接下来我们讨论后台进程的组成和功能,见本博客的文章《Oracle 后台进程详解》。

支持一下
扫一扫,支持forsigner