<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->
Oracle数据库管理系统由 oracle 数据库和 oracle 实例组成
Oracle实例也被称作数据库服务 (databaseservice) 或服务器 (server) ,是一组操作系统进程和内存区域。
一. 概述
1. 实例和数据库之间的关系
Oracle数据库文件由许多实例构成,每个实例又由 oracle 后台进程和系统全局区 (SGA) 组成。
数据库实例也叫服务器,是用来访问数据库文件集的存储结构以及后台进程的集合。
2. oracle实例的组成
Oracle实例是一个复杂的内存结构与后台进程的交互体。
3. oracle实例与参数文件
每个实例都用一个标识符来标识,此标识符叫系统标识符SID(systemidentifier) 。
存储在初始化文件(init.ora) 里的参数决定实例的大小和组成,对此文件的任何修改将在下一次启动数据库时起作用。
二. Oracle数据库系统的内存结构
内存结构:指一个进程在其中进行自身对话或与其他进程对话的区域。Oracle 使用两种内存结构,系统全局区 (systemglobalarea,SGA) ,程序全局区 (programglobalarea,PGA) 。
1. SGA
开始运行一个oracle 实例时就分配了一个 SGA 的大的内存块,此块被后台进程所共享。
它包含了数据维护、SQL 语句分析、重做缓存所必须的所有内存结构。
在数据库非安装阶段,当创建实例时,分配系统全局区;当关闭实例时,释放系统全局区。SGA 由以下几个部分组成
a. 数据库高速缓存区
是内存中用来存储被频繁访问的数据的区域,由若干缓存器组成,每个缓存器的大小和数据库块的大小相匹配。
通常是SGA 中最大的部分,构成图如下:
保持缓存池:存储长期保存的被频繁访问的模式对象,它的大小有初始化参数文件中的buffer_pool_keep 参数控制。
再生缓存池:存储被频繁扫描的大表,想尽快从内存中排除的模式对象使用它,其大小由初始化参数文件中的buffer_pool_keep 参数控制。
默认缓存池的大小= 高速缓存区的大小 -( 保持 + 再生池剩余部分 ) ;
b.共享池
共享池是内存中的一块区域,用来缓存PL/SQL 程序单元、 SQL 语句的解析版本、 SQL 语句的执行计划、数据字典信息。
共享池由库缓存区和数据字典缓存区组成。
库缓存器:由共享SQL 区和 PL/SQL 区组成。
数据字典缓存区:存储用于分析SQL 语句的数据字典行。
共享池的大小取决于初始化参数文件中的参数shared_pool_size ,以字节为单位。
c.重做日期缓存区
用于在内存中存储为被刷新写入联机重做日志文件的重做信息;是oracle 在循环方式下使用的先进先出的缓冲区,一个指向日志头,一个指向日志尾。当重做日志缓存区填满时,其内容将被写入联机重做日志文件。
大小可在初始化参数文件中由log_buff 参数设定,以字节为单位。
d.大缓存池
大缓存池是oracle 的一个可选内存区,主要用于多线程的服务器或备份还原等操作; oracle 的多线程服务器使用大缓存池作为分配会话内存的区域。使用初始化参数文件中的 large_pool_size 参数设定其大小,默认值为 0 。
e.固定的 SGA
用于存储大量的值,这些值是为了对实例进行操作。
2. 程序全局区(PGA)
每个连接到oracle 数据库的进程都需要自己的内存区,这个内存区就叫 PGA 。 PGA 不能共享,包含有单个进程工作时需要的数据、控制信息、进程会话变量和内存数组等。进程使用它存储变量、数组以及不与其他进程共享的信息。
初始化参数文件中的sort_area_size 和 sort_area_retained_size 参数的设置影响 PGA 的大小, PGA 的大小不超过 sort_area_size 指定的范围。
三. Oracle数据库系统的后台进程
典型的oracle 后台进程集合
1. 数据库书写进程(DBWR)
DBWR把被修改过的数据块从内存写回到数据库的数据库文件中, DBWR 不是在每一数据块被修改后立即写入数据库文件,而是一直等待,直到满足一定标准后,才成批的读脏列表,并将在脏列表中发现的所有块刷新写入数据文件。
一个oracle 实例至少要有一个 DBWR 进程,通过在初始化参数文件的 db_writer_processes 参数来设置数据库书写进程的数量。
2. 日志书写进程(LGWR)
LGWR的工作是处理所有提交的事物引起改变的记录信息。 Oracle 按照下面步骤完成日志:
a. 在执行一个事物时创建重做项,包含足够的信息,可重新生成事物引起的改变;
b. Oracle在服务器的重做日志缓存区中临时存放事物的重做项;
c. 在要求oracle 提交事物时,日志书写进程从重做日志缓存区中重新写入相应的重做项,然后将他们写入数据库的联机重做日志文件中。
3. 检查点进程(CKPT)
启用这个进程来减少LGWR 的工作量,设置 checkpoint_process 参数为 TRUE ,即可启动 CKPT 进程。
4. 系统监视进程(SMON)
SMON的 3 项功能:
·崩溃恢复
·临时段的清除
·合并自由空间
常见功能是重新分配用于排序的临时段,还周期地检查数据文件,自动合并在数据文件中相邻的自由空间。
5. 进程监视进程(PMON )
在非正常中断操作是,PMON 会注意到这些,并执行以下操作:
·释放任何进程包含的锁
·回滚那些进程已经启动但为提交的事物
·释放该用户连接进程所占的并可能妨碍其他用户完成数据库工作的全部资源
·从活动的进程列表中删除被中断的进程标识
6. 作业队列进程(JobQueueProcesses )
作业队列进程用于批处理运行用户的作业,可以看作是调度服务,用于在一个oracle 实例上调度作业,如 PL/SQL 语句或存储过程等。
动态的作业队列进程可以在一个给定的时间间隔内并发地运行多个作业,作业队列进程在被CJQ 进程分配之后就开始运行用户的作业,下面描述其运行过程:
a. 协调进程(CJQ0 )定时地从系统 JOB$ 表里选择需要运行的作业,新作业的选择按时间排序
b. CJQ0进程动态地生产作业队列奴隶进程( J000......J999 )来运行作业
c. 作业队列进程是被CJQ 进程选取的作业中的一个。
d. 作业队列进程执行完一个作业之后就会等待新的作业,如果没有调度作业的需要,就进入睡眠状态,在一定时间间隔后苏醒,检查有没有作业。
7. 恢复进程(RECO)
所有的oracle 实例都有恢复进程,为了自动解决有故障的分布式事务。分布式事务是在多个数据库中更新数据的事物, oracle 可以支持分布式数据库系统和分布式事务。
8. 归档进程(ARCH)
归档进程的任务是将已经写满的联机日志文件复制到归档日志文件中,这仅仅在数据库运行在归档模式(ARCHIVELOG) 下才发生; oracle 可以允许多个归档进程,用 log_archive_max_processes 设置允许的最大数。
9. 队列监视进程(QMON )
该进程是一个可选择的后台进程,可用于和oracle 的优先队列任选项( advancedqueuing,AQ )一起使用,最多有 10 个。 AQ 提供了很多特性,包括队列中消息的优先级、排序,并且具有发送消息给本地或异地队列的能力。