ITPub博客

首页 > 数据库 > Oracle > 开启oracle 10g的sga自动管理-amm

开启oracle 10g的sga自动管理-amm

原创 Oracle 作者:wisdomone1 时间:2015-09-21 12:35:36 0 删除 编辑

背景

   10g启动了SGA自动管理,即SGA内部各组件之共享池,DB CADHE,JAVA POOL等子池,由数据库视负载自行调整,大为简化了运维工作量。
但是由于10G中SGA自动管理,可能会引发很多性能问题,所以也可采用SGA手工管理方式,即手工指定SGA各组件DB CADHE,JAVA POOL等子池
的大小,防止抖动非常严重。
   本文是基于ORACLE 10.2.0.5数据库进行测试。


结论

1,sga自动内存管理即配置sga_target为非0
2,sga自动内存管理又分为2种方式,
  第1种方式为SGA全自动内存管理方式,即sga_target配置为非0,且其sga的自动调整的组件全指定为0
  这样就是让ORACLE全权去调整SGA各组件


  第2种方式为SGA半自动管理方式(为了区别全自动内存管理方式,我换一个命名),即配置sga_target为非0,且其想控制的SGA自动调整子组件为非0的最小值
  这样就是让SGA对应的子组件在动态调整时,不会小于这个指定的值,前提是你非常了解自己的ORACLE数据库业务负载,否则会丧失SGA自动内存管理的优点
3,SGA子组件分为可以自动调整的组件,以及不能自动调整的组件,即固定大小
   关于这块信息,请参考测试部分的第3点之3.1和3.2,或者查看V$SGAINFO


4,sga_target不能大于sga_max_size
5, sga各个组件分配是以granule为单位进行分配以及回收的,关于granule请参考测试第1的内容
6, v$sgainfo及v$dynamic_sga_components会显示SGA各子组当前实际分配的大小
7,本文仅测试SGA自动内存管理方式,至于SGA手工内存管理方式不在本文范围   


测试



1,ORACLE SGA它是一块的大的连续的内存区域,由许多小的组件构成,比如:DB CACHE SIZE,JAVA POOL,LARGE POOL,SHARED POOL等组成;
这些组件每次分配以收回收内存是由GRANULES为单位进行,当然这个内存分配同由ORACLE底层控制,我们无法手工控制。


   至于GRUNALE到底多大,由SGA总的大小决定; 这么说吧,在多数操作系统平台,
   如果SGA小于1G,则GRANULES为4M
   如果SGA大于1G,则GRANULE为16M
   也可能在WINDOW 32BIT上面,若SGA大于1G,则GRANULES为8M
   当然具体可能还需要你查看对应的官方手册获知对应信息。




SQL> show parameter sga_max


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 348M
SQL> select name,bytes/1024/1024 as mb,resizeable from v$sgainfo where name='Granule Size';


NAME                                     MB RES
-------------------------------- ---------- ---
Granule Size                              4 No




SQL> show parameter sga_max


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 1104M
SQL> select name,bytes/1024/1024 as mb,resizeable from v$sgainfo where name='Granule Size';


NAME                                     MB RES
-------------------------------- ---------- ---
Granule Size                             16 No




每个SGA组件分配是以GRANULE为单位分配的,如果指定的组件大小不是GRANULE整数倍,则四舍五入处理
SQL> show parameter shared_pool


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size            big integer 5033164
shared_pool_size                     big integer 96M
SQL> alter system set shared_pool_size=100m;


System altered.


SQL> show parameter shared_pool


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size            big integer 5033164
shared_pool_size                     big integer 112M
SQL> 




2,为了启用SGA自动管理,statistics_level必须配置为typical或all
SQL> show parameter statistics_level


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
statistics_level                     string      TYPICAL




SQL> select name,value,isdefault from v$parameter_valid_values where name='statistics_level';


