RDBMS 12.2.0.1
pga_aggregate_limit :该参数是12.1版本开始有得新参数。对于数据库可以使用得PGA总量做出了一个硬性限制。
该参数会被设置为以下值中得较大的一个
2G , pga_aggregate_target初始化参数值的2倍,3MB乘以processes初始化参数的值。
当达到限制的时候,数据库引擎会中止调用甚至是杀掉会话。为了选择要处理的会话,数据库不考虑最大的PGA利用率。而是会考虑使用最多的不可调整内存总量的会话。当调用被中止时,会出现ORA-04036告警,当会话被kill掉的时候,会触发ORA-03113错误。并在alert log中写入那些会话被kill
关于这个参数的值,可以参考MOS :使用数据库参数 PGA_AGGREGATE_LIMIT 限制进程大小 (文档 ID 1602891.1)
该参数的值的算法是这样的:
在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的大小.
注意: 在 12.1 或者 12.2中,如果指定PGA_AGGREGATE_LIMIT的值为0,则表示实例所使用的 PGA 内存总量没有限制。
--- 以下为测试
--修改之前的参数设置。 2G, pga_aggregate_target的2倍是20M,processes*2M =640M .选择最大,所以pga_aggregate_limit的值是2G 。
SYS@test> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 2G
pga_aggregate_target big integer 10M
SYS@test> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 1
asm_io_processes integer 20
db_writer_processes integer 1
gcs_server_processes integer 0
global_txn_processes integer 1
job_queue_processes integer 4000
log_archive_max_processes integer 4
processes integer 320
SYS@test>
-- 修改processes参数为2000 试试
SYS@test> alter system set processes =2000 scope = spfile;
System altered.
-- 然后再次查看pga相关参数, 发现PGA的limit为6000M,processes为2000. 2000*3M=6000M 是2G,pga_aggregate_target*2中最大的值。所以pga_aggregate_limit被设置成了6000M。
SYS@test> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 6000M
pga_aggregate_target big integer 10M
SYS@test> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 1
asm_io_processes integer 20
db_writer_processes integer 1
gcs_server_processes integer 0
global_txn_processes integer 1
job_queue_processes integer 4000
log_archive_max_processes integer 4
processes integer 2000
SYS@test>
可以将pga_aggregate_limit的值设置为0. 但是不能设置为比默认值低的值。(修改之前的值是6000M,其被认为是默认值)
SYS@test> alter system set pga_aggregate_limit=0;
System altered.
SYS@test>
SYS@test> alter system set pga_aggregate_limit=1024M;
alter system set pga_aggregate_limit=1024M
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00093: pga_aggregate_limit must be between 6000M and 100000G
SYS@test>
END