(转)Oracle 11g内存分配分析(oracle 11g Memory Allocation Analysis)

开始用oracle11g有一段时间了,一直没有整理Oracle内存方面的特点,尤其是在oracle11g里面引入了 memory_max_target 和 memory_target之后,有了些新的变化和安排在memory方面;

Oracle对内存的管理的 优化从未间断,从8i到11g不断地提出新的管理概念。每个本版都对内存管理进行了简化:

  1. 8i->9i:PGA的自动管理;
  2. 9i->10g:SGA的自动管理;
  3. 10g->11g:MEMORY(SGA+PGA)的自动管理。

在11g中oracle引入了自动化内存管理(Automatic Memory Management)概念,仅用两个参数就能完成oracle的内存管理工作。DBA的工作看来又要轻松不少了,看看两个参数:

MEMORY_TARGET:oracle所能使用的最大内存,该参数可以动态调整。

MEMORY_MAX_TARGET:MEMORY_TARGET参数所能动态设定的最大值,不能动态调整,需要重启数据库

注:oracle的内存管理方式可以根据本版向下兼容的,11g可以实现10g,9i,8i时的管理方式。

SQL> select component,current_size,min_size,max_size from v$memory_dynamic_components;
 

首先来看一个测试例子来了解他的变化和其他的内部memory的互动:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

SQL> show  parameter mem;

NAME                                            TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
hi_shared_memory_address             integer                0
memory_max_target                       big integer            4G
memory_target                               big integer            4G
shared_memory_address                 integer                0


SQL> alter system set memory_target=3000M scope=both;
alter system set memory_target=3000M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 4016M
*****************************************************************

为什么这步调整memory_target竟然failed了呢? 我们来看看下面的SGA 和PGA的设置就明白了其中的缘由 ,而且还特别强调了memory_target的value调整的太小,需要至少多少XXX;


SQL> show  parameter pga;

NAME                                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
pga_aggregate_target                        big integer            1500M
SQL> show  parameter sga;

NAME                                                      TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
lock_sga                                                 boolean                FALSE
pre_page_sga                                         boolean                FALSE
sga_max_size                                         big integer            4G
sga_target                                             big integer            2512M
SQL>


从上面SGA 和 PGA ,它们display出来的memory value可以看到,其实memory_target 直接control的就是它们两个的总和 。

Memory_Target = SGA_Target + pga_aggregate_target

其中我们知道sga_target 和 pga_aggregate_target ,它们都是动态可以调整的,但是现在调整的时候都要先看看memory_target的limit的value了,否则你调高了,就会给你下面的 Error message:

SQL> alter system set pga_aggregate_target=1510M scope=both;
alter system set pga_aggregate_target=1510M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00840: PGA_AGGREGATE_TARGET cannot be modified to the specified value

***********************************************************************************************************

而对于sga_max_size的设置也不可以不考虑其他的限制,请看下面一个案例,我们看到SGA_MAX_SIZE的突破设置,带来的启动报错 ;

SQL> show parameter sga;
NAME                                               TYPE                   VALUE
------------------------------------ ---------------------- -----------------------------
lock_sga                                           boolean                FALSE
pre_page_sga                                   boolean                FALSE
sga_max_size                                   big integer            4G
sga_target                                       big integer            2000M
SQL> show parameter mem;
NAME                                             TYPE                   VALUE
------------------------------------ ---------------------- -----------------------------
hi_shared_memory_address             integer                 0
memory_max_target                       big integer            4G
memory_target                               big integer            3504M
shared_memory_address                 integer                 0

SQL> alter system set sga_max_size=4200M scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 4412407808 cannot be set to more than MEMORY_TARGET 3674210304.
SQL>

我们从报错的message可以看出来, SGA_MAX_SIZE之前调整的大小(4G)肯定是不行的在DB restart的时候,DB后台会通过内部计算来发现了这个参数的问题。 所以报了SGA_MAX_SIZE是不允许大于MEMORY_TARGET设置的value的。

所以可以总结一下MEMORY之间互相制约的顺序;

memory_max_target==>memory_target===>sga_max_size==>sga_target , 此外, Memory_target还有下面的这个power哦:

Memory_Target = SGA_Target + pga_aggregate_target

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值