数据库参数 PGA_AGGREGATE_LIMIT 限制进程大小

如何使用新参数 PGA_AGGREGATE_LIMIT 限制数据库进程能够增加到的最大大小。sql

在自动化 PGA 内存管理模式下,Oracle 数据库经过动态控制分配到工做区的 PGA 内存量来尝试听从 PGA_AGGREGATE_TARGET 值。
可是,有时由于如下缘由,PGA 内存使用量可能会超过 PGA_AGGREGATE_TARGET 设置:
PGA_AGGREGATE_TARGET 设置起到的是目标的做用,而非限制。
PGA_AGGREGATE_TARGET 仅控制可优化部份内存的分配。
使用大量 PGA 可能会致使高交换率。出现这种状况时,系统可能会没法响应,而且不稳定。这种时候须要考虑使用 PGA_AGGREGATE_LIMIT 初始化参数限制总体 PGA 使用量。数据库

12c 引入了新的参数 PGA_AGGREGATE_LIMIT 以容许数据库管理员限制 pga 内存使用总量。
使用 PGA_AGGREGATE_LIMIT初始化参数能够为 PGA 内存使用量指定硬性限制。若是超过了 PGA_AGGREGATE_LIMIT 值,
则 Oracle 数据库按照如下顺序,中断或者终止使用了最多不可优化 PGA 内存的会话或进程:
停止使用最多不可优化 PGA 内存的会话调用。
若是 PGA 内存使用量仍超过 PGA_AGGREGATE_LIMIT,则终止使用了最多不可优化 PGA 内存的会话和进程。
使用最多不可优化内存会话的调用将被停止。并行查询将被视为一个单元。若是 PGA 内存使用总量仍超过限制,则将终止使用最多不可优化内存的会话。
不会对除做业队列进程以外的 SYS 进程和后台进程执行这一部分中所述的任何操做。取而代之的操做是,
若是它们使用了最多不可优化内存,则会按期将其 PGA 使用量的简短摘要写入到跟踪文件中。
显式设置 PGA_AGGREGATE_LIMIT 与将其设置为默认值,在行为上没有差异。
PGA_AGGREGATE_LIMIT 初始化参数动态设置为 PGA 内存的实例范围硬性限制。因为该参数根据内存状况的变化作出响应,您无需显式设置参数值。默认状况下,PGA_AGGREGATE_LIMIT 设置为如下值中的较大者:api

2 GB
200% 的 PGA_AGGREGATE_TARGET
(PROCESSES 初始化参数设置值)* 3 MB
该参数不会超过物理内存大小减去总 SGA 大小的 120%。数组

若是指定了值 0,则表示实例所使用的 PGA 内存总量没有限制。
PGA_AGGREGATE_LIMIT 初始化参数能够动态设置;并不须要数据库从新启动。能够设置 PGA_AGGREGATE_LIMIT 的值,不管是否使用了自动内存管理。session

后台进程 CKPT 每三秒检查一次内存用量是否超过了 PGA_AGGREGATE_LIMIT 初始化参数的值。若是达到或超过了限制,
则此进程中断使用最多不可优化 PGA 内存的会话调用。若是这些会话仍没有释放足够内存,则终止它们。
请注意,因为 pga 值仅每三秒检查一次,所以 pga 内存有可能超过 PGA_AGGREGATE_LIMIT。此外,若是在此期间该 pga 值减小到限制之下,
则将不会捕获在这三秒间隔内超过限制的状况。若是进程在三秒的间隔内快速分配而后释放内存,则可能会出现这种状况。

若是达到了 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.oracle

示例:
此示例将展现使用 pl/sql 填充内存中数组能够超过 pga_aggregate_limit 的值。app

首先请查看当前 pga_aggregate_target。因为 pl/sql 内存区不是 pga 目标控制的可优化区域,进程 pga 将超过此值。
-- V$PGASTAT 的 PGA 统计信息:
-- 显示自实例启动以来分配的最大 pga 总量ide

select name, ROUND(value/1024/1024) as Mbytes from v$pgastat
where name in ('maximum PGA allocated','aggregate PGA target parameter','aggregate PGA auto target');
NAME Mbytes
---------------------- ------------
aggregate PGA target p 208
arameter
aggregate PGA auto tar 138
get
maximum PGA allocated 119优化

请注意 pga_aggregate_limit 显式设置为 512M。this

select con_id, name as Parameter, value/1024/1024 as Mbytes from V$SYSTEM_PARAMETER
where name in ('pga_aggregate_target','memory_target','memory_max_target','sga_max_size','sga_target','pga_aggregate_limit','processes')
order by name;
CON_ID PARAMETER Mbytes
------ ------------------------------ ------------
0 memory_max_target 600
0 memory_target 600
0 pga_aggregate_limit 512
0 pga_aggregate_target 0
0 processes 0
0 sga_max_size 600
0 sga_target 0

