第二章Oracle数据库的体系结构
学习提示
对于Oracle数据库管理员(OracleDBA)而言,本章的内容除了分布式数据库外,其他内容都要求掌握。特别要了解很多后台进程不是越多越好,内存的分配也不是越大越好。
那么对于开发者而言就比较少了,要求一定掌握数据完整性(2.5.2)、数据类型(2.5.4);另外最好也掌握传输控制协议/网际协议(TCP/IP),其他方面的内容最好也要有印象。
本人认为一个好的开发者,要占在管理员的角度去考虑一些问题,这样你设计出来的数据库系统具有很好的可管理性;反之数据库管理员最好也要有开发人员的思维模式,这样能够更快、更好的管理和优化他们开发出来的应用系统。
2.1Oracle实例
2.1.1Oracle实例的定义
在操作系统中一个应用程序在内存中的拷贝称之为一个实例,这里Oracle实例指的是一个Oracle服务器例程。Oracle数据库服务由Oracle数据库和Oracle实例构成,Oracle数据库为存储设备上的数据集,Oracle实例由一些服务进程和后台进程组成,完成对Oracle数据库中全部数据集的管理工作。将在后面详细介绍Oracle实例的内存结构、进程结构。
在不同操作系统中,对完成根据程序代码执行特定目的的任务定义有些不同,有的称为作业,有的称为任务,有的称为进程。在本书中将都用进程来说明,特别要说明的是在Windows平台中Oracle的后台进程采用多个线程来实现。一个Oracle服务在不同的平台上的结构不太相同,主要可分为Unix平台系列和Window平台系列。
2.1.2整体构造
启动一个Oracle实例后让一个指定的数据库和这个实例交结上,这个过程称为装载数据库。当数据库打开后允许通过认证的用户访问。同一计算机中允许多个实例同时存在,多个实例他们各自交结一个物理数据库。在集群系统中允许多个实例交结装载同一个数据库。
数据库管理员可以启动一个Oracle实例并装载数据库后打开,同样可以关闭一个打开的数据库。在Oracle9i以后版本中增加了只有数据库管理可以连接访问的受限制模式。
初始化参数文件可以在数据库实例启动时决定Oracle数据库系统的一些设置以及行为准则。它是一个文本文件,有经验的数据库管理员可以直接用文本编辑器直接修改它,但建议还是采用Oracle提供的企业控制台(OEM)修改。修改也通过ALTERSESSION和ALTERSYSTEM命令动态的修改。
上图显示了对Oracle例程创建、修改、删除、启动、关闭的操作,你可以在命令提示符下运行oradim.exe后,你就可以看到上面的画面。
下图我们列举创建操作示例,在命令提示符下先用SetOracle_Sid=ABC(回车)来设置Oracle_Sid的环境变量值后,在命令提示符下输入:Oradim.exe–new–sidABC–startmodem(回车),运行成功
后你就可以看到在服务列表中出现一个OracleServerABC这个服务了。(注:这些操作都必须在你正确安装Oracle9i系统后进行)
在创建Oracle例程后,这并不是一个可以服务的Oracle数据库服务系统,在后面第四章4.2.1创建一个数据库中将详细介绍。
2.1.3内存结构
在Oracle数据库系统中内存结构主要分为系统全局区(SGA)和程序全局区(PGA),SGA随着数据库实例的启动向操作系统申请分配一块内存结构,随着数据库实例的关闭释放,每一个Oracle数据库实例有且只有一个SGA。PGA随着Oracle服务进程启动的时候申请分配的一块内存结构。如果在共享服务结构中PGA存在SGA中。
下图展示Oracle的内存结构,在后面我们将用文字详细的表述各个部件。
Service Process 1PGAService Process 2PGABackground ProcessesPGASystem Global AreaJava PoolDatabase Buffer CacheShared PoolLarge PoolRedolog Buffer CacheService Process NPGAOracleProcessesPGA
系统全局区(SGA)
重要提示,提高SGA的大小可以在一定程度上提高Oracle数据库系统的性能,但你设置SGA的值如果不能锁定在内存物理页上,有些部分可能被交换到系统的交换文件中。这样你的Oracle数据库系统将变慢。
系统全局区是一组包含数据和控制信息的共享内存结构,允许Oracle服务的众多后台进程同时访问或修改其中的数据,所以有些时候也被称为“全局共享区”,参数文件中的SGA_MAX_SIZE指定SGA动态大小。
系统全局区由以下主要几个部分组成: ? 共享池Shared Pool
? 数据高速缓存Database Buffer Cache ? 重做日志缓存RedoLog Buffer Cache ? Java池(可选)Java Pool ? 大池(可选)Lager Pool 共享池
共享池存储了最近多数使用的执行SQL语句和最近使用的数据定义。它包含库高速缓存器和数据字典缓存器这两个与性能相关的内存结构。共享池的大小可以通过初始化参数文件(通常为init.ora)中的SHARED_POOL_SIZE决定。共享池是活动非常频繁的内存结构,会产生大量的内存碎片,所以你要确保它尽可能足够大。
库高速缓存器,他又包含共享SQL区和共享PL/SQL区两个组件区。为了提高SQL语句的性能,在提交SQL语句或PL/SQL程序块时Oracle服务器将先利用最近最少使用(LRU)算法检查库高速缓存中是否存在相同的SQL语句或PL/SQL程序块,若有则使用原有的分析树和执行路径。
数据字典缓存器,它收集最近使用的数据库中的数据定义信息。它包含数据文件、表、索引、列、用户、访问权限、其他数据库对象等信息。在分析阶段决定数据库对象的可访问信息。利用数据字典缓存器有效的改善了响应时间。它的大小由共享池的大小决定。
数据高速缓存
它存储数据文件中数据块的拷贝。利用这种结构使数据的更新操作性能大大的提高。数据高速缓存中的数据交换同样采用最近最少使用算法(LRU)。它的大小主要受到DB_BLOCK_SIZE决定。数据高速缓存它由DB_CACHE_SIZE、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE这些独立的子缓存器构成,同时它能动态的增长或收缩。
重做日志缓存
重做日志缓存器是个环状的缓存器,它记载所有数据的改变,主要目的用于恢复。改变后的记录内部称为重做条目,重做条目包含重构或重做信息。它的大小由初始化参数中的LOG_BUFFER决定。
重做日志缓存尺寸若太小会导致进程竞争,并引起写日志进程之间的竞争。
Java池
Java池是在安装使用Java后,才在SGA中出现的一个组件,它的大小由JAVA_POOL_SIZE初始化参数决定。Java池为执行Java命令提供分析与执行内存空间。
大池
数据库管理员可以可选配置被称为大池的内存区,它主要用于存储为共享服务器保存会话信息、I/O服务进程、Oracle备份与恢复操作、并行的消息缓存等内容。
值得一提的是大池不像其他内存组件中存在LRU列表。
程序全局区(PGA)
程序全局区用于保存每一个用户连接到数据库的信息。连接到数据库的信息主要有回话信息、排序信息和游标信息等三方面。
2.1.4进程结构
Oracle的进程主要分为用户进程、服务进程和后台进程三类。用户进程运行在应用或Oracle工具中;服务进程在一个Oracle数据库实例启动后当一个用户建立连接后创建的;后台进程则完成不同特定任务的一些进程。
Oracle的后台进程如下:
? 写数据DatabaseWriter(DBW0或DBWn); ? 写日志LogWriter(LGWR); ? 检查点Checkpoint(CKPT);
? 系统监视SystemMonitor(SMON); ? 进程监视ProcessesMonitor(PMON); ? 归档Archive(ARCn); ? 恢复Recover(RECO);
? 锁管理服务LockManagerServer(LMS)–仅在RealApplicationClusters; ? 队列监视QueueMonitor(QMNn); ? 调度Dispatcher(Dnnn); ? 服务Server(Snnn);
下图为各后台进程之间的逻辑关系图,在图的后面将用文字说明这些进程的目的。
LMSRECOPMONSMONLMS-Lock Manager ServerRECO-RecoverPMON-Processes MonitorSMON-System MonitorDBWn-Database WriterLGWR-Log WriterARCn-ArchiveCKPT-CheckpointSystem Global AreaDatabase Buffer CacheRedolog Buffer CacheUserProcessesShared Server ModeDedicated Server ModeDBWnLGWRRedologsARCnDispatcherUserProcessesContrilFilesArchiveLogsCKPTDatafiles
写数据(DBWn)
数据写进程负责将重写块(dirtyblock)从数据高速缓存中写到磁盘上的数据文件里。为了使数据库的性能受I/O限制降到最低,DBWn不是每一个块修改时立即写到磁盘上,而是等到符合一定条件后读取高速缓存中的重写块列表,并将其指定的块成批地写到数据文件中。
数据写进程活动的条件如下:
? 服务进程无法发现可用缓存 ? 检查点出现 ? 重写块到达极限 ? 超时
? ARC发出需求 ? 表空间脱机 ? 表空间只读 ? 表丢弃或表截断 ? 表空间开始备份
虽然一个数据库写进程(DBW0)对大多数系统是足够的,但是如果你的系统修改数据量很大要提高些性能你可以配置更多的写进程(DBW1到DBW9和DBWa到DBWj)。这些增加的DBWn进程无法在单处理系统中使用。
初始化参数DB_WRITER_PROCESSES指定了DBWn进程的序号,此参数最大允许值为20。
写日志(LGWR)
写日志进程是负责管理重做日志缓存的——将重做日志从缓存区写到磁盘重做日至文件中。LGWR写从上次写后开始到最后复制到缓存中的所有重做条目。
要记住Oracle数据库系统直到LGWR将重做信息从缓存器中写到在线重做日志才认为事务完成并发送成功代码。LGWR进程对数据库性能的影响不大。
写日志在下列条件中活动: ? 在COMMIT;
? 缓存器使用达到三分之一时 ? 缓存器使用达到1M时
Oracle数据库的体系结构
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)