Oracle 体系结构

Oracle 数据库体系结构基础
1、Oracle 数据库系统:为具有管理Oracle数据库功能的计算机系统。
2、系统全局区(System Global Area):在数据库服务器上启动一数据库时的一块共享内存区(简称SGA)。它被看作是Oracle数据库的一个大缓冲池,这里的数据可以被Oracle的各个进程共用。
3、实例(Instance):SGA和Oracle进程的结合称为一个Oracle实例。一个Oracle实例(Instance)只能与一个运行的Oracle数据库相联系。

1.1 Oracle存储器结构
Oracle使用共享内存区和后台进程来管理其内存和文件结构。
1.1.1 系统全局区(SGA)
一、系统全局区的大小可以通过如下语句查询:
SQL> SELECT * FROM V$SGA;
NAME VALUE
-------------------- ----------
Fixed Size 453492
Variable Size 109051904
Database Buffers 25165824
Redo Buffers 667648
更详细的信息可以参考V$SGASTAT、V$BUFFER_POOL

二、系统全局区主要包括以下几部分:
1、数据块缓存区
内 存中用来存储频繁访问的数据的区域。数据库的任何修改都在该缓冲里完成,并由DBWR进程将修改后的数据写入磁盘。数据块缓存区的大小由数据库服务器 init.ora文件中的DB_BLOCK_BUFFERS参数决定(用数据块的个数表示)。通常,数据块缓存区只是数据库大小的1%-2 %,Oracle使用最近最少使用(LRU,Least Recently Used)算法来管理可用空间。块缓冲区高速缓存又可以细分为以下三个部分(Default pool、Keep pool、Recycle pool)。如果不是人为设置初始化参数(init.ora),ORACLE将默认为Default pool。
由于操作系统寻址能力的限制,不通过特殊设置,在32位的系统上,块缓冲区高速缓存最大可以达到1.7G,在64位系统上,块缓冲区高速缓存最大可以达到10G。
2、数据字典缓存区
数据库表和视图的集合,包含关于数据库、数据库结构、权限和用户的元数据。字典缓存区的大小由数据库内部管理。字典缓存区是SQL共享池的一部分,共享池的大小由数据库文件init.ora中的SHARED_POOL_SIZE参数来设置。
3、重做日志缓冲区
重 做日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句,如 (Insert,Update,Delete),或DDL语句,如(Create,Alter,Drop等)。重做日志缓冲区的大小(以字节为单位)由 init.ora文件中的LOG_BUFFER参数决定。
重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作 日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小, 大于3M之后的重作日志缓冲区已经没有太大的实际意义。
4、SQL共享池
共享SQL区保留了数据库用户执行的SQL语句的解释版本 和这些语句的执行计划。目的是那些语句被再次使用时提高进程的速度。如果SQL共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操纵性能。 SQL共享池的大小由init.ora文件的参数SHARED_POOL_SIZE决定。共享池有可分为以下两部分:
1、SQL语句缓冲(Library Cache):主要对SQL语句的解析(Parse)产生执行计划。
2、数据字典缓冲区(Data Dictionary Cache)
5、大池
大 池是SGA中的可选内存区,对于诸如Oracle备份和恢复等大型命令的SQL语句,利用大池就可以防止这些SQL大型命令把条目重写入SQL共享池中, 从而减少再装入到库缓存区中的语句数量,防止与其它应用程序对库缓存去的争用。大池没有LRU清单。Oracle9i已不用这个参数。作为 LargePool的一种选择的方案,可以用init.ora文件的SHARED_POOL_RESERVED_SIZE参数为SQL大型语句保留一部分 SQL共享池。
6、Java池
为Java命令提供语法分析。Java池的大小通过init.ora文件的JAVA_POOL_SIZE参数设置,默认为10M。
7、多缓冲池
可 以在SGA中创建多个缓冲池,能够用多个缓冲池把大数据集与其它的应用程序分开,以减少它们争夺数据块缓存区内相同资源的可能性。创建缓冲池时,需要规定 保存区(keeparea)的大小和再循环区(recyclearea)的大小。可以通过BUFFER_POOL_KEEP参数来规定保存区的大小。保存 和再循环缓冲池的容量减少了数据块缓冲区的可用空间(通过DB_BLOCK_BUFFERS参数设置)。
1.1.2 程序全局区(PGA)
是内存中的一个区域,该区保存一个进程的数据和进程信息,该区域不是共享的。SORT_AREA_SIZE(排序区的最大尺寸)和SORT_AREA_RETAINED_SIZE(排序操作完成之后排序区被减少后的尺寸)参数对于PGA的大小由重要影响。
在 大型企业环境管理中管理SORT_AREA_SIZE可能具有挑战性。原则是使性能最佳而尽量少用系统资源。Oracle9i提供自动方法管理PGA内 存。两个用于自动管理PGA内存的主要初始化参数是PGA_AGGREGATE_TARGET(指定可由所有服务器进程使用的内存总量)和 WORKAREA_SIZE_POLICY(值是MANUAL或AUTO)。

