Oracle 11g内存分配分析(oracle 11g Memory Allocation Analysis)
开始用oracle11g有一段时间了,一直没有整理Oracle内存方面的特点,尤其是在oracle11g里面引入了 memory_max_target 和 memory_target之后,有了些新的变化和安排在memory方面;
Oracle对内存的管理的 优化从未间断,从8i到11g不断地提出新的管理概念。每个本版都对内存管理进行了简化:
- 8i->9i:PGA的自动管理;
- 9i->10g:SGA的自动管理;
- 10g->11g:MEMORY(SGA+PGA)的自动管理。
在11g中oracle引入了
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本