Oracle12c 新特性:限制PGA使用内存的大小
我们都知道,在12c之前,对于PGA内存的管理是使用PGA_AGGREGATE_TARGET参数来控制的,但这个参数也只是一个参考值,Oracle实例只是尽量保证总的PGA使用量在这个值范围内,当会话使用的PGA内存超过这个限制时,Oracle也不能做出什么强制措施来限制使用内存的大小。
12.1.0.1版本中引入了新特性:使用PGA_AGGREGATE_LIMIT参数来限制Oracle实例PGA使用内存的上限。后台进程ckpt每三秒检查一次PGA使用的内存总量,如果超过限制就采取终止会话的方式来降低PGA内存的使用量,对于SYS用户进程和后台进程不包括job队列不会被终止掉。有了这个限制,不会造成PGA内存疯涨,导致内存耗尽。
官方文档:http://docs.oracle.com/database/121/TGDBA/tune_pga.htm#TGDBA95344
默认地PGA_AGGREGATE_LIMIT参数为2G或200%的PGA_AGGREGATE_TARGET值或PROCESSES参数值*3M
测试数据库版本12.1.0.2
SQL>select*fromv$version;BANNERCON_ID------------------------------------------------------------------------------------------OracleDatabase12cEnterpriseEditionRelease12.1.0.2.0-64bitProduction0PL/SQLRelease12.1.0.2.0-Production0CORE12.1.0.2.0Production0TNSforLinux:Version12.1.0.2.0-Production0NLSRTLVersion12.1.0.2.0-Production0
查看PGA_AGGREGATE_LIMIT参数值大小为2G
SQL>showparameterpgaNAMETYPEVALUE-----------------------------------------------------------------------------pga_aggregate_limitbiginteger2Gpga_aggregate_targetbiginteger250M
创建测试用户
SQL>altersessionsetcontainer=pdb_orcl;Sessionaltered.SQL>createuserzxidentifiedbyzx;Usercreated.SQL>grantdbatozx;Grantsucceeded.SQL>connzx/zx@pdb_orclConnected.
创建一个包用于演示占用PGA
SQL>createorreplacepackagedemo_pkg2as3typearrayistableofchar(2000)indexbybinary_integer;4g_dataarray;5end;6/Packagecreated.
查看当前会话sid和使用PGA内存情况
SQL>selectuserenv('sid')fromdual;USERENV('SID')--------------22--当前会话sid为22SQL>selecta.name,to_char(b.value,'999,999,999')bytes,2to_char(round(b.value/1024/1024,1),'99,999.9')mbytes3fromv$statnamea,v$mystatb4wherea.statistic#=b.statistic#5anda.namelike'%gamemory%';NAMEBYTESMBYTES-------------------------------------------------------------------------------------sessionugamemory2,301,3122.2sessionugamemorymax2,424,8242.3sessionpgamemory3,715,1763.5sessionpgamemorymax3,715,1763.5--当前会话使用PGA内存为3.5MB
执行前面创建的包,查看PGA内存使用情况
--循环执行200000次查看PGA内存使用情况SQL>begin2foriin1..2000003loop4demo_pkg.g_data(i):='x';5endloop;6end;7/PL/SQLproceduresuccessfullycompleted.SQL>selecta.name,to_char(b.value,'999,999,999')bytes,2to_char(round(b.value/1024/1024,1),'99,999.9')mbytes3fromv$statnamea,v$mystatb4wherea.statistic#=b.statistic#5anda.namelike'%gamemory%';NAMEBYTESMBYTES-------------------------------------------------------------------------------------sessionugamemory470,213,072448.4sessionugamemorymax470,213,072448.4sessionpgamemory471,773,288449.9sessionpgamemorymax471,773,288449.9--共使用449MB内存,可以算出循环执行200000*5次占用的PGA就会超过设置的2GSQL>begin2foriin1..10000003loop4demo_pkg.g_data(i):='x';5endloop;6end;7/begin*ERRORatline1:ORA-04036:PGAmemoryusedbytheinstanceexceedsPGA_AGGREGATE_LIMIT--报错ORA-4036超过了PGA_AGGREGATE_LIMIT设置的2G
调整PGA_AGGREGATE_LIMIT为4G后再次执行报错的过程,就没有问题了
SQL>conn/assysdbaConnected.SQL>altersystemsetPGA_AGGREGATE_LIMIT=4G;Systemaltered.SQL>connzx/zx@pdb_orclConnected.SQL>begin2foriin1..10000003loop4demo_pkg.g_data(i):='x';5endloop;6end;7/PL/SQLproceduresuccessfullycompleted.SQL>showparameterpgaNAMETYPEVALUE-----------------------------------------------------------------------------pga_aggregate_limitbiginteger4Gpga_aggregate_targetbiginteger250M
取消PGA限制,设置pga_aggregate_limit=0即可。
altersystemsetPGA_AGGREGATE_LIMIT=0;
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。