Oracle12c 新特性:限制PGA使用内存的大小
2016-12-24 23:37
375 查看
我们都知道,在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
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 * from v$version; BANNER CON_ID -------------------------------------------------------------------------------- ---------- Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0 PL/SQL Release 12.1.0.2.0 - Production 0 CORE 12.1.0.2.0 Production 0 TNS for Linux: Version 12.1.0.2.0 - Production 0 NLSRTL Version 12.1.0.2.0 - Production 0查看PGA_AGGREGATE_LIMIT参数值大小为2G
SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_limit big integer 2G pga_aggregate_target big integer 250M创建测试用户
SQL> alter session set container=pdb_orcl; Session altered. SQL> create user zx identified by zx; User created. SQL> grant dba to zx; Grant succeeded. SQL> conn zx/zx@pdb_orcl Connected.创建一个包用于演示占用PGA
SQL> create or replace package demo_pkg 2 as 3 type array is table of char(2000) index by binary_integer; 4 g_data array; 5 end; 6 / Package created.查看当前会话sid和使用PGA内存情况
SQL> select userenv('sid') from dual; USERENV('SID') -------------- 22 --当前会话sid为22 SQL> select a.name, to_char(b.value, '999,999,999') bytes, 2 to_char(round(b.value/1024/1024,1), '99,999.9' ) mbytes 3 from v$statname a, v$mystat b 4 where a.statistic# = b.statistic# 5 and a.name like '%ga memory%'; NAME BYTES MBYTES ---------------------------------------------------------------- ------------ --------- session uga memory 2,301,312 2.2 session uga memory max 2,424,824 2.3 session pga memory 3,715,176 3.5 session pga memory max 3,715,176 3.5 --当前会话使用PGA内存为3.5MB执行前面创建的包,查看PGA内存使用情况
--循环执行200000次查看PGA内存使用情况 SQL> begin 2 for i in 1 .. 200000 3 loop 4 demo_pkg.g_data(i) := 'x'; 5 end loop; 6 end; 7 / PL/SQL procedure successfully completed. SQL> select a.name, to_char(b.value, '999,999,999') bytes, 2 to_char(round(b.value/1024/1024,1), '99,999.9' ) mbytes 3 from v$statname a, v$mystat b 4 where a.statistic# = b.statistic# 5 and a.name like '%ga memory%'; NAME BYTES MBYTES ---------------------------------------------------------------- ------------ --------- session uga memory 470,213,072 448.4 session uga memory max 470,213,072 448.4 session pga memory 471,773,288 449.9 session pga memory max 471,773,288 449.9 --共使用449MB内存,可以算出循环执行200000*5次占用的PGA就会超过设置的2G SQL> begin 2 for i in 1 .. 1000000 3 loop 4 demo_pkg.g_data(i) := 'x'; 5 end loop; 6 end; 7 / begin * ERROR at line 1: ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT --报错ORA-4036超过了PGA_AGGREGATE_LIMIT设置的2G调整PGA_AGGREGATE_LIMIT为4G后再次执行报错的过程,就没有问题了
SQL> conn / as sysdba Connected. SQL> alter system set PGA_AGGREGATE_LIMIT=4G; System altered. SQL> conn zx/zx@pdb_orcl Connected. SQL> begin 2 for i in 1 .. 1000000 3 loop 4 demo_pkg.g_data(i) := 'x'; 5 end loop; 6 end; 7 / PL/SQL procedure successfully completed. SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_limit big integer 4G pga_aggregate_target big integer 250M取消PGA限制,设置pga_aggregate_limit=0即可。
alter system set PGA_AGGREGATE_LIMIT=0;
相关文章推荐
- 限制PGA使用内存的大小
- oracle12c新特性(9)--限制PGA的大小
- c#如何限制程序内存使用的大小
- RH442 - 通过cgroup来限制kvm虚拟机只使用host的某个cpu和内存大小
- 使用dma_alloc_writecombine申请内存空间大小的限制
- oracle 12c 新特性之(相同字段上的多重索引、ddl 日志、限制PGA的大小、分页查询)
- 限制MongoDB使用内存大小
- Window7 32位系统破解电脑使用内存大小的限制
- C#如何限制程序内存使用的大小
- 限制单个站点内存使用大小
- 限制进程使用的内存大小和CPU时间
- oracle 12c:新特性-限制PGA的大小
- (转)Linux共享内存使用常见陷阱与分析(1)-超过共享内存的大小限制
- RH442 - 通过cgroup来限制kvm虚拟机只使用host的某个cpu和内存大小
- c#如何限制程序内存使用的大小
- 限制某个asp.net应用程序使用的内存的大小
- 限制MongoDB使用内存大小
- oracle 12c 新特性之(相同字段上的多重索引、ddl 日志、限制PGA的大小、分页查询)
- 使用FileUpload控件上传文件时对文件大小的限制
- 如何察看Solaris系统的内存大小及使用情况?