日期:2014-05-16 浏览次数:20555 次
1.Oracle体系结构
Oracle Server 由例程(Instance)和数据库(Database)两部分组成。
例程是一组内存机构和后台进程的集合,其内存结构主要包括数据高速缓存、重做日志缓冲区和共享池三部分,总称SGA(System Global Area)。
后台进程主要包括SMON、PMON、DBWR、CKPT、LGWR、ARCH等。
数据库是一组OS文件的集合,它由数据文件、控制文件和重做日志组成。
?
2.数据高速缓存(Database Buffer Cache)用于存放最近访问的数据块信息,它由许多小缓冲区(缓冲区尺寸=数据块尺寸)组成。初始化参数DB_CACHE_SIZE和DB_nK_CACHE_SIZE(n:2、4、8、16或32)来定义数据高速缓存尺寸,其中初始化参数DB_CACHE_SIZE用于定义标准数据高速缓存的尺寸,DB_nK_CACHE_SIZE用于定义非标准数据高速缓存的尺寸。Oracle采用LRU(Least Recently Used)算法管理数据高速缓存。
数据高速缓存结构,按使用情况划分为脏缓冲区(Dirty Buffer)、空闲缓冲区(Free Buffer)、忙缓冲区(Pinned Buffer)三种。
?
3.重做日志缓冲区(Redo Log Buffer)用于记载例程变化,其尺寸由初始化参数LOG_BUFFER定义。
执行DDL或DML语句时,服务器进程首先将事物变化记载到重做日志缓冲区,然后才会修改数据高速缓存。重做日志缓冲区由很多重做记录(Redo Record)组成,并且每条重做记录记载了被修改数据块的位置以及变化后的数据。
?
4.共享池主要由库高速缓存(Library Cache)和数据字典高速缓存(Dictionary Cache)两部分组成。
库高速缓存用于存放最近执行的SQL语句信息,包括SQL语句文本、解析代码值及其执行计划。库高速缓存包含许多上下文区(Context Area),每个上下文区都包含相应SQL语句的执行计划,这些上下文区又被称为共享游标。当客户端运行SQL语句时,服务器进程首先检查共享游标是否存在,若存在按照其执行计划直接执行语句;若不存在则生成SQL语句执行计划,并将执行计划存放到相应的上下文区中,然后执行SQL语句。通过共享游标,可以最小化SQL语句解析次数,从而提高SQL语句的执行性能。
数据字典高速缓存(Dictionary Cache)用于存放数据字典的信息,包括表、列的定义以及权限信息。库高速缓存和数据字典高速缓存的尺寸是动态变化的,不是固定的。
?
5.动态改变共享池尺寸
alter system set shared_pool_size=60m;
动态修改数据高速缓存尺寸
alter system set db_cache_size=60m;
alter system set db_4k_cache_size=20m;
SGA除了包含以上三个之外还提供了两个可选的内存结构:大缓冲池(Large Pool)和Java池(Java Pool)。
大缓冲池用于为大内存操作提供相对独立的内存空间。通过分配大缓冲池,可以提高这些大内存操作的性能。如下情况应分配大缓冲池:
使用共享服务器。
使用RMAN在执行备份、转储和恢复操作。
执行并行查询。
使用I/O Slaves提高I/O性能(如配置初始化参数dbwr_io_slaves)。
alter system set large_pool_size=20m;
Java池用于存放Java代码,其尺寸由JAVA_POOL_SIZE定义。如果要在Oracle数据库中安装
Java VM,必须配置Java池,并且其尺寸应大于20M。
?
6.PGA(Program Global Area)用于存放服务器进程的数据和控制信息,它是独立于SGA的一块内存区域。当用户进程连接到Oracle Server时,Oracle Server会为每个服务器进程分配相应的PGA。初始化参数pga_aggregate_target用于指定所有服务器进程总计占用的最大PGA内存空间。PGA由排序区(Sort Area)、会话信息(Session Information)、游标状态(Cursor State)以及堆栈空间(Stack Space)等4部分组成。
排序区(Sort Area)用于存放排序操作所产生的临时数据,它是影响PGA尺寸的主要因素,并且其尺寸由初始化参数SORT_AREA_SIZE定义。
会话信息(Session Information)运行应用程序访问Oracle Server时,会话所具有的权限、角色以及会话的性能统计信息会被存放到PGA中。
游标状态(Cursor State)运行SQL语句时,Oracle会在共享池中为该SQL语句分配上下文区,游标实际是指向该上下文区的指针,而PGA中的游标状态则指出了当前SQL语句所处状态。
堆栈空间(Stack Space)用于存放会话变量信息。当SQL语句中有绑定变量时,其信息会被存放到堆栈空间中。
?
7.SMON(System Monitor)用于执行例程恢复、合并空间碎片并释放临时段。假定在数据库运行过程中出现了例程失败(断电、内存故障、后台进程例外等),此时SGA信息尚未被完全写入到磁盘(数据文件、重做日志)。当重新打开数据库时,后台进程SMON会按照以下步骤自动执行例程恢复。
REDO:重新应用哪些被记载到重做日志,但尚未记载到数据文件中的数据。
打开数据库:既包含了被提交的数据,也包含了未被提交的数据(加锁)。
UNDO:取消未提交数据。使用UNDO段回退未提交的数据。
?
8.PMON(Process Monitor)用于监视服务器进程的执行,并且在服务器进程失败时清除该服务器进程。访问Oracle Server时,Oracle会在服务器端为用户进程分配服务器进程。假定用户进程因地址例外意外终止运行,PMON可以轮询检测该服务器进程,并执行以下操作:
回退用户的当前事务。
释放服务器进程所占用的所有表锁和行锁。
释放用户所占用的其他资源。
?
9.DBWR(Database Writer)用于将数据高速缓存的脏缓冲区数据写入到数据文件中。通过设置初始化参数db_writer_processes可以定义最多10个DBWR进程。脏缓冲区会由后台进程DBWR写入到数据文件中。如下情况DBWR开始工作。
系统发出检查点(CheckPoint)。
服务器进程不能找到空闲缓冲区。
删除或截断表。
使表空间正常脱机(alter tablespace … offline normal)。
开始表空间备份(alter tablespace … begin backup)。
?
10.LGWR(Log Writer)用于将重做日志缓冲区所记载的全部内容写入到重做日志文件中。先日志后修改。如下情况,LGWR进程开始工作:
提交事务(commit)。
每隔3秒钟。
当重做信息超过1M时。
重做日志缓冲区已有三分之一填满。
在DBWR进程将脏缓冲区写入到数据文件之前。
?
11.CKPT(Checkpoint Process)用于发出检查点(Checkpoint),检查点会同步数据库的数据文件、控制文件和重做日志。当发出检查点时,后台进程CKPT将检查点时刻的SCN(System Change Number)写入到控制文件和数据文件头部,同时促使后台进程DBWR将所有脏缓冲区写入到数据文件中。当发出检查点时,不仅后台进程CKPT和DBWR要开始工作,LGWR也要将重做日志缓冲区写入到重做日志,从而确保数据文件、控制文件和重做日志的一致性。一下情况CKPT开始工作:
日志切换。
关闭例程(shutdown abort除外)。
手工检查点操作(alter system checkpoint)。
由初始化参数fast_start_mttr_target强制发出检查点。
?
12.ARCH(Archive Process)用于将重做日志的事务变化复制到归档日志中,只有在ARCHIVELOG模式下才有意义。进行日志切换时会自动生成归档日志。设置初始化参数log_archive_max_processes最多可以定义10个归档进程。
?