首页 > 代码库 > oracle 体系结构(一)

oracle 体系结构(一)

(1) oracle database server = 实例+数据库
 
    技术分享
  通常情况下,我们把那个承载我们核心数据的系统称为数据库服务器,但从严格意义上来说,它是由两个部分组成的。
    1.实例由内存结构和后台进程构成。每当启动一个实例时,都会分配一个称为系统全局区(SGA)的共享内存区,并启动后台进程。
    2.数据库包括物理结构和逻辑结构。由于物理结构和逻辑结构是分开的,因此管理数据的物理存储时不会影响对逻辑存储结构的访问。
(2) 连接到数据库
  1)连接:用户进程和实例之间的通信,可以看做一条物理路径。
  2)会话:用户通过用户进程与实例建立的特定的连接,可以看做是逻辑上的用户同服务器的通信交互。
  一个连接上可以建立0个、1个或多个会话。各个会话是单独而且独立的。
(3)用户进程和服务器进程交互
    技术分享
  ①在安装了oracle db 的节点(通常称为“主机”或“数据库服务器)上启动一个实例。
  ②用户启动一个应用程序,该程序衍生了一个用户进程。该应用程序尝试建立一个与服务器的连接(此连接可能是本地连接、客户机/服务器连接或来自中间层的三层连接)。
  ③服务器运行具有相应oracle net services处理程序的监听程序监听程序检测到应用程序发出的连接请求,并创建一个代表用户进程的专用服务器进程。
  ④用户运行一条DML类型的sql语句并提交事务处理。例如,用户更改表中的客户地址并提交更改
  ⑤服务器进程接受该语句,并检查共享池中是否包含相同的sql语句的共享sql区域。如果找到sql区域,服务器进程检查用户对于所请求数据的访问权限,
  并且使用现有的共享sql区域处理该语句。如果没有找到共享sql区域,则为该语句分配一个新的共享sql区域,以便对该语句进行分析和处理。
  ⑥服务器进程从实际数据文件(表)或数据库缓冲区高速缓存中存储的值中检索任何必须的数据值。
  ⑦服务器进程修改SGA中的数据。因为提交了四五处理,所以日志写进程(LGWR)会立即将该事物处理记录到重做日志文件中。数据库写进程(DBWn)会待执行效率高时将修改后的块永久写入磁盘。
  ⑧如果事务处理成功,则服务器进程将通过网络向应用程序发送一条消息。如果事务处理不成功,则传送一条错误消息。
  ⑨在整个过程中,其它后台进程同时在运行,用于监视是否有需要干预的情况。此外,数据库服务器管理其他用户的事务处理,并防止在请求相同数据的事务处理之间发生争用。
(4)内存结构详解
 技术分享
  PGA(Program Global Area):进程全局区,由每个服务进程、后台进程专有;每个进程都有一个PGA。
                 包含某个服务器进程或后台进程的数据及控制信息的内存区域。
  SGA(System Global Area):系统全局区,由所有服务进程和后台进程共享。包含一个oracle db实例的数据和控制信息。
  主要包含以下数据结构
  1)database buffer cache(数据库缓冲区高速缓存):存放从数据文件读取的数据块的副本。
    Oracle DB 用户进程第一次需要特定数据片段时,将在数据库缓冲区高速缓存中搜索数据。如果该进程在高速缓存中找到
    数据(称为高速缓存命中),则直接从内存中读取数据。如果进程在高速缓存中找不到数据(称为高速缓存未命中),则
    在访问数据之前,必须将磁盘上的数据文件中的数据块复制到高速缓存中的缓冲区中。高速缓存命中时访问数据要比高速缓存未命中时访问数据快。
  2)redo log buffer(重做日志缓冲区):循环缓冲区,用于存放有关对数据库所做更改的信息,包含重做条目,这些条目包含由DML和DDL等操作进行的
    重要更改的信息。如果需要,将使用重做条目进行数据库恢复。
  3)shared pool(共享池):用来缓存可在用户间共享的各种结构,包含库告诉缓存、数据字典高速缓存、sql查询结果告诉缓存、
    PL/SQL函数结果高速缓存、并执行消息的缓冲区以及控制结构。
  4)large pool(大型池):为某些大型进程(例如oracle备份和恢复操作)、I/O服务器进程、共享服务器的会话内存和Oracle XA接口(在事务处理与多个数据库交互时使用)提供大型内存分配的可选区域。
  5)Java池:用于java虚拟机(jvm)中特定于会话的所有Java代码和数据。
  6)streams pool(流池):oracle streams使用它来存储捕获和应用操作所需的信息。
