Oracle 11g 服务器结构

  Oracle 服务器主要又实例、数据库、程序全局区和前台进程组成。前端

  实例能够进一步划分为系统全局区(SGA)和后台进程(PMON、SMON等)两部分,其中,SGA 使用操做系统的内存资源,然后台进程须要使用 CPU 与内存资源。数据库(Database)中包含数据文件(Data files)、控制文件(Control files)和重作日志文件(Redo log file),数据库文件存放在硬盘中。程序全局区(PGA)是一个非共享的内存区域,用于管理用户进程的私有资源。前台进程能够再划分为用户进程和服务器进程,它们须要使用 cpu 与内存资源。数据库

1、系统全局区(SGA)

  系统全局区(System Global Area)是全部用户进程共享的一块内存区域,也就是说,SGA 中的数据资源能够被多个用户进程共同使用。SGA 主要由高速数据缓冲区、共享池、重作日志缓冲区、Java池和大型池等内存结构组成。SGA 随着数据库实例的启动而加载到内存中,当数据库实例关闭时,SGA区域也就消失了。后端

  一、高速数据缓冲区(Database buffer cache)

  高速数据缓冲区中存放着 Oracle 系统最近访问过的数据块(数据块在高速缓冲区中也可称为缓存块)。当用户向数据库发出请求时,若是在高速数据缓冲区中存在请求的数据则 Oracle 系统会直接从高速缓冲区中读取数据并返回给用户,不然,Oracle 系统会打开数据文件读取请求的数据。缓存

  若没法在高速数据缓冲区中找到所须要的数据,则Oracle 首先从数据文件中读取指定的数据块到缓冲区,而后再从缓冲区将请求的数据返回给用户。因为高速数据缓冲区被全部用户共享,只要数据文件中的某些数据块被当前或其余用户请求过,那么这些数据块就会被装载到高速数据缓冲区中。这样当任何用于再次访问相同的数据时, Oracle 就没必要再从数据文件中读取数据,而是能够直接将缓冲区中的数据返回给用户。常常或最近被访问的数据块会被放置到高速数据缓冲区前端,不常被访问的数据块会被放置到高速数据缓冲区的后端,当高速缓冲区填满时,会自动挤掉一些不常被访问的数据块。服务器

  以存取速度来看,内存的读取速度远快于物理硬盘,因此高速数据缓冲区的存在可大大下降对物理磁盘的读取频率,从而达到提升数据库服务器性能的目的。为了便于管理SGA 的内存数据, Oracle 把高速数据缓冲区划分为如下3个部分:网络

  (1)脏数据区:脏数据区中存放着已被修改过的数据,这些数据等待被写入到数据文件中。当一条更新或删除语句对某些数据库中的数据修改后,那么这些数据块就被标记为 ”脏“,而后等待提交命令并经过后台进程 DBWR 将其写入到数据文件中。数据结构

  (2)空闲区:空闲区中的数据块不包含任何数据,这些数据块能够被写入数据,Oracle 能够从数据文件中读取数据块,并将其存放到该区中。异步

  (3)保留区:保留区包含那些正在被用户访问的数据块和明确保留以做为未来使用的数据块(即缓存块),这些数据块将被保留在缓冲区中。分布式

  二、重作日志缓冲区(Red log buffer cache)

  重作日志缓冲区用于存放数据库进行修改操做时所产生的日志信息,这些日志信息在写入到重作日志文件以前,首先存放重作日志缓冲区中,而后,在检查点发生或重作日志缓冲区中的信息量达到必定峰值时,最后由日志写入进程(LGWR)将此缓冲区的内容写入到重作日志文件。性能

  重作日志缓冲区的大小由 LOG_Buffer 参数指定,该参数也能够在实例启动后动态修改。相对于高速数据缓冲区而言,重作日志缓冲区的大小对数据库性能的影响较小,一般较大的重作日志缓冲区能减小重作日志文件的对 I/O 的读写次数,对数据库的总体性能有必定的提升。

  三、共享池(Shared pool)

  共享池是 SGA 保留的内存区域,用于缓存 SQL 语句、PL/SQL语句、数据字典、资源锁、字符集以及其余控制结构等。共享池包含高速缓冲区(Library cache )和字典高速缓冲区(Dictionary cache)。

  (1)库高速缓冲区时共享池的一部分,主要包括共享 SQL区和私有 SQL区两个组成部分。库高速缓冲区中存放最近用过的 SQL 语句、PL/SQL 语句的文本和执行计划。当下一次执行相同的 SQL 语句或 PL/SQL 语句时,能够直接在库高速缓冲区中找到以前已经生成的执行计划,而不须要再次解析相同的 SQL 语句或  PL/SQL 语句,从而提升系统执行效率。

  每条被缓存的SQL 或 PL/SQL 语句都被分红两个部分,分别被存放在共享 SQL 区和私有 SQL 区中。共享 SQL区存放 SQL或 PL/SQL 语句的语法分析结果和执行计划,若是之后要再次执行相似的语句,则能够利用共享 SQL 区中已缓存的语法分析结果和执行计划。私有 SQL 区存放SQL 语句中的绑定变量、环境和会话等信息,这些信息属于执行该语句的用户的私有信息,其余用户则没法共享这些信息。

  (2)字典高速缓冲区用于存放 Oracle 系统内部管理所须要的数据字典信息,例如用户名、数据对象和权限等。

  共享池的内存空间大小是能够动态改变的,通常经过修改参数 SHARED_POOL_SIZE 的值来实现。

  四、大型池(Large pool)

  大型池在 SGA 区中不是必须的内存结构,只在某些特殊状况下,实例须要使用大型池来减轻共享池的访问压力,经常使用的状况有如下几种:

  •   当使用回复管理器进行备份和回复操做时,大型池将做为 I/O 缓冲区做用。
  •   使用 I/O  Slave 仿真异步 I/O 功能时,大型池将被看成 I/O 缓冲区使用。
  •        执行具备大量排序操做的 SQL 语句。
  •        当使用并行查询时,大型池做为并行查询进程彼此交换信息的地方。

  大型池的缓存区大小是经过 Large_pool_size参数定义的,在 Oracle 11g中,用户可使用 alter system  命令动态地修改其缓冲区的大小。

  五、Java池

  用来提供内存空间给 Java 虚拟机使用,目的是支持在数据库中运行 Java 程序包,其大小由 Java_Pool_size 参数决定

  六、流池

  Oracle 流池用于在数据库与数据库之间进行信息共享。若是没有用到 Oracle 流,就不须要设置该池。流池的大小由参数 STREAMS_Pool_size 决定。