1.2后台进程
后台进程是维护数据库的物理结构和存储结构之间的关系。可以设置init.ora文件的BACKGROUND_DUMP_DEST参数来规定后台进程跟踪文件的位置。在排除数据故障时,跟踪文件显得非常重要,主要纪录数据库的警告日志。
这里给出每一个进程功能的简介:
1、数据库书写器进程Database Writer(DBWR)
负责将修改过的数据块写回到数据库文件。多个DBWR进程有助于在进行大的操作期间减少DBWR中的冲突,DBWR进程的数量由数据库的init.ora文件中的DB_WRITER_PROCESSES参数决定。
2、日志书写器进程Log Writer(LGWR)
负 责将联机redo日志缓冲区的内容分批写到联机redo日志文件。重做日志缓冲区条目总是包含着数据库的最新状态,这是因为DBWR进程可以一直等待到把 数据块缓冲区中的修改数据块写入到数据文件中。对于Oracle9i,可以创建多个LGWR/IO从进程以改善向联机重做日志文件写入性能,其个数由数据 库的init.ora文件的LGWR_IO_SLAVES参数决定。
3、归档进程Archive(ARCH)
负责把写满的redo文件复制到归档日志目标中。Oracle最多允许有10个归档进程。LOG_ARCHIVE_MAX_PROCESSES参数用来设置允许的最大数。
4、检查点进程Checkpoint(CKPT)
用来减少执行实例恢复所需的时间。可以用数据库实例的init.ora文件中LOG_CHECKPIOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的参数来设置一个频繁出现的检查点。
5、系统监视器进程System Monitor(SMON)
执行崩溃恢复、清除临时段和组合自由空间。
6、进程监视器Process Monitor(PMON)
负责清除失败用户的进程,释放用户当时正在使用的资源。当进程失败时,PMON执行以下操作:
1.释放任何进程包括的锁;
2.回滚那些已经启动但未提交的事务;
3.从活动进程的列表中删除进程ID。
7、恢复进程Recover(RECO)
用于解决分布式数据库中的故障问题。只有在平台支持Distributed Option(分布式选项)且init.ora文件中的DISTRIBUTED_TRANSACTIONS参数大于零时才创建这个进程。
8、作业队列进程Snapshot(SNP0)
Oracle的快照刷新及内容及内部作业对列调度依赖于他们执行的作业队列进程。为一实例所创建的SNP进程个数由数据库的init.ora文件中的JOB_QUEUE_PROCESSES参数决定,最多为36个。
9、作业监视器进程Queue Monitor(QMNO)
和Oracle的优先队列选项一起使用。最多可以有10个队列监视器进程,并且它们使用AQ_TM_PROCESSED初始化参数配置。