运行这个过程的会话收到此错误:
ERROR at line 1:
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
针对 V$PROCESS 的查询显示进程在 ckpt进程捕获到这种状况并停止其对内存的调用以前,在 3 秒时间内增加到 2.5G 大小。

[Insert code here]
CON_ID OSpid Orapid Sess id Serial# Status PGA alloc PGA used PGA Max PNAME oracleuser OS user Program
------ -------- ------- ------- ------- -------- ------------ ------------ ------------ ----- ------------ ------------ ------------------------
4 5349 33 258 41 INACTIVE 3 2 2,536 SYSTEM oracle sqlplus@localhost.locald
omain (TNS V1-V3)


 

alert.log 显示如下错误。
Errors in file /u01/app/oracle/diag/rdbms/cdb1/cdb1/trace/cdb1_ora_5349.trc (incident=79479):
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
Incident details in: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79479/cdb1_ora_5349_i79479.trc
Dumping diagnostic data in directory=[cdmp_20130128072143], requested by (instance=1, osid=5349), summary=[incident=79479].

进程的跟踪文件显示与致使此错误的进程相关的信息。
经过显示的服务名您能够知道是哪一个容器发生了错误。
跟踪文件还提供了摘要 heap dump(堆转储)。在本例中,主堆具备 2159MB 的“koh-kghu call”。在该堆中,子堆包括 2154 MB 的“pl/sql vc2”。
可使用这些内容在 MOS 上搜索有关这些分配的任何已知问题。诸如这样一些与 pl/sql 相关的分配一般是 pl/sql 程序一次性将大量数据加载到内存中形成的。
在这样的状况下,应该变动程序,一次将有限数量的记录加载到内存中。替代方法是容许这样大的分配并增长 pga_aggregate_limit 的值

*** SERVICE NAME:(pdb1.example.com) 2013-01-28 07:44:27.902 <===-----------请注意指示哪一个容器出现错误的服务的名称。
*** MODULE NAME:(SQL*Plus) 2013-01-28 07:44:27.902
*** ACTION NAME:() 2013-01-28 07:44:27.902
*** CONTAINER ID:(4) 2013-01-28 07:44:27.902
*** TRACE FILE RECREATED AFTER BEING REMOVED ***

Process may have gone over pga_aggregate_limit
Just allocated 65536 bytes
Dumping short stack in preparation for potential ORA-4036
----- Abridged Call Stack Trace -----
ksedsts()+313<-ksm_pga_limit_short_stack()+456<-ksm_check_over_limit()+540<-ksmapg()+351<-kghgex()+1426<-kghfnd()+745<-kghalo()+693<-kghgex()
+401<-kghalf()+403<-kghualloc()+794<-kohalmc()+295<-kohalc()+110<-plsm0vc_rsz()+197<-pevm_MOVC_i()+1021<-pfrinstr_MOVC()+52
<-pfrrun_no_tool()+60<-pfrrun()+809<-plsql_run()+617<-peicnt()+287<-kkxexe()+789
----- End of Abridged Call Stack Trace -----
=======================================
PRIVATE MEMORY SUMMARY FOR THIS PROCESS
---------------------------------------
******************************************************
PRIVATE HEAP SUMMARY DUMP
2161 MB total:
2161 MB commented, 261 KB permanent
481 KB free (256 KB in empty extents),
2159 MB, 1 heap: "koh-kghu call " 1 KB free held <=============指示在 pga 中使用内存的命名内存分配
------------------------------------------------------
Summary of subheaps at depth 1
2155 MB total:
2155 MB commented, 104 KB permanent
295 KB free (20 KB in empty extents),
2154 MB, 138274 chunks: "pl/sql vc2 " <--------------------指示 pga heap(堆)中包含的子堆内存分配

*** 2013-01-28 07:44:28.045
Incident 79480 created, dump file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79480/cdb1_ora_5349_i79480.trc
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT

*********START PLSQL RUNTIME DUMP************
***Got internal error Exception caught in pl/sql run-time while running PLSQL***
***Got ORA-4036 while running PLSQL***
PROCEDURE SYSTEM.FILL_MEMORY:
意外事件文件显示程序堆栈及行号

Dump continued from file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/trace/cdb1_ora_5349.trc
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT

========= Dump for incident 79480 (ORA 4036) ========

*** 2013-01-28 07:44:28.045
dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3, mask=0x0)
----- Current SQL Statement for this session (sql_id=gqbtzt92rm1ck) -----
BEGIN fill_memory(2680000); END;
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
object line object
handle number name
0x77335850 7 procedure SYSTEM.FILL_MEMORY <-------程序的行号
0x77238760 1 anonymous block

----- Call Stack Trace -----

相关文章
相关标签/搜索