12c引入的新参数,用于限制pga的使用总大小,在12c前pga的大小是没有指定上限的,PGA_AGGREGATE_TARGET仅指定了pga软限制而非硬限制,在使用过程中仅控制可优化部分内存的分配,大量 PGA 可能会导致高交换率。出现这种情况时,系统可能会无法响应,并且不稳定。

使用 PGA_AGGREGATE_LIMIT初始化参数可以为 PGA 内存使用量指定硬性限制。如果超过了 PGA_AGGREGATE_LIMIT 值,则 Oracle 数据库按照以下顺序,中断或者终止使用了最多不可优化 PGA 内存的会话或进程:

  • 中止使用了最多不可优化 PGA 内存的会话调用。
    
  • 如果 PGA 内存使用量仍超过 PGA_AGGREGATE_LIMIT,则终止使用了最多不可优化 PGA 内存的会话和进程。
    

使用最多不可优化内存会话的调用将被中止。并行查询将被视为一个单元。如果 PGA 内存使用总量仍超过限制,则将终止使用最多不可优化内存的会话。 不会对除作业队列进程之外的 SYS 进程和后台进程执行这一部分中所述的任何操作。取而代之的操作是,如果它们使用了最多不可优化内存,则会定期将其 PGA 使用量的简短摘要写入到跟踪文件中。

PGA_AGGREGATE_LIMIT 初始化参数动态设置为 PGA 内存的实例范围硬性限制。由于该参数根据内存情况的变化做出响应,您无需显式设置参数值。 默认情况下,PGA_AGGREGATE_LIMIT被设置为: Oracle 12.1版本: PGA_AGGREGATE_LIMIT默认为如下值中的最大者:

  • 2 GB
    
  • 200% 的 PGA_AGGREGATE_TARGET
    
  • (PROCESSES 初始化参数设置值)* 3 MB
    

该参数不会超过物理内存大小减去总 SGA 大小的 120%。

Oracle 12.2版本: PGA_AGGREGATE_LIMIT的默认值为:

  • 如果设置了MEMORY_TARGET, 那么PGA_AGGREGATE_LIMIT默认值为MEMORY_MAX_TARGET的值.
  • 如果MEMORY_TARGET没有设置, 那么PGA_AGGREGATE_LIMIT默认值为 200%的PGA_AGGREGATE_TARGET值.
  • 如果MEMORY_TARGET没有设置, 并且PGA_AGGREGATE_TARGET被显式的设置为0, 那么PGA_AGGREGATE_LIMIT的默认值为90%的物理内存减去SGA的大小. 在以上所有情况中,默认的PGA_AGGREGATE_LIMIT至少是2GB 并且至少是数据库参数PROCESSES乘以3MB的大小,如果是rac则5MB * processes. 注意: 在 12.1 或者 12.2中,如果指定PGA_AGGREGATE_LIMIT的值为0,则表示实例所使用的 PGA 内存总量没有限制。 PGA_AGGREGATE_LIMIT 初始化参数可以动态设置;并不需要数据库重新启动。可以设置 PGA_AGGREGATE_LIMIT 的值,不论是否使用了自动内存管理。 后台进程 CKPT 每三秒检查一次内存用量是否超过了 PGA_AGGREGATE_LIMIT 初始化参数的值。如果达到或超过了限制,则此进程中断使用最多不可优化 PGA 内存的会话调用。如果这些会话仍没有释放足够内存,则终止它们。 请注意,由于 pga 值仅每三秒检查一次,因此 pga 内存有可能超过 PGA_AGGREGATE_LIMIT。此外,如果在此期间该 pga 值减少到限制之下,则将不会捕获在这三秒间隔内超过限制的情况。如果进程在三秒的间隔内快速分配然后释放内存,则可能会出现这种情况。 示例: 如下的信息会被写入到CKPT trace 文件,
PGA LIMIT: pid 317111 is ineligible for an ORA-4036 interrupt
System processes and most background processes cannot receive ORA-4036
interrupts. When they are contributing to the instance exceeding
PGA_AGGREGATE_LIMIT, they will periodically dump their PGA usage.
PGA LIMIT: pid 317124 is a top contributor to going over PGA_AGGREGATE_LIMIT
PGA LIMIT: pid 317124 is ineligible for an ORA-4036 interrupt
PGA LIMIT: pid 317120 is a top contributor to going over PGA_AGGREGATE_LIMIT
PGA LIMIT: pid 317120 is ineligible for an ORA-4036 interrupt

如果达到了 PGA_AGGREGATE_LIMIT 值,则将报告如下错误。

ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
    Cause: Private memory across the instance exceeded the limit specified in the PGA_AGGREGATE_LIMIT initialization parameter. The largest sessions using Program Global Area (PGA) memory were interrupted to get under the limit.
    Action: Increase the PGA_AGGREGATE_LIMIT initialization parameter or reduce memory usage.

PGA_AGGREGATE_LIMIT的大小如果设置为小于2G的默认值会导致数据库启动失败。

https://docs.oracle.com/database/121/REFRN/GUID-E364D0E5-19F2-4081-B55E-131DF09CFDB3.htm#REFRN10328

Limiting Process Size with Database Parameter PGA_AGGREGATE_LIMIT (Doc ID 1520324.1)

Datapatch faces error " ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT" (Doc ID 2560320.1)