oracle:运行时结构组成(instance ,后台进程)

来源:互联网 发布:帝国cms标签工具 编辑:程序博客网 时间:2024/06/03 17:07

本篇从内存结构角度来说明oracle的组成。

 

一个oracle server 由一个oracle实例和一个oracle数据库组成。

oracle server = oracle Instance +Oracle Database

 

Oracle 实例

包括内存结构(SGA)和一系列后台进程(background process),两者合起来称为一个oracle实例。

Oracleinstance = sga+background Process

 

Oracle 内存结构

包含系统全局区(SGA)和程序全局区(PGA)

oracle memory Structures = SGA +PGA

 

SGA由服务器和后台进程共享

PGA包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA相反,PGA只被一个进程使用的区域,PGA在创建进程时分配在终止进程时回收。由服务器进程产生。

 

下图给出oracle体系结构中主要的组件,本文接下来将对instance中的组件进行介绍:

 

1       SGA

 

SGA 是一块巨大的共享内存区域,被看做是oracle数据库的一个大缓冲池,这里的数据可以被oracle的各个进程共用。

SGA = 数据缓冲区 +重做日志缓冲区 +共享池 +大池 + java 池 +池流

系统全局区是动态的,由参数 SGA_MAX_SIZE决定

查看当前系统的SGA大小: show parameter sga_max_size;

修改: alter system set sga_max_sieze=1200m scope=spfile;

因为实例内存分配是在数据库启动时进行的,所以要重启数据库让修改生效。

ASMM,自动内存管理,oracle会自动的对共享池、java池、大池、数据缓冲区、池流进行自动调配。

 

1.1      共享池(shared pool)

 

         共享池是SGA中最关键的内存片段,特别是在性能和可伸缩性上。

         太小的共享池会扼杀性能,太大的共享池会有同样的效果,将会消耗大量的cpu来管理这个共享池。不正确的使用共享池只会带来灾难。共享池主要又可以分为以下2个部分:

 

1.1.1        Sql语句缓存(Library cache)

 

用户提交一个sql语句,oracle会将这句sql进行分析(parse),这个过程类似于编译,会耗费相对较多的时间。分析完这个sql,oracle会把他的分析结果给保存在shared pool的library cache中,当数据库第二次执行该sql时,oracle自动跳过这个分析过程,从而减少系统运行的时间。

保存在共享池中sql,可以从v$sqltext, v$sqlarea中查询到,对于编程者来说,尽量提高语句的重用率,减少语句的分析时间。提高sql语句的重用率必须先培养良好的编程习惯,尽量使用bind变量

1.1.2        数据字典缓冲区(data Dictionary cache)

数据字典缓冲区是oracle特地为数据字典准备的一块缓冲池,供oracle内部使用。

1.2      块缓冲区高速缓存(database buffer cache)

 

这些缓冲对应所有数据文件中的一些被使用到的数据块,让他们可以在内存中进行操作。在这个级别里,没有系统文件、用户数据文件、临时数据文件、回滚段文件之分。也就是任何文件的数据库都有可能被缓冲。数据库的任何修改都在该缓冲里完成,并由DBWR进程将修改后的数据写入磁盘

这个缓冲区的块在2个不同的列表中管理:一个是块的‘脏’表(dirty list),需要用数据块的DBWR来写入,另外一个是不脏的块的列表(free list)。一般情况下,是使用最近最少使用算法来管理。

块缓冲去高速缓存又可以分为3个部分(defaultpool, keep pool, recycle poll),如果不是人为设置初始化参数(init.ora),oracle 将默认为default pool。由于操作系统寻址能力的限制,不通过特殊设置,在32位的系统上,块缓冲区高速缓存最大可达到1.7G,64位系统,最大可达到10G。

1.3      重做日志缓冲区(redo log buffer)

重做日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句,如(insert,update,delete)或DDL语句,如(create,alter,drop等)。重做日志缓存区的存在,是因为内存到内存的操作比内存到硬盘的速度快很多。重做日志缓冲区可以加速数据库的操作速度。但是考虑数据库的一致性与可恢复性,数据在重做日志缓冲区的滞留时间不会很长,所以重做日志缓冲区一般都很小。【操作速度和安全性之间需要权衡考虑

1.4      Java程序缓冲区(java pool)

Java的程序区,oracle在内核中加入了对java的支持,该缓冲区就是为java程序保留的,如果不用java程序没有必要改变该缓冲区的默认大小。

1.5       大池(large pool)

大池的得名不是因为大,而是因为它用来分配大块的内存处理比共享池更大的内存

下面对象使用大池:

MTS,在SGA的large pool中分配UGA;

语句的并行查询,允许进程间消息缓冲区的分配,用来协调并行查询服务器;