NAME                                               VALUE      ISDEFAULT
-------------------------------------------------- ---------- ----------
statistics_level                                   BASIC      FALSE
statistics_level                                   TYPICAL    TRUE
statistics_level                                   ALL        FALSE




SQL> alter system set statistics_level='basic';
alter system set statistics_level='basic'
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00830: cannot set statistics_level to BASIC with auto-tune SGA enabled


3,启用sga自动管理,只要配置sga_target=非0即可;
 3.1,sga_target的值由下述子组件构成(自动调整)
---------------------------------------------------------------------------
sga组件                                                     对应的参数
---------------------------------------------------------------------------
固定sga及由用于其它方面的ORACLE内部分配的内存区域               无


大池                                                        large_pool_size


java池                                                      java_pool_size


buffer cache                                                db_cache_size


流池                                                        streams_pool_size
---------------------------------------------------------------------------




3.2,下面的组件仍然使用sga_target(人工调整)
---------------------------------------------------------------------------
sga组件                                                     对应的参数
---------------------------------------------------------------------------
log buffer                                                  log_buffer
keep and recycle buffer caches                              db_keep_cache_size,db_recycle_cache_size
非标准块的buffer caches                                      db_nk_cache_size
---------------------------------------------------------------------------


4,开启SGA自动管理功能,除了配置sga_target为非0,必须配置上述第3步的自动调整的子组件全为0,以开启这些子组件全自动调整;
还有另一种方法,也可以配置上述第3步的自动调整的子组件为非0值,这样起到什么作用呢,即在SGA各组件自动调整时,每个组件调整时不会调整
到指定的值。


file:///Volumes/Untitled/操作系统介质/官方手册/oracle10gr2官方文档/B19306_01/server.102/b14231/create.htm#sthref383




5,下面开始实施SGA全自动管理的具体过程
什么叫作SGA全自动管理,即SGA各子组件完全由ORACLE自行控制其大小,根据业务负载动态调整,每个子组件没有调整的最低限值。


6,为了实施SGA全自动管理,须先计算SGA_TARGET所需的值为多少


---当前SGA配置的值(关于这2个视图请参考官方手册)
SQL> select sum(value) from v$sga;


SUM(VALUE)
----------
1157627904


---当前SGA从未使用过的空闲内存
SQL> select current_size from v$sga_dynamic_free_memory;


CURRENT_SIZE
------------
   100663296


--综上可知SGA_target的计算公式为:
select ((select sum(value) from v$sga) - (select current_size from v$sga_dynamic_free_memory)
       )/1024/1024
 as "sga_target"
from dual;


所以要配置的sga_target则为
sga_target=1008m


或者sga_target的值也可以是sga各子组件之和,也可以是小于sga_max_size的值




7,现在开启SGA全自动管理,即就是把SGA自动调整的子组件全部调整为0
--先查看调整前的SGA各组件配置
SQL> show parameter sga_


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 1104M
sga_target                           big integer 1008M
SQL> show parameter _pool_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer 16M
large_pool_size                      big integer 48M
olap_page_pool_size                  big integer 0
shared_pool_size                     big integer 112M
streams_pool_size                    big integer 64M


--调整SGA动态调整组件为0




SQL> select 1056964608/1024/1024 as sga_target from dual;


SGA_TARGET
----------
      1008


SQL> alter system set sga_target=1008m;


System altered.


SQL> alter system set shared_pool_size=0;


System altered.


SQL> alter system set large_pool_size=0;


System altered.


SQL> alter system set java_pool_size=0;


System altered.


SQL> alter system set streams_pool_size=0;


System altered.




SQL> 
SQL> show parameter db_cache_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_size                        big integer 144M
SQL> alter system set db_cache_size=0;


System altered.


SQL>     


8,重启数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.


Total System Global Area 1157627904 bytes
Fixed Size                  2095800 bytes
Variable Size             335545672 bytes
Database Buffers          805306368 bytes
Redo Buffers               14680064 bytes
Database mounted.
Database opened.  


