Oracle9i引入pga_aggregate_target,可以自动对PGA进行调整;
Oracle10引入sga_target,可以自动对SGA进行调整。
Oracle11g则对这两部分进行综合,引入参数memory_target和memory_max_target,可以自动调整所有的内存,这就是新引入的自动内存管理(AMM)特性。
下面我们通过以下的几个命令来让大家清楚memory_target 的设置与PGA与SGA的关系:
第一步:
SQL> alter system set memory_target=412m scope=spfile;
System altered.
SQL> alter system set sga_target=0 scope=spfile;
System altered.
SQL> alter system set pga_aggregate_target=0 scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 472887296 bytes
Fixed Size 1375368 bytes
Variable Size 369099640 bytes
Database Buffers 96468992 bytes
Redo Buffers 5943296 bytes
Database mounted.
Database opened.
设置memory_target参数后,实际上Oracle会自动设置并调整以下两个参数来分配SGA和PGA的内存,这和Oracle10g自动设置sga_target后分配db_cache_size和shared_pool_size的机制是一样的
SQL> select a.ksppinm name,b.ksppstvl value
2 from x$ksppi a,x$ksppcv b
3 where a.indx=b.indx
4 and (a.ksppinm like '%sga_target%'
5 or a.ksppinm like '%pga_aggregate_target%');
NAME VALUE
---------------------------------------- ------------------------------
sga_target 0
__sga_target 281018368
pga_aggregate_target 0
__pga_aggregate_target 150994944
192937984
第二步:
现在sga_target和pga_aggregate_target都一设置成了0M,memory_target也为0M。修改memory_target的大小,查看数据库是怎么自动分配内存的?
SQL> alter system set memory_target=450m scope=spfile;
系统已更改。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 472887296 bytes
Fixed Size 1375368 bytes
Variable Size 369099640 bytes
Database Buffers 96468992 bytes
Redo Buffers 5943296 bytes
数据库装载完毕。
数据库已经打开。
SQL> select a.ksppinm name,b.ksppstvl value
2 from x$ksppi a,x$ksppcv b
3 where a.indx=b.indx
4 and (a.ksppinm like '%sga_target%'
5 or a.ksppinm like '%pga_aggregate_target%');
NAME VALUE
---------------------------------------- ------------------------------
sga_target 0
__sga_target 281018368
pga_aggregate_target 0
__pga_aggregate_target 192937984
大家可以发现,Oracle自动内存管理(AMM),自行将__pga_aggregate_target调大了,并没有人为修改过,Oracle自动调整修改的。
下面我们了解一下ORA-00845的由来与解决方案:
如果memory_max_target/memory_target设置过大,可能导致instance无法启动,报ORA-00845错误
SQL> alter system set memory_max_target=300m scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-00845: MEMORY_TARGET not supported on this system
这个错误有点误导,实际上这并不是说该平台版本上不支持AMM特性,只是设置的memory_max_target超过了系统中设置的share memory(/dev/shm)而已。在Oracle11g for linux中似乎使用了一种新的机制来管理共享内存段,而不是传统的sys /dev/shm了。在alert.ora中可以找到更准确的错误描述
AMM 的限制
如果初始化参数 LOCK_SGA = true ,则 AMM 是不可用的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27025927/viewspace-1269580/ ,如需转载,请注明出处,否则将追究法律责任。