操作系统内核参数限制导致ora-4030

最近同事遇到一个问题,某个报表程序报错ora-4030的错误:

通过trace,发现是以下语句的问题:

这个sql在执行的时候,pga的内存被迅速的消耗,通过v$sesstat看到这个session每次使用pga快到2G时,就报错了。而且每次都是这样。所以一开始,我们怀疑是不是pga不够,增加pga大小为3G继续观察程序的运行情况,结果发现还是一样的报错。

在metalink上发现类似的有个bug:Bug 4994859: ORA-04030 WHILE EXECUTING A PROCEDURE CONTAINING BULK COLLECT。于是打算分2步走:
1、向开发建议修改程序,不使用BULK COLLECT(上面sql的85行处)
2、由于bug是在Sun Solaris SPARC (64-bit)上的9207版本,我们的是HP UX的9208版本,可能不是这个bug。所以向oracle开SR进行确认。

oracle回复:

于是用RDA收集主机信息,发现有一个参数设置:

从这里我们看到ulimit -d参数被限制了,大小为2G,我们通过修改2个内核参数从而达到修改这个参数的目的:
1、将maxdsiz从2147483648 (2G) 调整到4187593114(4G)
2、将maxdsiz_64bit从2147483648 (2G)调整6442450944 (6G).
ulimit -d自动的变成:

再次运行原来的应用程序,发现不再报错。

相关文章

一条评论

  1. 最好将程序中的 “批量绑定” 修改为游标方式。
    曾经遇到类似问题, 将PGA设置非常大, ulimits改为无限大,都不能解决问题, 最后让项目组把代码改成游标,问题终于解决。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据