1.3 Oracle物理存储结构
数据库相关的文件有:重做日志文件、控制文件、跟踪文件及警告日志。
1.3.1数据字典的内容及用法
数 据字典是DBA在执行Create Database命令之后应建立的第二组数据库对象。使用Oracle数据字典,可以对数据库中的每个对象以某种方式进行跟踪。Oracle通常利用 catalog.sql和catproc.sql脚本建立数据字典,而不需要DBA干预。如果手工建立数据库,则要确保在建立数据库不久后就运行这些脚 本。
1、 构造数据字典视图
catalog.sql是用来建立组成数据字典的各个对象。Catporc.sql为PL/SQL建立过程选项和实用程序。必须以sys as sysdba用户才能运行这些脚本。
2、 主要的数据字典
Oracle数据字典主要由两部分组成—基表和用户可访问的视图。
3、 识别数据字典视图的范围
i. USER:允许你看到你所拥有的相关数据库对象。
ii. ALL:允许你看到你可以访问的相关数据库对象。
iii. DBA:允许你看到整个数据库中所有的相关对象。
4、 动态性能视图
V$DATABASE 存放数据库的常规信息
V$SYSSTAT 存放数据库性能的大部分信息
V$SESSION 存放用户会话信息
V$LOG、V$LOGFILE 存放联机重做日志信息
V$DATAFILE 存放数据文件信息
V$CONTROLFILE 存放数据库控制文件信息
1.3.2控制文件
控 制文件是数据库启动可操作成功必需的一种二进制文件,它通常记录数据库的所有物理组件,如数据文件的位置、重做日志、数据库名等数据库信息。通过 CONTORL_FILES参数设置控制文件名。通过V$CONTROLFILE、V$CONTROLFILE_RECORD_SECTION视图得到控 制文件的各部分信息。
1.3.3数据文件
表空间是数据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。每个 表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间,而一个表空间可以跨越多个数据文 件。数据库文件列表可以查询V$DATAFILE和DBA_DATA_FILE的视图。
1.3.4日志文件
日志文件有时也叫做 redo日志文件,是任何数据库的重要组成部分。它们的存在确保在系统崩溃、驱动错误或任何其它意外情况中断了正常操作的事件发生时数据库能够恢复。有两 种redo日志文件:联机redo日志文件和归档redo日志文件。数据库先写日志,然后提交数据。可以通过V$LOGFILE视图查看日志文件信息。通 过ARCHIVE LOG LIST命令查看归档日志文件信息。

 

 

 

 

——————————————————邪恶的分割线——————————————————————————

 

 

ystemGlobalArea(SGA)管理

 

