
10g以前,怎么样配置合适的数据库各内存池大小是非常重要的话题,但是自从10g之后,自动内存池调节成为一个重要Oracle特性。
在10g时,ASMM(Automatic Shared Memory Management)实现了Oracle SGA和PGA内部结构的自调节。进入11g之后,AMM (Automatic Memory Management)实现了参数 MEMORY_TARGET,将SGA和PGA的规划全部统筹起来对待。
默认情况下,Oracle 11g是使用AMM的。我们在安装过程中,指定Oracle使用内存的百分比,这个取值就作为MEMORY_TARGET 和 MEMORY_MAX_TARGET的初始取值使用。如果这两个参数设置为非零取值,那么Oracle就是采用AMM管理策略的。
同时,如果我们设置这两个参数为0,则AMM自动关闭。对应的SGA_TARGET、PGA_AGGREGATE_TARGET参数取值非零之后,Oracle自动退化使用ASMM特性。
AMM切换为ASMM
1. 从AMM切换至ASMM
环境:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
当前配置(AMM管理):
SQL> show parameter target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 512M
memory_target big integer 512M
parallel_servers_target integer 4
pga_aggregate_target big integer 0
sga_target big integer 0
下面是如何从AMM到ASMM(关闭AMM,将MEMORY_TARGET 和 MEMORY_MAX_TARGET都设置为0)
SQL> alter system set memory_max_target=0 scope=spfile;
System altered.
SQL> alter system set memory_target=0 scope=spfile;
System altered.
SQL> alter system set pga_aggregate_target=100m scope=spfile;
System altered.
SQL> alter system set sga_target=260m scope=spfile;
System altered.
重启。
11g的AMM应该说是很方便数据库自我管理的,但是在一些情况下,如HugePage,我们可能需要切换回ASMM。
ASMM切换为AMM
2. 从ASMM切换至AMM
查看当前参数:
SQL> show parameter target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 368M
memory_target big integer 0
parallel_servers_target integer 8
pga_aggregate_target big integer 100M
sga_target big integer 260M
获取PGA分配的最大值:
SQL> select value/1024/1024 ||'M' from v$pgastat where name='maximum PGA allocated';
VALUE/1024/1024||'M'
-----------------------------------------
157.4765625M
计算memory_target:
计算公式:memory_target = sga_target + max(pga_aggregate_target,maximum PGA allocated),在本例中即为:
260M + 100M = 360M
如果使用pfile启动数据库,则关闭数据库,直接修改pfile文件中的内容。
如果使用spfile启动数据库,则使用以下命令:
ALTER SYSTEM SET MEMORY_TARGET = nM scope = spfile;
ALTER SYSTEM SET SGA_TARGET = 0;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
重启数据库,就可启用AMM。
AMM内存调优
AMM内存调优
SQL> select * from v$memory_target_advice order by memory_size;
MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION
----------- ------------------ ------------ ------------------- ----------
256 .5 112 1 0
384 .75 112 1 0
512 1 112 1 0
640 1.25 112 1 0
768 1.5 112 1 0
896 1.75 112 1 0
1024 2 112 1 0
7 rows selected.
当MEMORY_SIZE_FACTOR为1时MEMORY_SIZE的值,即一般认为比较合理的MEMORY_TARGET的值。
问题处理
ORA-00837
由于操作失误,MEMORY_MAX_TARGET值小于MEMORY_TARGET,结果导致数据库无法启动,报错
ORA-01078: failure in processing system parameters
ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET
而我的spfile由在ASM中,采用以下方法得以恢复:
1. 手动编辑一个pfile , 只要一个db_name即可
2.startup nomount;
3.create pfile='OS PATH' from spfile='ASM PATH';
4.shutdown
5.编辑pfile到合适的内容
6.startup;
7.create spfile='ASM PATH' from pfile='OS PATH';
然后在把本地的pfile改成*.SPFILE='ASM PATH'