(5)进程体系结构
  oracle db 系统的进程主要分为两组:
    1.运行应用程序或oracle工具代码的用户进程
    2.运行oracle db服务器代码的oracle db进程(包括服务器进程和后台进程)
    技术分享
  
  当用户运行应用程序或oracle工具(例如sql*plus)时,oracle db会创建一个“用户进程”以运行该用户的应用程序。oracle db 还会创建一个“服务器进程”以执行该用户进程发出的命令。此外,oracle服务器还会为实例创建一组“后台进程”,这些进程不仅彼此交互,而且还与操作系统交互,以便管理内存结构,通过异步执行I/O操作将数据写入磁盘,并执行其它需要的任务。
  进程结构图
    技术分享

  1)服务器进程

    参考资料:http://blog.csdn.net/sunansheng/article/details/51281605?locationNum=4&fps=1

        :http://www.cnblogs.com/lamiyiyi/p/lamiyiyi_oracle.html

   oracle db创建服务器进程以处理连接到实例的用户进程的请求。在某些情况下,当应用程序和oracle db在同一台计算机上操作时,可以将用户进程和相应的服务器进程合并为一个进程,以减少系统开销。但是,当应用程序和oracle db在不同计算机上运行时,用户进程总是通过单独的服务器进程与oracle db通信。

  代表每个用户的应用程序创建的服务器进程可以执行以下一项或多项操作:

    ①对通过应用程序发出的sql语句进行语法分析和运行。

    ②从磁盘上的数据文件中将必要的数据块读取到SGA的共享数据库缓冲区中(如果相应的数据块目前尚未在SGA中)。

    ③返回结果,使应用程序可以处理信息。

  2)后台进程

    1.database write--数据写入  DBWn

    技术分享

 

    作用:把SGA中被修改的数据同步到磁盘文件中。保证Buffer Cache中有足够的空闲数据块数量。

    PS:如果LGWR出现故障,DBWR不会听从CKPT命令罢工,因为Oracle在将数据缓存区数据写到磁盘前,会先进行日志缓冲区写进日志文件的操作,并耐心的等待其先完成,才会去完成这个内存刷到磁盘的动作,这就是所谓的凡事有记录。

    触发条件:1、检查点CKPT 触发DBWn进程

         2、一个服务进程在设定的时间内没有找到空闲块

         3、每三秒自动唤醒一次

    对于一个大型数据库或者修改非常频繁的系统而言,仅靠一个DBWn 进程为所有数据文件的写 操作提供服务,可能会力不从心。因此,Oracle 允许同时运行多个 DBWn 进程,以分担繁重的写负 载。这就是 DBWn 中n 的来历。数据库中最多可以使用 20 个DBWn 进程(n 从0~9 ,a~i)。数据库 初始化参数DB_WRITER_PROCESSES 就是用来定义DBWn 进程数量。如果没有定义这个参数, Oracle 缺省时按照 CPU 的数量来决定需要的进程个数。每8 个CPU 分配一个进程。

    Oracle 推荐在增加 DBWn 进程数量之前,要先考虑使用异步 IO,有可能异步 IO就能够解决问 题,不需要增加进程数量。

      设置:DB_WRITER_PROCESS用来定义DBWn进程数量。(commit命令只是把记录修改写入日志文件,不是把修改后的数据写入数据文件)

    2.log write:--日志文件写入  LGWR

    技术分享

 

    作用:LGWR 进程的作用是吧Log Buffer中的日志内容写到联机日志文件中,从而释放 Log 用户Buffer 空间。数据库的所有修改操作(增、删、改)都会生成日志,这些日志最初先保存在 Redo Log Buffer 中,然后在某个时刻由LGWR 进程写入到磁盘的联机日志文件中。

     触发条件:1、用户发出commit命令。(在oracle中称为快速提交机制(fast commit)):把redo log buffer中的记录写入日志文件,写入一条提交的记录

          2、每三秒定时唤醒;

          3、如果使用的 Log Buffer 超过了配置的 1/3 时,即 1/3 满会触发 LGWR 的写操作;

          4、Log Buffer 中的日志数量超过 1MB 时,即 1MB 限制也会触发 LGWR 的写操作;

          5、联机日志文件切换也将触发LGWR;

          6、DBWR进程触发:DBWn视图将脏数据块写入磁盘先检测他的相关redo记录是否写入联机日志文件,如果没有就通知LGWR进程。在oracle中成为提前写机制(write ahead):redo记录先于数据记录被写入磁盘。

    (1)提前写。

      Oracle 使用的是提前写(Write-Ahead)机制,即和一个数据块相关联的的 Redo记录必须先于 数据块本身被记录到磁盘中。这就意味着,当DBWn 进程试图把一个脏数据块写到磁盘上之前, DBWn 进程会先确定和这个数据块相关联的所有Redo记录都已经被写到联机日志文件中了,如果 没有满足这个前提条件,那么 DBWn 进程就会通知 LGWR 进程,等待 LGWR 进程把相关日志都写 完后,DBWn 进程再把数据块内容写到磁盘文件中。

    (2)快速提交。

      每当用户发出Commit命令时,Oracle 只是会把Redo Log Buffer 中的记录写到日志文件中,同 时会在日志中写入一条代表事务已经提交的记录(Commit Record)。但是这个事务所修改到的数据 块并不会被写到数据文件中。或者说Oracle 对Commit操作成功的定义是这样的:只要这个事务的 Redo Record被写到日志文件中,这个事务就算是 Commit成功了,至于事务修改的数据是否记录到 数据文件没有任何关系。这也就是Oracle 的快速提交(Fast Commit)机制。

       提前写(Write Ahead)和快速提交(Fast Commit)是 Oracle 两个很重要的运行机制,这两个机 制保证了事务提交不必等待数据写到磁盘,而之所以采用这种机制,也是平衡性能和可用性的结果。

       对于一个繁忙的OLTP 系统来说,同时会有大量的事务发生,因此同时会有大量的Commit请 求,这时LGWR 进程就可以把许多的 Commit请求批量的写入日志文件,而不是针对每个Commit 请求立即处理,这种机制也叫做Group Commit

     3.checkpoint:--检查点事件  CKPT

    技术分享

 


    作用:“检查点”是一种数据结构,用于定义数据库的重做线程中的系统更改号(SCN(system change number或者system commit number))。检查点被记录在控制文件和每个数据文件头中,它们是恢复操作的关键元素。出现检测点时刻数据文件的内容与SGA中的内容一致,这不是一个单独的进程,要和前两个进程一起工作呦。DBWR写入脏数据,同时触发LGWR进程,而 CKPT 进程只负责更 新控制文件中的检查点记录,它的任务量并不像 DBWn 进程和 LGWR 进程那么繁重.

     注意:检查点所代表的数据一致和事务隔离级别所说的读一致性不是一个概念,后者是从数据完整性角度 来说的。而检查点的数据一致仅指内存和磁盘的数据一样,是从恢复的角度来说的,二者一定不能 混淆。虽然在检查点时刻,系统中会有很多未提交事务,修改后的脏数据最终可能被提交,永久生 效,也有可能回滚,还原成修改前的样子,但这不是检查点所关心的。检查点只关心恢复操作是否 可以从这一时刻开始。

        CKPT更新控制文件中的检查点记录。通过设置某参数调整来控制CKPT的触发时间。参数是FAST START MTTR TARGET。
       触发条件:日志切换(log switch)会触发检查点。
    4.system monitor:--实例维护进程  系统监控器  SMON
    技术分享

    如果遭遇数据库异常关闭,SGA 中还没有来得及写到磁盘的信息就丢失了,数据库再次启动时,就先要进行恢复工作,这种恢复叫做实例恢复(Instance Recovery )。SMON 进程负责实例恢复,实例恢复分成3 个阶段。

    前滚(Roll Forward):这一阶段是读取联机日志,找到最后一次检查点之后的日志内容, 并重做这些日志,把数据库恢复到上次实例关闭时的状态,这时系统包含着提交和未提交的 事务。

    打开数据库:为了减少用户等待时间,Oracle 选择尽可能早地打开数据库,打开数据库以 后,再继续进行恢复工作。现在用户就可以使用数据库。

    回滚(Roll Back) :SMON 进程回滚未提交的事务,Server Process 也可以进行部分回滚工作

    除了实例恢复,SMON 进程还负责部分空间管理工作,包括:

    如果使用字典管理表空间(DMT) ,SMON 进程需要合并空闲 Extents,以避免磁盘碎片, 这个功能叫做 Coalesce,这个任务每 3 秒执行一次;

    SMON 进程负责清理临时段,以释放空间;

    触发条件:SMON 进程也是定期被唤醒或者被其他进程主动唤醒

    5.process monitor:--维护用户进程  进程监控器  PMON

    技术分享

    作用:1、发现用户进程异常终止,并进行清理。释放占用资源。(清理异常终止用户使用的锁)

             2、向监听程序动态的注册实例。

    触发条件:定时被唤醒,其它进程也会主动唤醒它。

    6.Distributed Database Recovery :-- 用于分布式数据库的恢复  RECO

    技术分享

    作用:某个应用跨越多个数据库,需要都提交成功,事务才会成功,否则全部回滚

    7.archive:--归档操作  ARCn

    技术分享

    作用:归档(Archiver)进程负责归档模式的数据库的归档操作。我们知道每个数据库都必须要创建 至少两组联机日志,这些日志是循环使用的,也就是一组日志写满后,LGWR 就切换到另一组日志 继续写入,周而复始。因此稍早产生日志终将被新的日志覆盖掉,这是非归档模式。而归档模式比 非归档模式多出的处理就是,在发生日志切换时,ARCn 进程被唤醒,把之前写满的日志做一个文 件拷贝,这个拷贝被保存到一个特殊的目录下——归档目录,这个拷贝就叫做归档日志。每个联机 日志能够被覆盖的前提条件也相应地多了一个,除了要完成检查点,还必须完成归档操作。

    归档模式就是确保数据库所有操作日志都被保留下来,这样能够最大程度的保证数据库的可恢 复性。

    ARCn进程就是完成这个拷贝动作,和DBWn进程一样,ARCn进程可以有多个,最多是10个(n取值范围为0~9)。数据库的初始化参数LOG_ARCHIVE_MAX_PROCESSES 就是定义数据库启动时运行的ARCn的个数。

    触发条件:日志切换时被LGWR唤醒。

    8.LCKn 仅适用于RAC数据库,最多可有10个进程(LCK0,LCK1,...,LCK9),用于实例间的封锁。

 

oracle 体系结构(一)