微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;

BANNER										CON_ID
------------------------------------------------------------------------------------------
OracleDatabase12cEnterpriseEditionRelease12.1.0.2.0-64bitProduction		0
PL/sqlRelease12.1.0.2.0-Production							0
CORE	12.1.0.2.0	Production								0
TNSforLinux:Version12.1.0.2.0-Production						0
NLSRTLVersion12.1.0.2.0-Production							0

查看PGA_AGGREGATE_LIMIT参数值大小为2G

sql>showparameterpga

NAME				TYPE	VALUE
-----------------------------------------------------------------------------
pga_aggregate_limit		biginteger2G
pga_aggregate_target		biginteger250M

创建测试用户

sql>altersessionsetcontainer=pdb_orcl;

Sessionaltered.

sql>createuserzxidentifiedbyzx;

Usercreated.

sql>grantdbatozx;

Grantsucceeded.

sql>connzx/zx@pdb_orcl
Connected.

创建一个包用于演示占用PGA

sql>createorreplacepackagedemo_pkg
2as
3typearrayistableofchar(2000)indexbybinary_integer;
4g_dataarray;
5end;
6/

Packagecreated.

查看当前会话sid和使用PGA内存情况

sql>selectuserenv('sid')fromdual;

USERENV('SID')
--------------
22
--当前会话sid为22
sql>selecta.name,to_char(b.value,'999,999,999')bytes,2to_char(round(b.value/1024/1024,1),'99,999.9')mbytes
3fromv$statnamea,v$mystatb
4wherea.statistic#=b.statistic#
5anda.namelike'%gamemory%';

NAMEBYTESMBYTES
-------------------------------------------------------------------------------------
sessionugamemory2,301,3122.2
sessionugamemorymax2,424,8242.3
sessionpgamemory3,715,1763.5
sessionpgamemorymax3,1763.5
--当前会话使用PGA内存为3.5MB

执行前面创建的包,查看PGA内存使用情况

--循环执行200000次查看PGA内存使用情况
sql>begin
2foriin1..200000
3loop
4demo_pkg.g_data(i):='x';
5endloop;
6end;
7/

PL/sqlproceduresuccessfullycompleted.

sql>selecta.name,v$mystatb
4wherea.statistic#=b.statistic#
5anda.namelike'%gamemory%';

NAMEBYTESMBYTES
-------------------------------------------------------------------------------------
sessionugamemory470,213,072448.4
sessionugamemorymax470,072448.4
sessionpgamemory471,773,288449.9
sessionpgamemorymax471,288449.9
--共使用449MB内存,可以算出循环执行200000*5次占用的PGA就会超过设置的2G
sql>begin
2foriin1..1000000
3loop
4demo_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/assysdba
Connected.
sql>altersystemsetPGA_AGGREGATE_LIMIT=4G;

Systemaltered.

sql>connzx/zx@pdb_orcl
Connected.
sql>begin
2foriin1..1000000
3loop
4demo_pkg.g_data(i):='x';
5endloop;
6end;
7/

PL/sqlproceduresuccessfullycompleted.

sql>showparameterpga

NAMETYPEVALUE
-----------------------------------------------------------------------------
pga_aggregate_limitbiginteger4G
pga_aggregate_targetbiginteger250M

取消PGA限制,设置pga_aggregate_limit=0即可。

altersystemsetPGA_AGGREGATE_LIMIT=0;

原文地址:https://www.jb51.cc/oracle/211154.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