2、程序全局区(PGA)

  程序全局区(Program Global Area)也可称作用户进程全局区,它的内存在进程私有区而不是共享区。虽然 PGA 是一个全局区,能够把代码,全局变量和数据结构均可以存放在其中,但区域内的资源并不像 SGA 同样被全部的用户进程所共享,而是每一个 Oracle 服务器进程都只拥有属于本身的那部分 PGA资源。

  在程序全局区(PGA)中,一个服务进程只能访问属于它本身的那部分 PGA 资源区,各个服务进程的 PGA 区总和即为实例 PGA区的大小。一般 PGA 区由私有 SQL 区和会话区组成。

  一、私有 SQL区

  私有 SQL 区用于存储变量以及 SQL 语句运行时的内存结构信息,当每一个用户链接到实例时,都会在实例中建立一个会话。这些会话可能会在 SGA 区中建立一个共享 SQL区,但在 PGA 区中可能会建立多个私有 SQL 区。把一个私有 SQL 区与对应的共享 SQL 区合并在一块儿,就能够得到一条 SQL语句的完整缓存数据。

  每一个会话的私有 SQL 区能够再分为静态区和动态区两部分。静态区的信息在会话过程当中保持不变,只有当会话结束时,静态区才会被释放掉;而动态区的信息在整个会话过程当中是不断变化的,一旦 SQL 语句指定完毕,即便会话尚未结束,动态区也被释放掉。

  二、会话区

  会话区用于存放用户的会话信息(如登陆用户名)。若是数据库处于共享服务器链接模式下,则会话区将位于 SGA 区域,而不是 PGA 中。

  查看程序全局区(PGA)的信息能够经过显示 pga 参数的内容来实现。

3、前台进程

  前台进程包括用户进程和服务进程,它不属于实例的一部分,可是用户在不知不觉中常常会用到它,使用前台进程可以实现用户与实例的沟通。

  一、用户进程

  用户进程是指那些可以产生或执行 SQL 语句的应用程序,不管是 SQL*Plus,仍是其余应用程序,只要是能生成或执行 SQL 语句,都被称做用户进程。

  在用户进程中有两个很是重要的概念:链接和会话。链接是一个用户进程与实例之间创建的通讯渠道,这个渠道能够经过操做系统上的相关通讯机制或网络链接来实现。会话是指用户进程与实例之间创建链接后造成的用户与实例之间的交互方式,通常是用户发出请求,数据库实例为用户返回响应消息的方式。

  二、服务器进程

  服务进程就是用于处理用户会话过程当中向数据库实例发出 SQL 语句或 SQL*Plus 命令,它能够分为专用服务器模式和共享服务器模式。在专用服务器模式下,每一个用户进程都有一个专用的服务器进程,这个服务器进程表明用户进程执行 SQL 语句,必要时还能够回传执行结果给用户进程。在共享服务器模式下,每一个用户进程不直接与服务器进程链接,而是链接到分派程序,每一个分派程序能够同时链接多个用户进程。

4、后台进程

  Oracle 后台进程是一组运行与 Oracle 服务器端的后台程序,是 Oracle 实例的重要组成部分。这组后台进程有若干个,它们分工明确——分别完成不一样的系统程序。

