ITPub博客

首页 > 数据库 > Oracle > ORACLE数据库总体架构(一)

ORACLE数据库总体架构(一)

原创 Oracle 作者:jiangxiongwei 时间:2008-05-29 22:30:10 0 删除 编辑

本文将深入探讨 Oracle数据库的组成要素及其运作原理,让您对ORACLE数据库有一个整体的了解。

  本文主要包括以下内容:

l Oracle数据库架构简介

l Oracle 实例(instance)

l 系统全域区(SGA)

l 后台进程(background process)

一、ORACLE数据库架构  

Oracle数据库系统大致可区分为两个主要部分:

l Oracle实例(Oracle Instance)

l Oracle数据库(Oracle Database)。

简单地说,Oracle Instance 是指数据库服务器的内存区与相关进程,而Oracle Database则由操作系统内的各种文件组成,如下图所示。      图1:Oracle9i 服务器基本架构。

 图1上半部是内存内的Oracle9i Instance,下半部则是位于操作系统的各种数据库文件。彼此之间是藉由各个后台进程互相沟通。一般情况下,这两者之间是一对一关系,但在Oracle的并行环境(OPS , RAC)中,一个Oracle Database 可对应多个Oracle Instance。

二、oracle instance

接下来我们先讨论Oracle Instance的组成要素。

何谓Oracle Instance?

通常我们将Oracle Instance翻译为Oracle实例,俗称Oracle数据库引擎。既然是数据库引擎,就表示Oracle数据库内大大小小的事都跟它有关系,这也是我们一开始就先讨论的主要原因。

Oracle instance主要由以下两项要素组成:

l 系统全局区(System Global Area)

l 后台进程(background processes)

三、系统全局区(SGA)

什么是系统全局区?当启动(startup)Oracle9i数据库时,系统会先在内存内规划一个固定区域,用来储存每位使用者所需存取的资料,以及Oracle运作时必备的系统信息。我们称此区域为系统全域区(System Global Area),俗称SGA 。

在 Oracle8i 时,SGA 的大小是由初始参数文件(initialization parameter file )内的某些参数所设定。但麻烦的是每次调整参数之后必须等重新启动数据库才生效。从 Oracle9i 开始,DBA 可以动态配置内存的大小;这样的技术称为动态SGA(dynamic SGA)。有了dynamic SGA ,SGA 的各组成区域都可以动态地进行规划与调整,而不需先关闭数据库。

如上所述,启动Oracle Instance时系统必须藉由某些参数值来配置适当大小的内存空间。换言之,我们可以在启动Instance之前就先规划这些参数的设定值,并储存在操作系统下的某个文件里。往后只要利用此文件就可开启相对应的Oracle Instance — 我们就将这个文件档案称为初始参数文件(initialization parameter file )。

一般来说,我们还是应该在启动Oracle9i 之前就妥善规划好适当的内存空间。例如,初始参数文件的 SGA_MAX_SIZE可设定 SGA 所占用的最大内存空间。如果考虑 Oracle9i 的性能,应该将此参数尽可能设到最大!但有一点需要注意的是:SGA_MAX_SIZE 尽量不要超过物理内存大小,否则将会使用到硬盘上的虚拟内存,反而导致效能下降。

SGA 的大小可由初始参数文件的特定参数所控制,表1整理出与SGA相关的参数名称及其意义:     注:如果 SGA_MAX_SIZE 的设定值小于其它 SGA 相关参数设定值的总和;或是小于各相关参数默认值的总和,则 SGA_MAX_SIZE 的设定值无效。

  如图1所示,SGA又包含数个重要区域,分别是:

l Database Buffer Cache (数据高速缓冲区)

l Redo Log Buffer (重做日志缓冲区)

l Shared Pool (共享区)

l 其它,如Large pool

以下是每个区域之意义、用途,以及相关设定方式。

1、Database Buffer Cache数据高速缓冲区

 是SGA 的主要成员,用来存放读取自数据文件的数据块拷贝,或是用户曾经处理过的数据。其用途在于有效减少存取数据时造成的磁盘读写动作,进而提升数据存取之性能。所有同时上线的用户都可以共享此缓冲区的数据。

整个数据高速缓冲区包含两个缓冲区列表,分别是 write list 与 LRU list:

l Write list 存放脏缓存(dirty buffers)的拷贝,会在适当时机写入磁盘。dirty buffer 是存放”已修改但尚未写入磁盘的数据”之缓冲区。

l LRU list 包含:free buffers,dirty buffers与pinned buffers。其中free buffer 为空闲的缓冲区,随时可存放数据;pinned buffer则是目前使用中的缓冲区。LRU是指(least recently used),将在下面详细说明。

数据高速缓存区的运作原理是:当用户第一次向Oracle 送出数据查询请求时,Oracle会先在数据高速缓冲区内寻找该数据。如果欲查询的数据恰好已存在于缓冲区内(这样的情况我们称之为缓存命中cache hit ),就直接从内存读出数据资料。

反之,如果缓存区内并没有用户要查询的数据资料(此情况称为 cache miss ),Oracle就会先从磁盘上的数据文件读出适当的数据块(data block),放入缓冲区之后,用户才从缓冲区读取数据。可以想象,在 “cache hit” 的情况下查询数据的速度比在 ”cache miss” 的情况会快很多。事实上,这就是数据缓冲区的主要用途所在。

让我们进行更深入的讨论!当数据块从磁盘读出,准备放入缓冲区时,系统必须先确定缓冲区内有free buffers。这时候Oracle 会开始扫描 LRU list,扫描的原则为:

l 从 LRU 端扫到 MRU 端

l 当扫描到 free buffer;或是已扫描的缓冲区数目超过临界值时,就会停止扫描动作

l 扫描 LRU list 时如果发现了dirty buffer,就将它移到 write list,然后继续扫描

l 如果扫描过程顺利在LRU list 内找到 free buffer,那么Oracle就会把从磁盘读出的数据块放入此 free buffer中,然后再把它移到 LRU list 的 MRU 端。

l 如果一直扫描到LRU list 的某个预定的阈值(predetermined threshold,在ORACLE 9i中,这个阈值是40%)都没有FREE BUFFER,那么Oracle就会停止扫描动作,然后通知数据库写入器(database writer)后台进程将部分 dirty buffers 先写入磁盘(此时当前用户的会话(session)会等待“free buffer waits”event)。接着ORACLE从 LRU list 的 LRU端开始清除缓冲区,这样就可以空出新的free buffer了。

LRU (least recently used)算法的基本概念是:当内存内剩余可利用的空间不足时,缓冲区尽可能先保留用户最常使用的数据;换言之,优先清除”较不常使用的数据”,并释放其空间。

我们将 LRU list 想象成是长条型一连串的缓冲区集合,两端分别为MRU端和LRU端。MRU是Most Recently Used的缩写,可译为”最常使用的”(

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14375621/viewspace-1004829/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论
  • 博文量
    1
  • 访问量
    1816