所有连接到Oracle的用户必须执行两种形式的代码来访问数据实例。
- 应用或Oracle工具:数据库用户运行数据库应用(例如预编译程序)或Oracle工具(例如SQL*Plus),这些工具用来发布SQL语句到Oracle数据库。
-
Oracle数据库服务代码:每个用户都有自己的Oacle数据库代码,这些代码用来解释和处理应用的SQL代码。
这些程序模块被进程执行。进程是“控制线程”或操作系统中执行多个步骤的机制。进程通常都有属于它自己的私有内存。
Oracle多进程体系
多进程的Oracle数据库(也叫多用户Oracle)运用一些线程来运行不同的Oracle代码和用户进程——每个连接的用户对于一个单独的服务进程或多个服务进程被多个连接的用户共享。大多数数据库系统都是多用户的系统,因为这样有利于多个用户同时访问数据库。
每个Oracle进程都执行一个特殊的工作。为了把Oracle和数据库应用的工作分成多个进程,多个用户和应用可以在同一时间连到数据实例,而系统还能保持良好的性能。
进程的类型
Oracle系统中的进程主要可以分为两类:
- 运行应用和oracle工具的用户进程
- 运行oracle数据库服务代码的进程。它又可以划分为服务器进程和后台进程
进程的结构根据Oracle配置的不同而不同,Oracle的配置取决于操作系统和oracle的选择。用户的连接类型可以分为专有模式和共享模式。
在专有模式下,对每个用户而言,数据库应用被用户进程运行,每个服务器进程只为一个用户进程服务。
而在共享模式下,数据库应用被用户进程执行。每个服务器进程可以为多看用户进程服务。
下图展示了共享模式配置。每个连接的用户都有一个单独的用户进程,许多后台进程执行Oracle。
上图代表了多个并发的用户与oracle数据库在同一台机器上执行一个应用。这种特别的配置通常运行在大型机或微型机上。
用户进程预览
当用户执行一个应用程序(例如Pro*C程序)或Oracle工具(例如Enterprise Mananger或SQL*Plus)时,Oracle创建一个用户进程来执行用户的应用程序。
-
连接和会话
连接和会话与用户进程有很大的联系,但是他们的意义却有很大的不同。
连接是用户进程和Oracle实例之间的通信路径。通信路径是通过内部进程通信机制(既运行用户进程又运行Oracle的计算机)或网络软件(用户进程和数据库不是在同一台计算机上)建立起来的。
会话是一个特定的用户进程连接到Oracle的连接。例如,当用户启动SQL*Plus,用户必须提供可用的用户名和密码,然后Oracle就为用户建立了一个会话。当用户退出数据库应用或关闭连接时,会话消失。
单个Oracle用户名和密码可用来同时创建多个会话。例如,SCOTT/TIG可以同时多次连到同一个实例上。
在非共享模式下,Oracle为每个用户会话创建一个服务器进程。但是,在共享模式下,多个用户共享一个服务器进程。
服务器进程预览
下面我们将介绍两种运行Oracle服务器代码的进程(服务器进程和后台进程)。同时我们还会介绍记录Oracle进程的跟踪日志文件和alert日志。
服务器进程
Oracle创建服务器进程来处理连接到实例的用户进程的请求。在应用和Oracle在同一台机器的情况下,Oracle会将用户进程和服务器进程合成一个进程来减小服务器的开销。尽管如此,当应用和数据库服务在不同的计算机上时,用户进程通常会与一个单独的服务器进程通信。
为用户的应用创建的服务器进程(或者是服务器进程与用户进程联合的一部分)用来执行下列功能:
- 分析和执行应用发布的SQL语句
- 如果数据块不在SGA中,服务器进程将需要的数据块读到SGA中。
- 返回应用程序处理的结果
后台进程
为了得到最佳性能和更好的适应用户,Oacle系统引入了后台进程。
一个Oracle实例有很多后台进程,但是并不是包含所有后台进程。后台进程有很多类型。可以通过查询V$BGPROCESS视图来获得后台进程的信息。Oracle实例包含的后台集成有以下一些:
Dababase Writer process(DBWn)
Log Writer Process(LGWR)
Checkpoint Process(CKPT)
System Monitor Process(SMON)
Process Monitor Process(PMON)
Recovery Process(RECO)
Job Queue Process
Archiver Process(ARCn)
Queue Monitor Process(QMNn)
Other Background Process
在大多数系统中,后台进程在Oracle启动时被自动的创建。
下图展示了后台进程与Oracle数据库不同部分的相互作用。
Database Writer Process(DBWn)
Database Writer Process(DBWn)把数据缓冲区中的内容写到数据文件。DBWn进程负责把数据库库数据缓冲区中的脏数据块写到磁盘。尽管一个数据库写进程(DBW0)对于大多数进程来说已经足够了,但是在数据修改频繁的情况你可以配置额外的进程(从DBW1到DBW9)来提高写的效率。这种额外的DBWn进程不适合单处理器的系统。
当数据库buffer cache中的的一个buffer被修改时,它被设置成dirty。冷块是根据LRU算法得出的最近不经常使用的块,DBWn进程把冷的,脏的数据块写到磁盘因此用户进程能找到冷的,干净的数据块用来将数据块读到缓存里面。Buffer被用户进程变脏,free buffer的数据在相对的减少。如果free buffer的数量太少的话,当用户需要把数据块读到缓存中时就会找不到free buffer。DBWn管理者buffer cache因此用户进程不会找不到buffer cache。
通过写冷的,脏的缓存到磁盘,将最近经常使用的缓存在内存中,DBWn改进了查找free buffer的效率。例如,频繁被访问的小表或索引的数据块被放在缓存中在下次使用是不需要再次读到缓存中。LRU算法将经常被访问的数据块保存在缓存里,因此当一个buffer写到磁盘后,这个buffer不会包含马上要使用的数据。
初始化参数 DB_WRITER_PROCESSES指定了DBWn进程的数量。DBWn最大的数量是20,如果在实例启动时没有指定这个参数,Oracle根据CPU的个数和处理的组数来决定DB_WRITER_PROCESSES的值。
在下列情况下DBWn进程会将脏数据写到磁盘里:
- 当服务器进程在扫描了buffers的阀值后没有找到干净可用的buffer,服务器进程会发送DBWn进程写。DBWn写脏数据到磁盘与执行其他进程是异步的。
- DBW2阶段行的写buffer从而移动缓存中checkpoint的位置,checkpiont的位置是redo日志文件做实例恢复时开始的地方。这个日志文件的位置有数据库buffer cache中最旧的脏数据库决定。
在多数情况下,DBWn做批量的写来提高效率。每次写入数据块的多少由操作系统决定。