欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

oracle三对内存参数间关系之2AMM机制涉及的一对参数间的关系探讨

程序员文章站 2022-05-02 14:02:09
...

oracle三对内存参数间关系之2AMM机制涉及的一对参数间的关系探讨 AMM机制涉及的一对参数为: MEMORY_TARGET和MEMORY_MAX_TARGET。 MEMORY_TARGET Default value 0 (SGA autotuning is disabled for DEFERRED mode autotuning requests, but allowed for IMME

oracle三对内存参数间关系之2AMM机制涉及的一对参数间的关系探讨


AMM机制涉及的一对参数为:MEMORY_TARGET和MEMORY_MAX_TARGET。


MEMORY_TARGET

Default value 0 (SGA autotuning is disabled forDEFERRED mode autotuning requests, but allowed forIMMEDIATE mode autotuning requests)
Modifiable ALTER SYSTEM (即表示该参数为动态参数)
Range of values 152 MB to MEMORY_MAX_TARGET
参见:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams143.htm#I1010285


MEMORY_MAX_TARGET

Default value 0
Modifiable No(即表示该参数为静态参数)
Range of values 0 to the physical memory size available to the Oracle Database

参见:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams142.htm

上述描述可知,

1、当MEMORY_TARGET=非0时,MEMORY_TARGET要在152 MB to MEMORY_MAX_TARGET这个范围内。

2、

由于MEMORY_TARGET始终MEMORY_MAX_TARGET,所以

当MEMORY_TARGET=0时,MEMORY_MAX_TARGET取值范围为0 to the physical memory size available to the Oracle Database。

当MEMORY_TARGET=非0时,MEMORY_TARGET要在152 MB to MEMORY_MAX_TARGET这个范围内,故而MEMORY_MAX_TARGET取值范围为152 MB to the physical memory size available to the Oracle Database

注释补充:

MEMORY_TARGET 的值要大于等于sga_target与pga_aggregate_target之和

例如,

sga_target=744M ,pga_aggregate_target=556M,MEMORY_TARGET=1400M时,

SQL>alter system set memory_target=115m;

alter system set memory_target=115m

*

第 1 行出现错误:

ORA-02097: 无法修改参数, 因为指定的值无效

ORA-00838:指定的 MEMORY_TARGET 的值太小, 至少应为 1400M

注释:

”ORA-00838:指定的 MEMORY_TARGET 的值太小, 至少应为 1400M“这个错误提示中1400M,该值等于sga_target与pga_aggregate_target之和

因为MEMORY_TARGET 》=sga_target与pga_aggregate_target之和



MEMORY_TARGET和MEMORY_MAX_TARGET两者关系为


0、MEMORY_TARGET始终MEMORY_MAX_TARGET.

例如,MEMORY_MAX_TARGET=116M时,

SQL>alter system set memory_target=120m;

alter system set memory_target=120m

*

第 1 行出现错误:

ORA-02097: 无法修改参数, 因为指定的值无效

ORA-00837:指定的值 MEMORY_TARGET 大于 MEMORY_MAX_TARGET


1、当MEMORY_TARGET=非0时(即AMM启动时)

1.1

当参数文件里MEMORY_TARGET=非0,MEMORY_MAX_TARGET=非0时,实例启动成功。

1.2

当参数文件里MEMORY_TARGET=非0,MEMORY_MAX_TARGET=0时,实例启动成功。

实例启动后,自动会将MEMORY_TARGET的值赋值给MEMORY_MAX_TARGET。即

In a text-based initialization parameter file, if you omitMEMORY_MAX_TARGET and include a value forMEMORY_TARGET, then the database automatically setsMEMORY_MAX_TARGET to the value ofMEMORY_TARGET.

2、当MEMORY_TARGET=0时(即AMM关闭时)

2.1

当参数文件里MEMORY_TARGET=0,MEMORY_MAX_TARGET=非0时,实例启动成功。

实例启动后,查看MEMORY_TARGET和MEMORY_MAX_TARGET都为原值(使用showparameters mem或是select * from v$parameter where name like '%mem%';)。即

If you omit the line for MEMORY_TARGET and include a value forMEMORY_MAX_TARGET, theMEMORY_TARGET parameter defaults to zero. After startup, you can then dynamically changeMEMORY_TARGET to a nonzero value, provided that it does not exceed the value ofMEMORY_MAX_TARGET.(文章详解)

2.2

当参数文件里MEMORY_TARGET=0,MEMORY_MAX_TARGET=0时,实例启动成功。

实例启动后,查看MEMORY_TARGET和MEMORY_MAX_TARGET(使用showparameters mem或是select * from v$parameter where name like '%mem%';),发现MEMORY_MAX_TARGET被调整为一个非0值。

下面是具体实验来证明:

参数文件:

*.memory_max_target=0

*.memory_target=0

*.pga_aggregate_target=100M

*.sga_max_size=0

*.sga_target=0

SQL> startuppfile=E:\app\hc\product\11.2.0\dbhome_1\database\INITmonkey.ORA

ORACLE 例程已经启动。

Total System Global Area 150667264 bytes

Fixed Size 1373152 bytes

Variable Size 92277792 bytes

Database Buffers 50331648 bytes

Redo Buffers 6684672 bytes

数据库装载完毕。

数据库已经打开。

SQL> select name,value from v$parameter where name like '%target%' orname like

'%sga%';

NAME VALUE

--------------------------------- -----------------------------------------------

sga_max_size 150994944(144M)(值变了)

pre_page_sga FALSE

lock_sga FALSE

sga_target 0

memory_target 0

memory_max_target 121634816(116M)(值变了)

archive_lag_target 0

fast_start_io_target 0

fast_start_mttr_target 0


db_flashback_retention_target 1440

pga_aggregate_target 104857600

parallel_servers_target 32

已选择12行。

SQL> create pfile from memory;

文件已创建。

此命令得到的参数文件里:

sga_max_size=144M # internallyadjusted

sga_target=0



上述两条语句的结果可以看出,

sga_max_size 150994944(144M)

sga_max_size=144M # internallyadjusted


memory_max_target 121634816(116M)


参数文件里memory_max_target=0且memory_target=0时启动实例后memory_max_target会被改为非0值,且memory_max_target是静态参数,其实例运行期间修改的值在实例运行期间不起作用,所以实例运行期间:memory_max_target始终为非0值,memory_max_target必定大于memory_target(该条在启动实例时的参数文件里也是如此,oracle会检查是否满足此条件的)


sga_max_size=0且sga_target=0时,启动实例后,oracle会自动sga_max_size值进行调整。

至于memory_max_target,启动实例后,是oracle会自动进行调整值还是随意写一个值不得而知。???

memory_target=0时sga_ target可以为0是因为memory_target=0时sga_ target为0,表示sga为手动管理,即由shared_pool_size参数等之和为sga大小。



附加

MEMORY_MAX_TARGET是静态参数,所以它即使在实例运行期间修改的值也要在下次启动时起作用,故而不用试验MEMORY_MAX_TARGET静态参数在实例运行期间修改对MEMORY_ ARGET影响