备份,用于RMAN磁盘IO缓存

2  后台进程(background process)

后台进程是oracle的程序,用来管理数据库的读写,恢复和监视等工作。

Server process 主要是通过他和userprocess进行联系和沟通,并由他和user process进行数据的交换。在unix中,一个oracle后台进程将启动一个操作系统进程;在Windows机器上,我们只能看到一个oracle.exe进程,后台进程是操作系统中的线程。

     Unix中,查看后台进程:

    Ps -ef|grep ora_

    可以看到oracle有5个基本进程

    DBWR(数据文件写入进程)

    LGWR(日志文件写入进程)

     SMON(系统监护进程)

PMON(用户进程监护进程)

CKPT(检查点进程,同步数据文件,日志文件,控制文件)

2.1       DBWR

修改过数据缓冲区的数据写入对应数据文件

维护系统内的空缓冲区

 

几个错误的说法

当一个更新提交后,DBWR把数据写到磁盘并返回用户提交完成

DBWR会触发CKPT后台进程

DBWR不会触发LGWR进程

 

DBWR是一个很底层的工作进程,批量的把缓冲区的数据写入磁盘。和任何前台用户的进程没有什么关系,也不受他们控制。

 

DBWR工作的主要条件如下:

DBWR超时

系统中没有多的空缓冲区用来存放数据

CKPT进程触发DBWR

2.2      LGWR

重做日志缓冲区的数据写入重做日志文件,LGWR是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志记录在重做日志缓冲区内,这个重做日志可以类似看做以下的一个结构:

SCN=000000001000

数据库ID

对象ID=0821

数据行=02

修改后的数据=0011

 

提交的时候,LGWR必须将被修改的数据的重做日志缓冲区内数据写入日志数据文件,然后再通知前台进程提交成功,并由前台进程通知用户。LGWR承担了维护系统数据完整性的任务。

 

触发LGWR工作的主要条件:

用户提交

有1/3重做日志缓冲区未被写入磁盘

有大于1M重做日志缓冲区未被写入磁盘

超时

DBWR需要写入的数据的SCN号大于LGWR记录的SCN号,DBWR触发LGWR写入

 

2.3      SMON

主要工作:

清除临时空间

在系统启动时,完成系统实例恢复

聚结空闲空间

从不可用的文件中恢复事物的活动

OPS中失败节点的实例恢复

清除OBJ$表

缩减回滚段

使回滚段脱机

 

2.4      PMON
 

主要用于清除失效的用户进程,释放用户进程所用的资源。如 PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源。

 

2.5      CKPT

 

同步数据文件,日志文件和控制文件。由于DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一致,这需要CKPT进程来同步。CKPT会更新数据文件/控制文件的头信息。

 

触发CKPT工作的主要条件:

在日志切换的时候

数据库用immediate,transaction,normal选项shutdown数据库的时候

根据初始化文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET的设置的数值来确定

用户触发

2.6      ARCH(需手工配置)

当数据库以归档方式运行的时候,oracle会启动ARCH进程,当重做日志文件被写满时,日志文件进行切换,旧的重做日志文件就被ARCH进程复制到一个/多个特定的目录/远程机器,这些被复制重做日志文件叫做归档日志文件

2.7      Reco(需手工配置)

负责解决分布事务中的故障,oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。Reco进程试图建立与远程服务器的通信,当故障消除后,reco进程自动解决所有悬而未决的会话。

2.8      服务进程(server process)

        服务进程的分类:

         专用服务进程(dedicatedserver process):一个服务进程对于一个用户进程

         共享服务进程(sharedserver process):一个服务进程对于多个用户进程,轮流为用户进程服务。

         PGA:process Global Area

         UGA: user global Area,保存了用户的变量,权限,堆栈,排序空间等用户信息

         对于专用服务器进程,UGA在PGA中分配

         对于共享服务进程,UGA在Large pool分配

2.9      用户进程(user process)

在客户端,将用户的sal语句传递给服务进程

 

3       SCN(system change number)

 

一个贯穿数据库全局的概念,系统改变号SCN

一个由系统内部维护的序列号,当系统需要更新的时候自动增加,它是系统中维持数据的一致性和顺序恢复的重要标志。

查询语句不会使SCN增加,同时发生的更新,数据库内部对应的SCN也是不同的,这样就保证了数据恢复时的顺序,维持数据的一致性。

 

  

        

4       参考资料

Oracle体系结构详细图解

http://blog.csdn.net/mengxiangfeiyang/article/details/7841653

Oracle实例和Oracle数据库(Oracle体系结构)

http://blog.csdn.net/leshami/article/details/5529239

oracle 体系结构

http://blog.csdn.net/wanghai__/article/details/4683983

 


0 0
原创粉丝点击