当我的一位团队成员创建 Oracle 文本索引时,我遇到了 ORA-04036(在 12c 上)。
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
ORA-00039: error during periodic action
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366
这可能是由于客户端为并行操作而建立的多个会话造成的,或者客户端可能会泄漏会话并且未正确关闭它们。
在我的例子中,由于创建索引(或任何其他并行操作)时并行度非常高 48(需要太多会话和增加的 PGA)而失败。 我们应该尽量减少并行性来避免这种情况。我尝试使用 DOP 8 脚本成功运行。
在 Oracle Database 12c 中,一个名为 PGA_AGGREGATE_LIMIT 的新参数 对实例占用的 PGA 数量设置硬性限制。什么时候 该实例中所有会话占用的总 PGA 超过 限制,Oracle 终止持有最不可调的 PGA 的会话 内存,释放该会话持有的所有 PGA 内存。那杀了 会话收到此消息。
注意新的 Oracle 错误 ORA-4036。这是一个非常有用的 用于控制未调整会话发出的失控 PGA 消耗的功能 查询。参数pga_aggregate_limit,如果没有显式定义, 默认为这三个数字中的较大者:2 GB 3 MB 乘以 过程参数值 2 倍参数值 pga_aggregate_target 但是这个限制不超过1.2倍 去掉总 SGA 大小后的总物理内存。不喜欢 这个新功能并想回到以前的(12c 之前) 行为?当然;只需将 pga_aggregate_limit 的值设置为 0 即可 参数不会有任何影响。
为了社区读者的利益发布答案,因为我还找不到它。请参阅this以进一步阅读。
我遇到了类似的问题,并通过执行以下操作解决了它。
使用以下命令查看当前的 pga_aggregate_limit 是什么(如果您想恢复更改):
show parameter pga_aggregate_limit;
使用以下命令将 pga_aggregate_limit 设置为 0:
alter system set pga_aggregate_limit = 0;
更多信息请点击这里:
http://www.dba-oracle.com/t_pga_aggregate_limit.htm
https://docs.oracle.com/database/121/REFRN/GUID-E364D0E5-19F2-4081-B55E-131DF09CFDB3.htm#REFRN10328