本节提供有关Oracle数据库的自动内存管理功能的背景信息,并包含有关启用此功能的说明。涵盖以下主题:
- 关于自动内存管理
- 启用自动内存管理
- 监视和调整自动内存管理
关于自动内存管理
管理实例内存的最简单方法是让Oracle数据库实例为您自动管理和调整它。为此(在大多数平台上),只设置一个目标内存大小初始化参数(MEMORY_TARGET)和一个最大内存大小初始化参数(MEMORY_MAX_TARGET)。实例使用的内存总量基于MEMORY_TARGET的值保持相对恒定,并且实例在系统全局区域(SGA)和实例程序全局区域(实例PGA)之间自动分配内存。随着内存需求的变化,实例动态地在SGA和实例PGA之间重新分配内存。
如果未启用自动内存管理,则必须手动调整SGA和实例PGA的大小。
因为MEMORY_TARGET初始化参数是动态的,所以您可以随时更改MEMORY_TARGET,而无需重新启动数据库。 MEMORY_MAX_TARGET(不是动态的)用作上限,因此您不会意外地将MEMORY_TARGET设置得太高,并且为了在将来希望增加实例内存总量的情况下为数据库实例留出足够的内存。由于某些SGA组件无法轻易缩小或必须保持最小大小,因此该实例也会阻止您将MEMORY_TARGET设置得太低。
如果使用数据库配置助手(DBCA)创建数据库并选择基本安装选项,则会启用自动内存管理。如果选择高级安装,则数据库配置助手(DBCA)使您能够选择自动内存管理。
如果LOCK_SGA初始化参数为TRUE,则不能启用自动内存管理。有关此参数的信息,请参阅Oracle数据库参考。
启用自动内存管理
如果您在创建数据库时未启用自动内存管理(通过选择DBCA中的适当选项或通过为CREATE DATABASE SQL语句设置适当的初始化参数),可以稍后启用它。启用自动内存管理包括关闭和重新启动数据库。
启用自动内存管理
- 启动SQL * Plus并以SYSDBA身份连接到数据库。
- 计算MEMORY_TARGET的最小值如下:
a、通过输入以下SQL * Plus命令来确定SGA_TARGET和PGA_AGGREGATE_TARGET的当前大小:
SHOW PARAMETER TARGET
SQL * Plus会在参数名称中显示所有初始化参数的值和字符串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 0 memory_target big integer 0 parallel_servers_target integer 16 pga_aggregate_target big integer 90M sga_target big integer 272M
b、运行以下查询以确定自数据库启动以来分配的最大实例PGA:
select value from v$pgastat where name='maximum PGA allocated';
c、计算步骤b的查询结果和PGA_AGGREGATE_TARGET之间的最大值。将SGA_TARGET添加到此值。
memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)
例如,如果SGA_TARGET是272M并且PGA_AGGREGATE_TARGET是90M,如上所示,并且如果分配的最大PGA被确定为120M,则MEMORY_TARGET应该至少为392M(272M + 120M)。
3、选择您要使用的MEMORY_TARGET的值
这可以是您在步骤2中计算出的最小值,或者如果有足够的物理内存可用,则可以选择使用较大的值。
4、对于MEMORY_MAX_TARGET初始化参数,决定在可预见的将来您想要分配给数据库的最大内存量。也就是说,确定SGA和实例PGA大小之和的最大值。该数字可能大于或等于您在上一步中选择的MEMORY_TARGET值。
5、执行以下操作之一:
如果使用服务器参数文件启动Oracle数据库实例(如果使用数据库配置助手(DBCA)创建数据库时为缺省值),请输入以下命令:
ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;
其中n是您在步骤4中计算的值。
SCOPE = SPFILE子句仅在服务器参数文件中设置该值,而不是针对正在运行的实例。您必须包含此SCOPE子句,因为MEMORY_MAX_TARGET不是动态初始化参数。
如果您使用文本初始化参数文件启动实例,请手动编辑文件以使其包含以下语句:
memory_max_target = nM memory_target = mM
其中n是您在步骤4中确定的值,m是您在步骤3中确定的值。
在文本初始化参数文件中,如果省略MEMORY_MAX_TARGET的行并包含MEMORY_TARGET的值,则数据库会自动将MEMORY_MAX_TARGET设置为MEMORY_TARGET的值。如果省略MEMORY_TARGET的行并包含MEMORY_MAX_TARGET的值,则MEMORY_TARGET参数默认为零。启动后,您可以动态地将MEMORY_TARGET更改为非零值,前提是它不超过MEMORY_MAX_TARGET的值。
6、关闭并重新启动数据库。
7、如果您使用服务器参数文件启动Oracle数据库实例,请输入以下命令:
ALTER SYSTEM SET MEMORY_TARGET = nM; ALTER SYSTEM SET SGA_TARGET = 0; ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
其中n是您在步骤3中确定的值。
前面的步骤指示您将SGA_TARGET和PGA_AGGREGATE_TARGET设置为零,以便SGA和实例PGA的大小根据需要上下调整,不受限制。您可以省略将这些参数值设置为零的语句,并将其中一个或两个值都设置为正数。在这种情况下,这些值将作为SGA或实例PGA大小的最小值。
监视和调整自动内存管理
动态性能视图V $ MEMORY_DYNAMIC_COMPONENTS显示所有动态调优的内存组件的当前大小,包括SGA和实例PGA的总大小。
视图V $ MEMORY_TARGET_ADVICE为MEMORY_TARGET初始化参数提供调整建议。
1 SQL> select * from v$memory_target_advice order by memory_size; 2 3 MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION 4 ----------- ------------------ ------------ ------------------- ---------- 5 180 .5 458 1.344 0 6 270 .75 367 1.0761 0 7 360 1 341 1 0 8 450 1.25 335 .9817 0 9 540 1.5 335 .9817 0 10 630 1.75 335 .9817 0 11 720 2 335 .9817 0
MEMORY_SIZE_FACTOR为1的行显示由MEMORY_TARGET初始化参数设置的当前内存大小以及完成当前工作负载所需的DB时间量。在之前和之后的行中,结果显示了几种可选的MEMORY_TARGET大小。对于每个备选大小,如果将MEMORY_TARGET参数更改为备用大小,数据库将显示大小因子(当前大小的倍数)以及完成当前工作负载的估计DB时间。请注意,对于小于当前MEMORY_TARGET大小的总内存大小,估计的DB时间会增加。还要注意,在这个例子中,通过增加总内存大小超过450MB没有什么可以获得的。但是,如果尚未运行完整的工作负载,则这种情况可能会发生变化。
Enterprise Manager提供了一个易于使用的图形内存顾问程序,可帮助您为MEMORY_TARGET选择最佳大小。有关详细信息,请参阅Oracle Database 2 Day DBA
参考资料
https://docs.oracle.com/cd/E11882_01/server.112/e25494/memory.htm#ADMIN11199