您的位置:首页 > 数据库 > Oracle

Oracle的软件结构

2005-04-08 09:56 232 查看
/* Oracle软件结构 */
Oracle实例由一系列后台进程和内存结构构成.,主要由两部分组成:
1.实例的内存结构:SGA/PGA
2.实例的进程结构:服务进程和后台进程
/*** SGA ***/
SGA区中的信息能够被所有的Oracle进程共享使用,主要包含如下内存结构:
* 数据库缓存
* 重做日子缓存
* 共享池
* 大型池
* JAVA池
* 数据字典缓存
* 保存其它控制信息的结构
SGA区的大小主要由如下几个参数决定:
DB_CACHE_SIZE/LOG_BUFFER/SHARED_POOL_SIZE/LARGE_POOL_SIZE
oracle 9i中能够在实例运行过程中动态改变SGA区相关的初始化参数
数据库缓存(DB_CACHE_SIZE):
Oracle通过维护两个列表来管理数据库缓存中的数据块
1.写入列表(脏缓存块列表)
2.最近最少使用列表(LRU列表)
数据库缓存的结构:
根据缓存块的特性,可以将缓存块分类存放到不同的缓存池中:
KEEP缓存池/RECYCLE缓存池/DEFAULT缓存池
KEEP缓存池的大小+RECYCLE缓存池的大小+DEFAULT缓存池的大小 = DB_CACHE_SIZE
重做日志缓存(LOG_BUFFER):
在数据库运行中也可以动态更改
共享池(SHARED_POOL_SIZE):
共享池主要包括:库缓存,数据字典缓存,用于存储并行操作信息和控制结构的缓存
库缓存:
用于缓存已经解析并执行过的SQL和PL/SQL程序代码,主要包含共享SQL工作区和私有SQL工作区两个结构,每条被缓存的SQL语句都被分成两个部分,分别存在共享SQL工作区和私有SQL工作区中.
* 共享SQL工作区:存放有SQL语句的语法分析结果和执行计划
* 私有SQL工作区:包括SQL语句中的绑定变量和环境会话参数,一般情况下私有SQL工作区位于PGA中
库缓存的大小和初始化参数OPEN_CURSORS密切相关,OPEN_CURSORS参数用于指定数据库中能够同时打开的游标数量,每条查询语句都需要打开一个游标.
数据字典缓存:
保存最常用的数据字典信息,路数据库用户的账户信息,数据库的结构信息.
大型池(LARGE_POOL_SIZE):
在执行如下操作时,需要创建大型池,
1.进行数据库备份或恢复操作
2.执行具有大量排序操作的SQL语句
3.执行并行化的数据库操作
/*** PGA ***/
程序全局区PGA是保存有特定服务进程的数据和控制信息的内存结构,这个内存结构是非共享的,只有服务进程本省才能够访问它自己的PGA区.一般情况下,PGA区都由私有SQL工作区和会话内存区组成.
私有SQL工作区:
多条相同的SQL语句只会建立一个共享SQL工作区,但是可以对应于多个私有SQL工作区.将一个私有SQL工作区与对应的共享SQL工作区合并在一起,就可以获得一条SQL语句的完整缓存数据.
每个会话的私有SQL工作区可以分为静态区和动态区两部分.对私有SQL工作区的操作是由游标完成的.因此,一个用户能够使用的私有SQL工作区数目取决于他能打开的游标数目,通过设置OPEN_CURSORS可以限制用户能够同时打开的游标数目.私有SQL工作区的静态区在游标打开时创建,直到游标被显示地关闭时才被释放,而动态区在游标执行完毕一项操作后立即被释放.
会话内存区:
会话内存区用于保存用户会话的变量(登录信息)以及其它与会话相关的信息.
设置SQL工作区:
用户在执行一些包含特殊操作的SQL语句时,需要在处理用户会话的服务进程的PGA区中创建一些专用的内存结构,这些内存结构统称为SQL工作区.这些操作包括排序,连接和集合运算.排序区时最常见的一种SQL工作区,每个用户所能使用的最大排序区由初始化参数SORT_AREA_SIZE指定.
/*** 服务进程 ***/
服务进程主要完成如下任务:
* 解析并执行用户所提交的SQL语句
* 搜索所要访问的数据
* 将数据返回给用户
/*** 后台进程 ***/
DBWR,LGWR,CKPT,SMON,PMON是ORACLE实例必需的后台进程
/* DBWR进程 */
ORACLE最多可启动10个DBWR进程.
只有在发生下列情况时,DBWR进程才开始将脏缓存块写入数据文件:
* 如果ORACLE在数据库缓存的LRU列表中搜索了一定数量(DB_BLOCK_MAX_SCAN)初始化参数设置)的缓存块后,仍然没有找到可用的空闲缓存块,DBWR进程将被启动
* 当检查点发生时,将启动DBWR进程
* 当数据库缓存的LRU列表的长度达到初始化DB_BLOCK_WRITE_BATCH指定值的一半时,DBWR进程将被启动.也就是
如果数据库缓存中拥有太多的脏缓存块,将会启动DBWR进程将一部分脏缓存块写入数据文件中
* 当发生超时(大约3秒内未被启动),DBWR进程将被启动
与DBWR进程相关的初始化参数
1.DB_WRITER_PROCESSES: 设置创建实例时启动的DBWR后台进程的数量
2.DB_BLOCK_CHECKPOINT_BATCH: 设置在每个检查点发生时,DBWR进程写入的脏缓存块的最大数目,增大这个参数,可以延长启动DBWR进程的时间间隔
/* LGWR进程 */
只有在发生下列情况时,LGWR进程才开始将缓存数据写入重做日志文件:
* 用户通过COMMIT语句提交当前事务
* 重做日志缓存被写瞒三分之一
* DBWR进程开始将脏缓存块写入数据文件
* 每隔三秒,即发生一次超时,LGWR进程将被启动
事务提交成功后,ORACLE将为该事务生成一个系统变更码(SCN),事务的SCN将同时记录在它的提交记录和重做记录中
不必担心在组提交情况下是否有未提交事务的重做记录也被写入重做日志文件,因为这些事务的重做记录由于缺少一个提交记录,所以能够被ORACLE识别出来.
/* CKPT进程 */
"检查点"是一个事件,当该事件发生时,数据库缓存中的脏缓存块将被写入数据文件,同时ORACLE将对数据库控制文件和数据文件进行更新,以记录当前的数据库结构和状态.在执行了一个检查点后,ORACLE知道所有已提交事务对数据库所做的更改已经全部被写入到硬盘中了,此时数据库处于一个完整状态.在发生数据库崩溃后,只需要将数据库恢复到上一个检查点时刻即可.
CKPT进程本身只完成两件工作:
* 执行检查点和更新控制文件和数据文件
* 将脏缓存块写入数据文件的任务交给DBWR进程完成
ORACLE在不同时刻执行不同级别的检查点,在数据库内部定义有许多基于特定操作的检查点。如:ORACLE在每一次重做日志切换时,执行一个数据库检查点,在执行数据库检查点时,DBWR进程将缓存中所有的脏缓存块写入数据文件中;而在一个表空间被设置为脱机状态时,ORACEL执行一个表空间检查点,在执行表空间检查点时,DBWR进程只会把缓存中与该表空间相关的脏缓存块写入数据文件,此外,还可以设置以时间为基础的检查点,即每隔多长时间执行一次检查点.
在ORACLE 8I以前版本中,CKPT进程在默认情况下并不启动,要启动CKPT进程必须将初始化参数CHECKPOINT_PROCESS设置为TRUE。而在ORACLE 9I中该初始化从参数已废弃,在实例启动时将会自动启动CKPT进程.
与检查点相关的初始化参数:
* LOG_CHECKPOINT_TIMEOUT 用于指定检查点执行的最大间隔时间(以秒为单位),如果该参数为0,将禁用基于时间的检查点
* LOG_CHECKPOINT_INTERVAL 用户指定在出现检查点之前,必须写入重做日志文件中的操作系统块的数量
/* SMON进程 */
系统监视进程SMON在实例启动时负责对数据库进行恢复操作,另外SMON还负责:
* 在临时段或临时表空间中回收不再使用的存储碎片
* 将个个表空间中的空闲空间碎片合并在一起
/* PMON进程 */
进程监视进程PMON负责对那些失败的用户进程或服务进程进行恢复,并且释放进程所占用的资源.
/* RECO进程 */
恢复进程RECO负责在分布式数据库环境中自动恢复那些失败的分布式事务
/* ARCn进程 */
要启动ARCn进程,需要将初始化参数ARCHIVE_LOG_START设置为TRUE,ARCn进程启动后,数据库将具有自动归档功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: