暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle AMM自动内存管理

oracleEDU 2017-10-10
1246

    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'

最后修改时间:2021-04-28 20:14:47
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论