-------声明:本文参考了Oracle官方文档和互联网的海量信息,并归纳总结而来。如有错误之处,还请各位不吝赐教。
Oracle 服务器是一个数据库管理系统,它提供了一种开放、全面、集成的方法来管理信息。
Oracle 服务器的关键是管理信息。其主要性能有以下几个方面:
开放式联接、开发工具、空间管理、备份与恢复、海量数据管理、保密机制、决策支持系统
<b>Oracle</b><b>数据库体系结构</b><b></b>
<b>Oracle</b><b>服务器由</b><b> Oracle </b><b>实例和</b><b> Oracle </b><b>数据库组成,</b>如图所示:
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855051dRLg.jpg"></a>
简易表示为下图所示:
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855054QSXW.jpg"></a>
每一个Oracle 数据库都关联着一个 Oracle 实例。在数据库服务器上启动数据库后,Oracle 软件会分配一个称为系统全局区(SGA) 的共享内存区,还会启动若干个 Oracle 后台进程。这种 SGA 和Oracle 进程的组合就称为一个 Oracle 实例。
实例启动后,Oracle 软件会将实例与特定的数据库关联起来。这个过程称为装载数据库。接下来就可以打开数据库了。在同一台Oracle服务器上可以并发执行多个实例,每一个实例只访问自己的物理数据库。Oracle 数据库使用内存结构和进程来管理、访问数据库。所有内存结构都存在于构成数据库服务器的计算机的主存中。
进程指的是在这些计算机内存中运行的作业。进程被定义为“控制线程”或操作系统中可以运行一系列步骤的机制。
可以将 Oracle 数据库体系结构看作多种不同的、相互关联的结构化组件。
接下来就介绍一下实例的相关内容:
<b>Oracle</b><b>实例有进程和内存组成。</b><b></b>
先来说一下进程结构,下图是Oracle进程结构。
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855056belw.jpg"></a>
Oracle进程可以分为以下三种:
后台进程:在启动 Oracle 实例时启动。系统为了使性能最好和协调多个用户,在多进程系统中使用一些附加进程,统称为后台进程。在许多操作系统中,一个ORACLE实例可以有许多后台进程,但它们不是一直存在。
用户进程:在数据库用户请求连接到 Oracle 服务器时启动。负责将客户端用户的SQL语句传递给服务进程,并从服务器端拿回查询数据。
服务器进程:可以连接到 Oracle 实例,它在用户建立会话时启动。服务器进程用于处理连接到该实例的用户进程的请求。有以下两种情况:
1、当用户和ORACELE数据库是在同一台机器上运行,而不再通过网络,一般将用户进程和它相应的服务器进程组合成单个的进程,可降低系统开销。 2、当用户和ORACLE数据库运行在不同的机器上时,用户进程经过一个分离服务器进程与ORACLE通信。它可执行下列任务:对应用所发出的SQL语句进行语法分析和执行。从磁盘(数据文件)中读入必要的数据块到SGA的共享数据库缓冲区(该块不在缓冲区时)。将结果返回给应用程序处理。
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855059lB4y.jpg"></a>
<b></b>
<b>Oracle</b><b>的后台进程:</b><b></b>
Oracle的后台进程比较重要的包括以下几个:
SMON PMON DBWRn LGWR ARCHn CKPT
在Linux上可以通过如下方法查看后台进程:
命令为:ps -ef | grep ora_
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855073OKH3.jpg"></a>
SMON(系统监护进程):在实例启动时执行实例恢复,并负责清理不再使用的临时段。SMON进程要完成所有“系统级”任务。PMON感兴趣的是单个的进程,而SMON与之不同,它以系统级为出发点,这是一种数据库“垃圾收集器”。SMON所做的工作包括:
·清理临时空间
·合并空闲空间
·针对原来不可用的文件恢复活动的事务
·执行RAC中失败节点的实例恢复
·清理OBJ$
·收缩回滚段
·“离线”回滚段
PMON(用户进程监护进程):后台进程清除失败用户的进程,释放用户当时正在使用的资源。PMON负责释放锁并使其可以被其他用户使用。同SMON一样,PMON周期性地唤醒检测它是否需要被使用。负责在出现异常中止的连接之后完成清理-释放资源,回滚未提交的事务工作。还负责监视其他的Oracle后台进程,并在必要时重启这些后台进程。另外,PMON还会为实例做另外一件事,这就是向Oracle TNS监听器注册这个实例。
DBWR(数据文件写入进程):负责将更改的数据从数据库缓冲区高速缓存写入数据文件,是负责缓冲存储区管理的一个ORACLE后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。ORACLE采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持内存中的数据块是最近使用的,使I/O最小。
下列情况预示DBWR 要将弄脏的缓冲区写入磁盘:
1、当一个服务器进程将一缓冲区移入“脏”表,该脏表达到临界长度 时,该服务进程将通知DBWR进行写。该临界长度是为参数DB-BLOCK-WRITE-BATCH 的值的一半。
2、 当一个服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没有查到未用的缓冲区,它停止查找并通知DBWR进行写。
3、出现超时(每次3秒),DBWR 将通知本身。
4、 当出现检查点时,LGWR将通知DBWR
在前两种情况下,DBWR将脏表中的块写入磁盘,每次可写的块数由初始化参数 DB-BLOCK-WRITE-BATCH所指定。如果脏表中没有该参数指定块数的缓冲区,DB WR从LUR表中查找另外一个脏缓冲区。
如果DBWR在三秒内未活动,则出现超时。在这种情况下DBWR对LRU表查找指定数目的缓冲区,将所找到任何脏缓冲区写入磁盘。每当出现超时,DBWR查找一个新的缓冲区组。每次由DBWR查找的缓冲区的数目是为寝化参数DB-BLOCK-WRITE-BATCH的值的二倍。如果数据库空运转,DBWR最终将全部缓冲区存储区写入磁盘。在出现检查点时,LGWR指定修改缓冲区表必须写入到磁盘。
LGWR(日志文件写入进程):该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个ORACLE后台进程。LGWR进程将自上次写入磁盘以来的全部日志项输出,LGWR输出:
1、 当用户进程提交一事务时写入一个提交记录。 2、每三秒将日志缓冲区输出。 3、当日志缓冲区的1/3已满时将日志缓冲区输出。 4、有大于1M 重做日志缓冲区未被写入磁盘 5、超时
LGWR进程同步地写入到活动的在线从做日志文件组。如果组中一个文件被删除或不可用,LGWR 可继续地写入该组的其它文件。由于日志缓冲区是一个循环缓冲区。当LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。LGWR 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
【注意:】有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。ORACLE使用快速提交机制,当用户发出COMMIT语句时,一个提交(COMMIT)记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一个事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一
起记录在日志中。由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。
CKPT(检查点进程,同步数据文件, 日志文件,控制文件):该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。在通常的情况下,该任务由LGWR执行。然而,如果检查点明显地降低系统性能时,可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现。对于许多应用情况,CKPT进程是不必要的。只有当数据库有许多数据文件,LGWR在检查点时明显地降低性能才使CKPT运行。CKPT进程不将块写入磁盘,该工作是由DBWR完成的。初始化参数CHECKPOINT-PROCESS控制CKPT进程的使能或使不能。缺省时为FALSE。
ARCH(归档进程):该进程将已填满的在线日志文件拷贝到指定的存储设备。当日志是为ARCHIVELOG使用方式、并可自动地归档时ARCH进程才存在。
LCKn(封锁进程):是在具有并行服务器选件环境下使用,可多至10个进程(LCK0,LCK1 ……,LCK9),用于实例间的封锁。
其他还有一些不是很重要的进程:
RECO 恢复
Dnnn 调度进程
Snnn 服务器
但是每个后台进程都与ORACLE数据库的不同部分进行交互。
<b>服务进程</b><b>Server Process</b>
可以分为专用服务器进程和共享服务器进程。
专用服务进程(Dedicated Server Process):一个服务进程对应一个用户进程
共享服务进程(MultiTreaded Server Process):一个服务进程对应多个用户进程,轮流为用户进程服务。
专用服务器模式就是说每次在对Oracle进行访问的时候,Oracle服务器的Listener会得到这个访问请求,然后会为这个访问创建一个新的进程来进行服务。所以说,对于每一个客户端的访问,都会生成一个新的进程进行服务,是一种类似一对一的映射关系。这种连接模式的一个很重要的特点就是UGA(用户全局区)是存储在PGA(进程全局域)中的,这个特性也很好说明了当前用户的内存空间是按照进程来进行分配的。
共享服务器连接则是在数据库的初始化的时候就会创建一批服务器连接的进程,然后把这些连接进程放入一个连接池来进行管理。初始化的池中的进程数量在数据库初始化建立的时候是可以手动设置的。在连接建立的时候,Listener首先接受到客户端的建立连接的请求,然后Listener去生成一个叫做调度器(dipatcher)的进程与客户端进行连接。
接着来说一下内存结构,下图是Oracle内存结构。
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855078xXhw.jpg"></a>
与 Oracle 实例关联的基本内存结构包括:
系统全局区 (SGA):由所有服务器进程和后台进程共享
程序全局区 (PGA):专用于每一个服务器进程或后台进程。每一个 进程使用一个 PGA
<b>系统全局共享区</b><b>System Global Area(SGA)</b>
SGA是一块巨大的共享内存区域,是包含实例的数据和控制信息的内存区。他被看做是Oracle 数据库的一个大缓冲池,这里的数据可以被ORACLE的各个进程共用。其大小可以通过如下语句查看:
SQL&gt; select * from v$sga;
NAME VALUE
-------------------- -------------------------------
Fixed Size 1218992
Variable Size 96470608
Database Buffers 184549376
Redo Buffers 2973696
SQL&gt; select * from v$sgastat;
…………
POOL NAME BYTES
------------ -------------------------- ------------------------------------
large pool PX msg pool 206208
large pool free memory 3988096
java pool free memory 4194304
608 rows selected.
SGA 包含以下数据结构:
数据库缓冲区高速缓存(Database buffer cache):缓存从数据库检索的数据块。这些缓冲是对应所有数据文件中的一些被使用到的数据块。让他们能够在内存中进行操作。在这个级别里没有系统文件,,用户数据文件,临时数据文件,回滚段文件之分。也就是任何文件的数据块都有可能被缓冲。数据库的任何修改都在该缓冲里完成,并由DBWR进程将修改后的数据写入磁盘。
重做日志缓冲区(Redo log buffer):高速缓存重做信息(用于实例恢复),直到可以将其写入磁盘中存储的物理重做日志文件。对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句,如(Insert,Update,Delete),或DDL语句,如(Create,Alter,Drop等)。 重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小,大于3M之后的重作日志缓冲区已经没有太大的实际意义。
共享池(Shared pool):缓存可在用户间共享的各个结构。共享池是SGA中最关键的内存片段,特别是在性能和可伸缩性上。一个太小的共享池会扼杀性能,使系统停止,太大的共享池也会有同样的效果,将会消耗大量的CPU来管理这个共享池。不正确的使用共享池只会带来灾难。
大池(Large Pool):是一个可选区域,可为某些大型进程(如 Oracle 备份和恢复操作、I/O 服务器进程)提供大量内存分配。大池并不是因为大而得名,而是因为它用来分配较大的内存,处理比共享池更大的内存。从Oracle8i开始引用。
Java 池:用于 Java 虚拟机 (JVM) 中特定会话的所有Java 代码和数据。 Oracle 8I 以后,Oracle 在内核中加入了对Java的支持。该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小。
Streams 池:由 Oracle Streams 使用通过使用 Enterprise Manager 或SQL*Plus 启动实例,可以显示为SGA 分配的内存量。
程序全局区 (PGA) 是包含各个服务器进程的数据及控制信息的内存区。Oracle 服务器进程为客户机的请求提供服务。每个服务器进程都有自己专用的PGA,这个 PGA 是在服务器进程启动时创建的。由该服务器进程对PGA 进行独占访问,只能通过对 PGA 执行操作的Oracle 代码对 PGA 进行读写访问。使用动态 SGA 基础结构时,可以在不关闭实例的情况下,更改数据库缓冲区高速缓存、共享池、大型池和 Java 池以及Streams 池的大小。
Oracle 数据库使用初始化参数创建并配置内存结构。例如,SGA_TARGET 参数可指定
SGA 的总大小。如果SGA_TARGET 设置为 0,则会禁用“自动共享内存管理”。
本文转自 linuxtro 51CTO博客,原文链接:http://blog.51cto.com/linuxtro/289197,如需转载请自行联系原作者