SGA 的基本概念

  当启动 Oracle 数据库时,系统会先在内存内规划一个固定区域,用来储存用户需要的数据,以及 Oracle 运行时必备的系统信息。我们称此区域为系统全局区 (System Global Area) ,简称 SGA

   SGA 包含数个重要区域,分别是:

  ■ Database Buffer Cache ( 数据库缓冲区 )

  ■ Redo Log Buffer ( 重做日志缓冲区 )

  ■ Shared Pool ( 共享区 )

  ■ 其它,如 Java pool Large pool

  2.1 Database Buffer Cache ( 数据库缓冲区 )
  数据库缓冲区的作用主要是在内存中缓存从数据库中读取的数据块。数据库缓冲区越大,为用户已经在内存里的共享数据提供的内存就越大,这样可以减少所需要的磁盘物理读。
  在 9i 以前数据库缓冲区的大小是由 db_block_buffers*db_block_size 来决定大小的。 db_block_size 参数是在创建数据库时设置的, OLTP 系统的 db_block_size 一般设置为 8k
  在 9i 中,数据库缓冲区的大小由 db_cache_size 决定, 8i 中的 db_block_buffers 被取消。 db_cache_size 的单位是字节,它直接决定了数据库缓冲区的大小,而不再是块的数量。
   2.2 Shared Pool ( 共享区 )
  共享区由三部分组成,分别是 Dictionary cache( 包括数据字典的定义,如表结构、权限等 )Library cache( 包括共享的 sql 游标, sql 原代码以及执行计划、存储过程和会话信息 )Control structure 。它的大小由初始化参数 shared_pool_size 控制,它的作用是缓存已经被解析过的 SQL ,使其能被重用,不用再解析。 SQL 的解析非常消耗 CPU 的资源,如果一条 SQLShared pool 中已经存在,则进行的仅是软解析 (Shared pool 中寻找相同 SQL) ,这将大大提高数据库的运行效率。当然,这部分内存也并非越大越好,太大的 Shared pooloracle 为了维护共享结构,将付出更大的管理开销。建议在 150M-500M 之间。如果系统内存为 1G ,该值可设为 150M-200M; 如果为 2G ,该值设为 250M-300M; 每增加 1G 内存,该值增加 100M; 但该值最大不应超过 500M
   2.3 Redo Log Buffer ( 重做日志缓冲区 )
   Log_buffer 是重做日志缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由 LGWR 进程将它写入磁盘。 LGWR 的写入条件是:用户提交、有 1/3 重做日志缓冲区未被写入磁盘、有大于 1M 重做日志缓冲区未被写入磁盘、超时、 DBWR 需要写入的数据的 SCN 号大于 LGWR 记录的 SCN 号, DBWR 触发 LGWR 写入。
  从中可以看出,大于 1Mlog buffer 值意义并不大。重做日志缓冲区的大小由初始化参数 log_buffer 设定。
   2.4 Large poolJava pool
   Large pool :用于 MTS 、并行查询和 RMAN 。如果使用了 MTSRMANlarge_pool 特别有用,它可以降低用户对 share pool 的争用。
  如果应用系统不使用 MTS ,也不使用 RMANlarge_pool_size 的大小可设为 1M
   Java poolOracle8I 以后, oracle 数据库内置了对 java 的支持,如果数据库安装时选择了 JServer 组件,则这个值可以设置为 20M-30M 之间。可以查询 v$option 动态视图,如果 java 那一项值为 true ,则表示安装了 JServer ,为 false ,表示未安装。
  如果应用系统不使用 PORTALAPPS ,也不使用 RMANJava pool 值的大小可设为 1M 。如果系统需要安装补丁,建议先把 Java pool 值的大小临时增加到 50-150M
   3 SGA 运行情况检查
   3.1 SGA 整体检查
  对于 SGA 部分,我们通过 sqlplus 查询:
  SQL> show sga  

   Total System Global Area 316899848 bytes
   Fixed Size 741896 bytes
   Variable Size 150994944 bytes
   Database Buffers 163840000 bytes
   Redo Buffers 1323008 bytes


  或者
   SQL> select * from v$sga;  
   NAME VALUE
   -------------------- ----------
   Fixed Size 741896
   Variable Size 150994944
   Database Buffers 163840000
   Redo Buffers 1323008
   Show sga 的结果和 SGA 的初始化参数配置并不是完全一一对应的,下面是每一个部分的具体解释:
   Fixed Size
   oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了 SGA 各部分组件的信息,可以看作引导建立 SGA 的区域。
   Variable Size
  包含了 shared_pool_sizejava_pool_sizelarge_pool_size 等内存设置和用于管理数据缓冲区等内存结构的 hash table 、块头信息等。
   Database Buffers
  指数据缓冲区,在 8i 中包含 default poolbuffer_pool_keepbuffer_pool_recycle 三部分内存。在 9i 中包含 db_cache_sizedb_keep_cache_sizedb_recycle_cache_sizedb_nk_cache_size 。这里要注意在 8i 中三部分内存总和为 db_block_buffers*db_block_size
   Redo Buffers
  指重做日志缓冲区的实际大小,和& < src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"> < src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"> lt;/span> log_buffer 的值可能稍有不同。
   3.2 Data buffer 命中率检查
  检查语句:
   SQL>select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"  
   from v$sysstat cur v$sysstat con v$sysstat phy where cur.name = ’db block gets’
   and con.name = ’consistent gets’
   and phy.name = ’physical reads’;
  调整原则:
  命中率不应该低于 90%.
  如果该值过低,应该调高初始化参数。 8i 调整 db_block_buffer9i 调整 db_cache_size
   3.3 Dictionary cache 命中率检查
  检查语句:
   SQL>SELECT 1 - (SUM(getmisses)/SUM(gets)) "Data Dictionary Hit Ratio" FROM v$rowcache;
  调整原则:
  命中率不应该低于 95%.
  如果该值过低,应调高 shared_pool_size 的大小。
   3.4 Library cache 命中率检查
  检查语句:
   SQL>SELECT 1-(SUM(reloads)/SUM(pins)) "Library cache Hit Ratio" FROM v$librarycache;
  调整原则:
  命中率不应该低于 99%.
  如果该值过低,应调高 shared_pool_size 的大小。
   3.5 Log buffer 命中率检查
  检查语句:
   SQL>select (req.value*5000)/entries.value "Ratio"  
   from v$sysstat req v$sysstat entries
   where req.name = ’redo log space requests’
   and entries.name = ’redo entries’;
  调整原则:
  命中率不应该高于 1.
  如果该值过高,应调高 log_buffer 的大小。
   4 SGA 的参数设置原则
  在 Oracle8i 时, SGA 的大小是由初始化参数文件内的某些参数所设定,最麻烦的是每次调整参数之后必须等重新激活数据库才生效。从 Oracle9i 开始, DBA 可以动态配置内存的大小 ; 这样的技术我们称为「 dynamicSGA 」。有了 dynamic SGA SGA 的各组成区域都可以动态地进行规划与调整,而不需先关闭数据库。
  在 Oracle9i 中, SGA_MAX_SIZE 可设定 SGA 所占用的最大内存空间。需要注意的是: SGA_MAX_SIZE 尽量不要超过物理内存大小,否则将会使用到硬盘上的虚拟内存,反而导致性能低下。如果 SGA_MAX_SIZE 之设定值小于其它 SGA 相关参数设定值的总和,或是小于各相关参数默认值的总和,则 SGA_MAX_SIZE 之设定值无效。
  在 SGA 的基本概念部分,已经介绍了各个部分大小设置的原则,这里再用一句话来总结:
   1) 数据库缓冲区建议占物理内存的 20%-30% 。物理内存在 1G 以内,可以占 20%1G-2G 之间可占 25% ,物理内存在 2G 以上,可以占 30% ,甚至更高。
   2) 共享区建议在 150M-500M 之间。如果系统内存为 1G ,该值可设为 150M-200M; 如果为 2G ,该值设为 250M-300M; 每增加 1G 内存,该值增加 100M; 但该值最大不应超过 500M
   3) 重做日志缓冲区建议设为 1M
   4) 如果应用系统不使用 MTS ,也不使用 RMANLarge pool 的大小可设为 1M 。否则设为 16M
   5) 如果应用系统不使用 RMANJava pool 值的大小可设为 1M 。否则设为 50M 。如果系统需要安装补丁,建议先把 Java pool 值的大小临时增加到 50-150M
  调整完上述参数后,一定要计算 SGA 的尺寸,总原则是 SGA 的尺寸应小于物理内存的一半。 SGA 的计算方法如下: SGA=DB_BLOCK_BUFFERS*DB_BLOCK_SIZE+SHARED_POOL_SIZE+LOG_BUFFER 。同时还要保证 (SGA+sort_area_size*sesson 数量 ) 不大于物理内存的 70%

 

 

 

————————————————————邪恶分割线————————————————————————

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值