Oracle
Allen 2009-11-21 16:44:46 47114 1 0 0 0

谈谈Oracle10g 管理系统全局区(SGA)
---
作者:Mike.Xu 发表于: February 9, 2009 5:13 PM
链接:http://www.dbasky.net/archives/2009/02/oracle10g-sga.html
---
  有几个影响SGA内存分配数量的参数,除了SGA_MAX_SIZE ,其他都是动态参数,也就是说在数据库运行期间可以使用ALTER SYSTEM 语句动态修改的参数.SGA的大小是动态的,通过修改这些参数可以是SGA增长或收缩.
  SGA组件和SGA内存颗粒
  由许多内存组件组成,他们是用于满足特定内存分配请求的内存池.例如共享池(用于缓冲磁盘数据块),所有的SAG以一个最小的内存单元颗粒分配和回收内存空间,Oracle在系统内部追踪SAG的内存单元的分配和使用情况.

  SGA的内存分配是通过颗粒进行分配的,颗粒大小由SGA的大小决定.一般来将,在大多数平台,如果SGA小于等于1G,那么颗粒大小为4MB,如果大于
  1G,颗粒的大小为16MB,不同的是在32位Windows平台下,SGA大于1G时,颗粒大小位8MB而非16MB,详细信息,查看操作系统文档.
  可以通过V$SGAINFO 系统试图查看由某个实例使用的颗粒大小.同样的大小用于所有SGA的动态组件.

  如果指定的SGA组件的大小不是颗粒大小的整数倍,那么Oracle将会四舍五入求整而得到其整数倍值,赋给SGA内存组件.而不是你所指定的大小.例如
  如果颗粒大小为4MB,你给 DB_CACHE_SIZE 参数设定为10MB,那么实际分配的内存将会是12MB.
  限制SGA的大小

  SGA_MAX_SIZE 参数指定SGA在实例的生命期内的最大数.动态修改这些参数影响的Buffer cache,shared
  pool,large pool,java pool,和streams pool的大小,和SGA的总大小.但是不能超过SGA_MAX_SIZE
  参数所设定的值.
  如果没有指定,那么默认把所有初始化参数中指定的内存组件的和作为期缺省值.
  使用自动共享内存管理

  通过使用SGA_TARGET参数来启用自动共享内存管理.以前手动分配的类似java_pool,large_pool这样的共享内存组件将被自动管
  理,另外,你必须确保STATISTICS_LEVEL初始化参数设置为TYPICAL(默认值)或ALL.
  SGA_TARGET初始化参数反映了SGA的大小.
  表2-3 自动分配大小的SGA组件和相应的参数
  SGA 组件                                                                             初始化参数
  固定的SGA和其他Oracle数据库实例需要的内部分配  不可用
  共享池                                                                                  SHARED_POOL_SIZE
  大型池                                                                                  LARGE_POOL_SIZE
  Java池                                                                                 JAVA_POOL_SIZE
  缓冲区高数缓存                                                                 DB_CACHE_SIZE
  表2-4 手动分配大小的使用SGA_TARGET空间的SGA组件
  SGA 组件                                                 初始化参数
  日志缓冲区                                              LOG_BUFFER
  The keep and recycle buffer caches DB_KEEP_CACHE_SIZE
  DB_RECYCLE_CACHE_SIZE

  非标准缓冲区高数缓存块大小             DB_nK_CACHE_SIZE
  流池                                                         STREAMS_POOL_SIZE

  在手动管理模式下执行如下SQL查询得到SGA_TARGET的值.
  SELECT (
  (SELECT SUM(value) FROM V$SGA) -
  (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)
  ) "SGA_TARGET"
  FROM DUAL;
  然后你可以删除由Oracle自动管理的共享内存相应的初始化参数.
  例如,当前你在手动管理模式下由如下配置,并且SGA_MAX_SIZE 设置为 1200M:
  SHARED_POOL_SIZE = 200M
  DB_CACHE_SIZE = 500M
  LARGE_POOL_SIZE=200M
  对其动态性能视图的查询结果如下
  SHARED_POOL_SIZE = 200M
  DB_CACHE_SIZE = 500M
  LARGE_POOL_SIZE=200M
  对其相应的动态性能视图查询结果如下:
  SELECT SUM(value) FROM V$SGA = 1200M
  SELECT CURRENT_VALUE FROM V$SGA_DYNAMIC_FREE_MEMORY = 208M
  你可以替换手动分配大小的参数 ( SHARED_POOL_SIZE, DB_CACHE_SIZE, LARGE_POOL_SIZE ) 来发挥自动共享内存管理的优点.
  SGA_TARGET=992M
  992M 是1200M 减去208M得到的.
  By
  default, when you set a value for SGA_TARGET, the value of the
  parameters corresponding to all the automatically sized SGA components
  is set to zero. However, you can still exercise some control over the
  size of the automatically sized components by specifying minimum values
  for the parameters corresponding to these components. Doing so can be
  useful if you know that an application cannot function properly without
  a minimum amount of memory in specific components. You specify the
  minimum amount of SGA space for a component by setting a value for its
  corresponding 初始化参数. Here is an example configuration:
  SGA_TARGET = 256M
  SHARED_POOL_SIZE = 32M
  DB_CACHE_SIZE = 100M
  In
  this example, the shared pool and the default buffer pool will not be
  sized smaller than the specified values (32 M and 100M, respectively).
  The remaining 124M (256 minus 132) is available for use by all the
  manually and automatically sized components.
  The actual distribution of values among the SGA components might look like this:
  Actual shared pool size = 64M
  Actual buffer cache size = 128M
  Actual Java pool size = 60M
  Actual large pool size = 4M
  此参数值决定了SGA的最小分配空间.V$SGA_DYNAMIC_COMPONENTS 显示当前SGA组件的实际大小.你还可以用企业管理器内存配置页查看当前SGA组件的实际值.
  SGA参数的动态修改
  你可以用ALTER SYSTEM SQL 语句动态修改SGA_TARGET参数和控制SGA内存组件的其他参数的值.在下面的段落种有描述
  SGA_TARGET初始化参数的动态修改

  SGA_TARGET参数值可以增加到SGA_MAX_SIZE
  参数所指定的值,也可以减少,如果减少SGA_TARGET的值,系统将调整共享内存的大小,并且释放内存.你可以减少SGA_TARGET的大小直到达
  到SGA内存组件的最小值为止.Oracle Database determines the minimum allowable value
  for SGA_TARGET taking into account several factors, including values
  set for the automatically sized components, manually sized components
  that use SGA_TARGET space, and number of CPUs.

  当SGA_TARGET被修改时,消耗的物理内存取决于操作系统.在有些UNIX平台上不支持动态共享内存.由SGA使用的物理内存的大小等于
  SGA_MAX_SIZE
  参数设置的值.在这样的平台上设置SGA_TARGET参数小于SGA_MAX_SIZE参数的值没有实际的好处.在这些平台上不推荐设置
  SGA_MAX_SIZE参数.
  在其他平台上,比如Solaris和Windows消耗的物理内存等于SGA_TARGET参数设置的值.
  当SGA_TARGET参数调整大小时,受影响的仅仅时那些被自动管理的SGA内存组件,并且在初始化参数中没有为其设置最小值.手动管理的SGA内存组件不受影响.
  例如,假设你的环境由如下配置:    
  SGA_MAX_SIZE = 1024M
  SGA_TARGET = 512M
  DB_8K_CACHE_SIZE = 128M

  在这个例子中, SGA_TARGET 可以动态的调整的1024M,也可以减小到Buffer Cache,Java Pool,Shared
  Pool,Large
  Pool中的一个或多个SGA内存组件减小到最小值.精确的值取决于环境因素,比如CPU数,但是DB_8K_CACHE_SIZE
  的值会一直保持128M大小.
  当SGA_TARGE减小时, 如果自动管理的SGA内存组件已经设置了最小值,那么这些组件将不会再减小了.看看下面的参数.

  SGA_MAX_SIZE = 1024M
  SGA_TARGET = 512M
  DB_CACHE_SIZE = 96M
  DB_8K_CACHE_SIZE = 128M

  再在这个例子中,如果SGA_TARGET减小,DB_8K_CACHE_SIZE 始终固定在128M大小,另外DB_CACHE_SIZE 不会小于96M大小.所以SGA_TARGET能减小的数量是有限的.
  对自动管理组件修改参数

  如果没有设置SGA_TARGET初始化参数,那么自动SGA管理的功能是被禁用了的.因此,其初始化参数的含义与早期的版本相同.但是,当启用自动共享
  内存管理功能时,给被自动管理的SGA组件设置值,那么这个值被任务是该参数的下限.可以动态修改相应的参数值.
  修改手动调整大小的参数
  手动调整大小的参数也可以动态的修改.但不是指定的最小值,而是精确值.
  手工共享内存管理
  数如果你决定不使用自动共享内存管理,那么你必须手动配置SGA的每个组件.这节提供了关于设置那些控制每个SGA组件大小的初始化参数.
  设置缓冲区高速缓存初始化参数

  缓冲区高速缓初始化参数决定了缓冲区高速缓SGA内存组件的大小.你可以用他们来指定不同数据库块大小的缓存数.是动态初始化参数.如果你打算在数据库中
  使用多种块大小,你必须设置DB_CACHE_SIZE初始化参数和至少一个DB_nK_CACHE_SIZE初始化参数.Oracle数据库分配一个合
  适的默认值给B_CACHE_SIZE参数,但是DB_nK_CACHE_SIZE的默认值为0,并且没有额外的高速缓存被分配.缓冲区的大小影响性能.
  更大的缓存大小将减少对磁盘的读写数,需要更多的内存,减少内存分页和交换.
  DB_CACHE_SIZE 初始化参数

  DB_CACHE_SIZE 初始化参数取代了DB_BLOCK_BUFFERS 初始化参数,DB_BLOCK_BUFFERS使用于早期的版本中.
  DB_CACHE_SIZE 参数以字节单位指定标准块大小的缓冲区高速缓存的大小.因此,给 DB_CACHE_SIZE指定一个值, you
  would determine the number of buffers that you need and multiple that
  value times the block size specified in DB_BLOCK_SIZE.
  为了兼容早期版本的数据库, DB_BLOCK_BUFFERS 参数仍然可以使用,但是它保留一个静态的参数,并且不能与其他动态大小调整的参数组合使用
  DB_nK_CACHE_SIZE 初始化参数
  非标准块的缓冲区块大小和数量由如下的初始化参数指定:
  DB_2K_CACHE_SIZE
  DB_4K_CACHE_SIZE
  DB_8K_CACHE_SIZE
  DB_16K_CACHE_SIZE
  DB_32K_CACHE_SIZE
  每个参数给相应的块大小指定缓冲区高速缓存的大小.例如:
  DB_BLOCK_SIZE=4096
  DB_CACHE_SIZE=12M
  DB_2K_CACHE_SIZE=8M
  DB_8K_CACHE_SIZE=4M
  在这个例子中,指定标准数据库块大小的参数值是4K.标准块大小的缓冲区高速缓存的大小为12M.
  另外,2K和8K的高速缓存大小分别配置为8M和4M.
  注意:
  不能使用DB_nK_CACHE_SIZE 参数来调整标准块的大小.例如,如果DB_BLOCK_SIZE设置为2K,
  设置DB_2K_CACHE_SIZE. 等于2K是无效的.标准缓存的块大小总是由DB_CACHE_SIZE决定的. 
  指定共享池大小
  SHARED_POOL_SIZE 初始化参数是一个动态参数使你能够指定或调整SGA组件的共享池大小.
  Oracle 数据库选择一个合适的默认值. 共享池的配置在<<Oracle Database Performance Tuning Guide>>中讨论.
  指定大型池大小
  LARGE_POOL_SIZE 初始化参数是一个动态参数使你能够指定或调整SGA组件的大型池大小.
  大型池是一个可选的SGA组件.如果你想创建大型池,你必须指定LARGE_POOL_SIZE 初始化参数.
  配置大型池的讨论在<<Oracle Database Performance Tuning Guide>>中.
  指定Java池大小
  JAVA_POOL_SIZE 初始化参数是一个动态参数使你能够指定或调整SGA组件的Java池大小.
  Oracle 数据库选择一个合适的默认值. Java池的配置在<<Oracle Database Java Developer^s Guide>>中讨论了.
  指定流池大小
  STREAMS_POOL_SIZE 初始化参数是一个动态参数使你能够指定或调整SGA组件的流池的大小.
  如果STREAMS_POOL_SIZE被设置为0,那么Oracle流产品 将使用共享池来满足SGA内存的需求.
  流池的配置在<<Oracle Streams Concepts and Administration>>中讨论了.
  查看关于SGA的信息
  下面的视图提供了关于SGA组件和他们的动态大小的信息:
  视图                                          描述
  V$SGA                                    显示关于SGA的摘要信息.
  V$SGAINFO                              显示关于SGA的大小信息,包括不同SGA组件的大小信息,内存颗粒大小,和自由内存空间.
  V$SGASTAT                             显示SGA的详细信息.
  V$SGA_DYNAMIC_COMPONENTS  显示SGA组件的信息.此视图摘要了从实例启动以来所有SGA大小调整操作信息.
  V$SGA_DYNAMIC_FREE_MEMORY 显示为将来调整SGA大小可用的自由内存空间.
  V$SGA_RESIZE_OPS Displays      关于最近400条碗橱大额SGA大小调整操作的信息.
  V$SGA_CURRENT_RESIZE_OPS    显示当前进行中的关于SGA大小调整的操作信息.一个调整操作是SGA组件的动态增大或减小.