其中 SMON、PMON、DBWR、LGWR 和 CKRT 这5哥后台进程必须正常启动,不然将致使数据库崩溃。还有不少的辅助进程,用于实现相关的辅助功能,若是这些辅助进程发生问题,只会使某些功能受到影响,通常不会到时数据库实例崩溃。

  一、数据写入进程(DBWR)

   数据写入进程的主要任务是负责将内存中的 “脏” 数据块回写到数据文件中。“脏” 数据块是指高速数据缓冲区中的被修改过的数据块,这些数据块的内容与数据文件内容不一致。但 DBWR 并非随时将全部的 “脏” 数据块都写入数据文件,只有知足必定的条件时, DBWR 进程才开始成批量地将 “脏” 数据写入数据文件, Oracle 这样作的目的是为了尽可能减小 I/O 操做,提供 Oracle 服务器性能。一般在下面几种状况下,DBWR 进程将 “脏” 数据块写入数据文件。

  •   当用户进程执行插入或修改操做时,须要将 “新数据” 写入高速数据缓冲区,若是在高速数据缓冲区中没有找到足够大的空闲数据块来存放这些“新数据”,这时, Oracle 系统将启动 DBWR 进程并将 “脏” 数据块写入数据文件,已得到空闲数据块来存储这些 “新数据”。
  •        当检查点进程启动后,它会强制要求 DBWR 将某些 “脏” 数据块写入数据文件文件中。
  •   当 “脏” 数据块在高速数据缓冲区中存放超过3秒钟,DBWR 进程会自行启动并将某些 “脏”数据库写入到数据文件中。

  在某些比较繁忙的应用系统中,能够修改服务器参数文件 Spfile 的 DB_writer_processes 参数,以容许使用多个 DBWR 进程。可是 DBWR 进程的数量不该当超过系统处理器的数量,不然多余的 DBWR 不但没法发挥做用,反而会耗费系统资源。

  二、检查点进程(CKPT)

   检查点进程能够看作义工事件,当检查点事件发生时, CKPT 会要求 DBWR将某些 “脏” 数据块回写到数据文件。当用户进程发出数据请求时, Oracle 系统从数据文件中读取须要的数据并存放到高速数据缓冲区,用户对数据的操做时在缓冲区中进行的。当用户操做数据时,就会产生大量的日志信息并存储在崇左日志缓冲区,当 Oracle 系统知足必定条件时,日志写入常常(LGWR)会将日志信息写入到崇左日志文件组中,当发生日志切换时(写入操做正要从一个日志文件组切换到另外一组时),就会启动检查点进程。

   DBA 还能够经过修改初始化参数 spfile 中的 checkpoint_process 参数为TRUE来启动检查点进程。

  三、日志写入进程(LGWR)

   日志写入进程用于将重作日志缓冲区中的数据写入重作日志文件。Oracle 系统首先将用户所作的修改日志信息写入日志文件,而后再将修改结果写入数据文件。

   Oracle 实例再运行中会产生大量日志信息,这些日志信息首先被记录在 SGA 的重作日志缓冲区中,当发生提交命令、或者重作日志缓冲区的信息满 1/3 ,或者日志信息存放超过3秒钟时,LGWR 进程就将日志信息从重作日志缓冲区中读出并写入日志文件组中序号较小的文件中,一个日志组写满后接着写另一组。当 LGWR 进程将全部的日志文件都写过一遍后,它将再次转向第一个日志文件组从新覆盖。当 LGWR 进程写满一个日志文件组而转向写另一组时,称之为日志切换。

  四、归档进程(ARCH)

   归档进程是一个可选择的进程,只有当 Oracle 数据库处于归档模式时,该进程才可能起到做用。若 Oracle 数据库处于归档模式,当各个日志文件组都被写满而即将被覆盖以前,先由归档进程(ARCH)把即将被覆盖的日志文件中的日志信息读出,而后再把这些 “读出的日志信息” 写入到归档日志文件中。

  当系统比较繁忙而致使 LGWR 进程处于等待 ARCH 进程时,可经过修改 LOG_Archive_max_processes 参数启动多个归档进程,从而提升归档写磁盘的速度。

  五、系统监控进程(SMON)

   系统监控进程时在数据库系统启动时恢复工做的强制性进程。例如:在并行服务器模式下,SMON 能够恢复另外一个处于失败的数据库,使系统切换到另一台正常的服务器上。

  六、进程监控进程(PMON)

   进程监控进程用于监控其余进程的状态,当有进程启动失败时,PMON 会清除失败的用户进程,释放用户进程所用的资源。

  七、锁定进程(LCKN)

   这个一个可选进程,并行服务器模式下能够出现过个锁定进程以利用与数据库通讯。

  八、恢复进程(RECO)

   这是在分布式数据库模式下使用的一个可选进程,用于数据不一致时进行恢复工做。

  九、调度进程(DNNN)

   这是一个可选进程,在共享服务器模式下使用,能够启动多个调度进程。

  十、快照进程(SNPN)

   快照进程用于处理数据库快照的自动刷新,并经过 DBMS_job 包运行预约的数据库存储过程。

相关文章
相关标签/搜索