9,确认开启SGA全自动内存管理
SQL> show parameter sga_


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 1104M
sga_target                           big integer 1008M
SQL> show parameter _pool_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer 0
large_pool_size                      big integer 0
olap_page_pool_size                  big integer 0
shared_pool_size                     big integer 0
streams_pool_size                    big integer 0
SQL> show parameter db_cache_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_size                        big integer 0
SQL> show parameter db_cache


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice                      string      OFF
db_cache_size                        big integer 0
SQL> 


10,上次我们测试了SGA自动内存管理的具体过程,但如果你想控制某些SGA自动调整组件的最小大小,可以为其子组件配置最小值,这样的好处就是在
SGA动态调整期间,其子组件调整值不会小于这个指定的值,防止抖动过于严重,引发严重性能问题。(建议生产环境采用这种方式)


11,哪么如何配置这种SGA自动内存管理的方式,其实也很简单,就是指定每个动态调整子组件为非0值即可。


---比如你想让db_cache_size及shared_pool_size不能小于某个值,因为这2个组件非常重要
SQL> show parameter db_cache


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice                      string      OFF
db_cache_size                        big integer 0
SQL> show parameter shared_pool


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size            big integer 5872025
shared_pool_size                     big integer 0


SQL> alter system set db_cache_size=500m;


System altered.


SQL> alter system set shared_pool_size=100m;


System altered.


SQL> show parameter db_cache


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice                      string      OFF
db_cache_size                        big integer 512M
SQL> show parameter shared_pool


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size            big integer 5872025
shared_pool_size                     big integer 112M
SQL> 


12,重启数据库再次进行验证db_cache_size及shared_pool_size,这种方式其实是ORACLE不建议,除非你非常了解自己的应用业务特征,否则就会损失动态调整的好处,以及有效利用资源的机会。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.


Total System Global Area 1157627904 bytes
Fixed Size                  2095800 bytes
Variable Size             335545672 bytes
Database Buffers          805306368 bytes
Redo Buffers               14680064 bytes
Database mounted.
Database opened.
SQL> 
SQL> show parameter db_cache


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice                      string      OFF
db_cache_size                        big integer 512M
SQL> show parameter shared_pool


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size            big integer 5872025
shared_pool_size                     big integer 112M
SQL> 


13,可以通过如下视图查看sga各组件的当前实际大小


---v$sgainfo可以区分出SGA子组件分为动态调整和固定大小2种类型
SQL> select name,bytes/1024/1024 as mb,RESIZEABLE as mb from  v$sgainfo;


NAME                                     MB MB
-------------------------------- ---------- ---
Fixed SGA Size                   1.99871063 No
Redo Buffers                             14 No
Buffer Cache Size                       768 Yes  --这里可以当前DB_CACHE_SIZE实际大小为768M,而db_cache_size指定的最小值为512M
Shared Pool Size                        112 Yes
Large Pool Size                          32 Yes
Java Pool Size                           16 Yes
Streams Pool Size                        64 Yes
Granule Size                             16 No
Maximum SGA Size                       1104 No
Startup overhead in Shared Pool          48 No
Free SGA Memory Available                96


11 rows selected.









个人简介


8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院     
河北廊坊新奥集团公司

 项目经验:
中国电信3G项目AAA系统数据库部署及优化
      中国联通4G数据库性能分析与优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
国家电网上海灾备项目4 node rac+adg 
       贵州移动crm及客服数据库性能优化项目
       贵州移动crm及客服务数据库sql审核项目
       深圳穆迪软件有限公司数据库性能优化项目

联系方式:
手机:18201115468
qq   :   305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900    
itpub博客名称:wisdomone1    http://blog.itpub.net/9240380/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-1805063/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb 工作经历: 中国普天 北京科蓝 北京云和恩墨 北京神州新桥

注册时间:2008-04-04

  • 博文量
    2189
  • 访问量
    12690158