===

Oracle 10g系统管理:自动SGA内存管理
2009-11-5 19:49:00查看学习心得
在Oracle 10g系统管理中,有一个自动SGA内存管理(ASMM)。下面介绍一下这个功能:
要使用自动管理,需要设置参数SGA_TARGET、STATISTICS_LEVEL(=TYPICAL或ALL,因为不支持统计集合,数据库就没有必要的历史信息来确定大小)。在Oracle9i及以前版本中,只能用手动SGA内存管理,不存在参数SGA_TARGET,而且参数 SGA_MAX_SIZE只是一个上限,而不是动态目标,但10G中时SGA_TARGET设置不能超过它。
在Oracle 10g中,与内存相关的参数可以归为两类:
◆自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE。
◆手动SGA参数:这些参数包括LOG_BUFFER、STREAMS_POOL、DB_NK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
在Oracle 10g中,任何时候你都能查询V$SGAINFO,来查看SGA的哪些组件的大小可以调整。(Oracle 10g系统管理相比之前的版本是大大增强了)
采用自动SGA内存管理时,确定自动调整组件大小的主要参数是SGA_TARGET,这个参数可以在数据库启动并运行时动态调整,最大可以达到SGA_MAX_SIZE参数设置的值(默认等于SGA_TARGET,所以如果想增加SGA_TARGET,就必须在启动数据库实例之前先把SGA_MAX_SIZE设置得大一些)。数据库会使用SGA_TARGET值,再减去其他手动设置组件的大小(如DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE等),并使用计算得到的内存量来设置默认缓冲区池、共享池、大池和Java池的大小。在运行时,实例会根据需要动态地对这4个内存区分配和撤销内存。
随着时间的推移,当实例的内存需求越来越确定时,各个SGA组件的大小也越来越固定。即便数据库关闭后又启动,数据库还能记得组件的大小,因此不必每次都从头再来确定实例的正确大小。这是通过4个带双下划线的参数做到的:__DB_CACHE_SIZE、__JAVA_POOL_SIZE、__LARGE_POOL_SIZE和__SHARED_POOL_SIZE。如果正常或立即关闭数据库,则数据库会把这些值记录到存储参数文件(SPFILE)中,并在启动时再使用这些值来设置各个区的默认大小。
另外,如果知道4个区中某个区的最小值,那么除了设置SGA_TARGET外,还可以设置这个参数。实例会使用你的设置作为下界(即这个区可能的最小大小),但是重要的一点要记住,这样Oracle就不能缩小相应区的大小到设定的最小值以下了。
以上就对Oracle 10g系统管理中的自动SGA内存管理功能进行了简单的介绍。
===
深入讲解调整Oracle SGA大小的解决方法
2008-04-07 22:08 作者:Richard 来源:赛迪网
[摘要] 深入讲解调整Oracle SGA大小的解决方法,在修改数据缓冲区的时候,出现错误提示的原因及解决方法。 [关键字] Oracle SGA 调整
  在修改数据缓冲区的时候,提示错误如下:
  SQL> alter system set db_cache_size=25165824 scope=both;
  alter system set db_cache_size=25165824 scope=both
  *
  ERROR at line 1:
  ORA-02097: parameter cannot be modified because specified value is invalid
  ORA-00384: Insufficient memory to grow cache
  SQL>
  出现这种错误的具体原因:
  SGA(sga_max_size)是由共享池(shared_pool_size),缓冲区高速缓存(db_cache_size 9i以上版本),大型池(large_pool_size),java池(java_pool_size)组成的,在我们安装的时候这些已经分配了一定的值,由于需求需要对其进行调整。
  现在sga的值是一定的,sga通常是大于等于以上几项的值之和。
  假如正好sga等于各项之和,那么调大其中任何一项都会出错,调小是不成问题的。
  在此情况下也就出现了以上的错误:
  下面我们以db_cache_size为例:
  解决方法如下:
  1、调小其它项的值,一般情况下我们不会采用这种方法,随着业务的增大对内存的需求越来越高,估计其它项也没有调小的余地
  2、调大sga此时数据库需要是在关闭状态,由于sga不是动态参数,所以我们需要修改init$ORACLE_SID.ORA的中sga的大小
  (1)首先创建参数文件,这是为了保持和服务器参数文件一致SQL>create pfile from spfile;
  (2)修改init$ORACLE_SID.ORA中对应的sga_max_size大小
  (3)创建服务器参数文件SQL>create spfile from pfile;
  (4)启动数据库 修改db_cache_size的大小
  SQL> alter system set db_cache_size=25165824 scope=both;
  System altered.
  修改完毕。
  总结:
  sga_max_size需要重启数据库来进行调整,而其中的db_cache_size等可以动态调节,在调节共享池时需要计算好SGA的总容量,假如超过了sga_max_size,就会出现报错的现象。


Tag: Oracle Oracle内存 Oracle优化 TTTBLOG
我也要发一个   ·   返回首页   ·   返回[Oracle]   ·   前一个   ·   下一个
评论
Allen#1Allen 2009-11-21 17:52:30(N) 链接地址
| 662 | 摩凝 | 2009-11-21 17:52:30 | [email protected] | http://www.lxooo.com |
-----
再次围观……看来很多人都看不懂,哈哈,我沙发了好多次。
顶部     1/1 
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Oracle]   ·   返回顶部