一) 你可以看到分配的共享内存(SGA),如下:
共享SQL>显示参数;
NAME TYPE值
--------------------------------------------------
_shared_pool_reserved_min_alloc大整数4100
hi_shared_memory_address整数0
max_shared_servers整数20
shared_memory_address整数0
SHARED_POOL_RESERVED_SIZE大整数30000000
shared_pool_size的大整数150994944
shared_server_sessions整数0
SHARED_SERVERS整数0
或如下:
SQL> SELECT * GV $ SGASTAT;
二) 一个堆转储是有用的,在发生故障时的各种栈内存分配的快照。这可以得到如下(从错误5332178)
在SQL * Plus:获取堆转储级别事件“4030跟踪名称堆转储级别536870912 536870912使用”。SQL> ALTER SESSION事件'4030跟踪名称HEAPDUMP 536870912“;然后运行一个SQL脚本(例如wfretry.sql)重现错误。
输出看起来像这样:
===============================================
HEAP DUMP pga heap
===============================================
0(0) ::PLS non-lib hp : 417136
0(0) ::koh-kghu call : 349898976
DIRECT ::comp_kfkpg : 49164
DIRECT ::compreq_kfkpg : 49164
DIRECT ::ldm context : 70036
DIRECT ::pl/sql vc2 : 1787164
DIRECT ::pl/sql: adt/rec : 264396
DIRECT ::pmucalm coll : 1721580
DIRECT ::pmuccst: adt/re : 308835072
DIRECT ::reqs_kfkpg : 49164
DIRECT ::subreq_kfkpg : 49164
DIRECT ::wait_kfkpg : 49164
DIRECT ::waitreq_kfkpg : 49164
OTHER :: : 150224
PERM :: : 1446112
RECREATE :: : 177420
FREE :: : 231372384
: ----------
Total Heap Size :: : 42859160
.
===============================================
HEAP DUMP koh-kghu call
===============================================
DIRECT ::pl/sql: adt/rec : 32808
DIRECT ::pmuccst: adt/re : 21347592
OTHER :: : 0
PERM :: : 0
RECREATE :: : 0
FREE :: : 0
: ----------
Total Heap Size :: : 21380400
Note the amount of memory consumed by the koh-kghu call stack = 349898976 mb
Another example in SQL*Plus:
SQL> Alter session set max_dump_file_size=unlimited ;
Session altered.
SQL> alter session set events '4030 trace name errorstack level 3;name heapdump level 536870925';
Session altered.
SQL> @cc2.sql
Start Time = 06/09/2007 10:53:54
DECLARE
*
ERROR at line 1:
ORA-04030: out of process memory when trying to allocate 16408 bytes (koh-kghu sessi,pl/sql vc2)
ORA-06510: PL/SQL: unhandled user-defined exception
Another method to generate the heapdump is as follows:
SQL> oradebug setorapid 10 (this is for the oracle pid, use setospid for the os process id)
SQL> oradebug unlimit
SQL> oradebug dump heapdump 7
如果长期运行的过程中,可以使用此方法。否则,如果进程结束太快,你可以尝试以前的方法(的SQL *加以上)。
三) 您还可以监视进程大小,在操作系统级别使用的命令一样:
PMAP,PS,顶部,自由,vmstat的运行PMAP-XS(spid是预订会议相应的数据库服务器进程的PID)运行在一个循环中的SAR-W,所以我们可以得到之前的4030错误值。
运行以下操作系统命令来获得物理和交换内存大小:
/usr/sbin/lsattr -E -l sys0 -a realmem
/usr/sbin/lsps -s
运行前的p命令看到的内存分配。
四) 在ORA-6508错误的情况下,下面的查询可以帮助找出失败的包和可能驻留在内存中:
SQL> SELECT名称,型,线,文本从all_errors像“OE_%,其中name'和雇主=“应用程序”;下面的查询将给予固定的对象的信息:
SQL> SELECT名称,类型,命名空间,SHARABLE_MEM,负载处决,锁,销,保持从
V $ db_object_cache其中name ='OE_DELAYED_REQUESTS_PVT“;
可以用下面的方法获得的ORA-6508错误的堆栈跟踪。
SQL> ALTER SYSTEM设定事件'6508跟踪名称ERRORSTACK“;
这将使6508错误的堆栈跟踪。现在尝试再次运行导入程序。
在为这个错误USER_DUMP_DEST,它会创建一个跟踪文件。然后禁用事件之后执行以下。
SQL> ALTER SYSTEM '6508跟踪关“的名称上下文中设置事件;
4.避免错误的一些最佳做法
请注意,这个错误,是一个在操作系统的内存水平,而不是数据库的问题。通常情况下,调整SQL或应用性能的补丁将无法避免这种类型的错误,虽然症状可能是一个性能问题,因为正在处理的数据量的相似。某些数据库参数(init.ora中)不影响内存是如何分配给进程。
问题通常可以通过调整某些内存分配和参数被规避,但是这并非总是如此。有一个进程可用的内存量的物理限制,因此,我们只能做这么多。在OM,这相当于以较少的数据放置在PL / SQL的集合结构,这意味着试图处理每笔交易的数据量小。
我们应该问的顾客,以较少的数据在可能的情况下运行的进程。例如,如果在订单管理的质量变化,对数百行尝试做一次100线。如果使用较少的数据是不是一种选择,然后再尝试的过程中,以限制资源争。例如,试运行进口秩序,没有预订的订单;或关闭自动调度和推迟到后台调度;或预填充尽可能接口表中的数据,以减少由违约发动机做的工作。定价中,我们可以尝试限制由发动机前完成的工作量填充的命令行上的价格表,或确保没有盲目的修饰语或灭活未使用的价目表,修饰符,定价阶段等(见调整定价引擎白皮书)。
如果问题是由于加载在内存中的一个包中的ORA-6508错误的情况下,失败,那么我们可能会建议顾客尝试寄托在内存中的包。这样一来,包将在需要时可用来执行。
若要固定在内存中封装,可以使用以下命令:
Login to sqlplus as sysdba
SQL> execute dbms_shared_pool.keep ('APPS.OE_DELAYED_REQUESTS_PVT');
SQL> execute dbms_shared_pool.keep ('APPS.OE_SERVICE_UTIL');
5.SR的样本错误
一)订购进口:6027765,5837874和5246616,提供可能的解决方法。
二)预订:5533728,5332178,5061182,4940965
三)质量的变化:5077005(奥姆补丁修复)
四)预订:6156030
五)其他:
2901354 - 设置WORKAREA_SIZE_POLICY为AUTO
3445124 - 执行的PL / SQL时遇到ORA-4030错误
6.其他注意事项
一)ulimit的作用下,(参见错误4940965)Oracle的内存分配是通过的ulimit限制。通过ulimit必须说“无限”数据段,这意味着内存可以长大的maxdsiz_64值。
尝试设置以下内容,看看问题是否是重复的。
1.设置maxdsiz_64到4GB
2.设置_pga_max_size到4GB
3.确保的ulimit显示,至少在数据段无限。
使用以下命令来验证ulimit设置:
$ulimit -a
time(cpu-seconds) unlimited
file(blocks) unlimited
coredump(blocks) 0
data(kbytes) unlimited
stack(kbytes) 10240
lockedmem(kbytes) 3145728
memory(kbytes) unlimited
nofiles(descriptors) 65536
processes 2047
如果程序需要超过4GB上述可能仍然不能解决问题。
二)如何了解SGA的大小影响(参见Bug 5332178)
在32位Linux的一个进程拥有4GB内存的地址空间。与标准内核1GB用于内核地址,只有3GB可以使用的过程。使用hugemem内核,可以使用4GB的进程。
这包括执行代码,栈,共享库,共享内存和私人进程内存(PGA)。
如果我们用大SGA(共享内存)和增加mapped_base的地址,我们可用的进程的内存在同一时间减少。如果顾客真正需要的3.4gb SGA和进程在同一时间需要大量的私有内存,顾客使用64位的HW / SW或使用VLM的选项。一个单一的过程,不能处理超过4GB的内存。一个单一的过程中使用了2.3 GB,最大PGA SGA一些100MB是有限的。 PGA_AGGREGATE_TARGET的限制PGA连接到同一个数据库中的所有进程的内存量。 PGA_AGGREGATE_TARGET的= 4096b,我们可以大约80个并发客户端分配50MB的PGA的管理。我们会收到A-4030,如果乘以进程的PGA大小的进程数达到PGA_AGGREGATE_TARGET的。但这改变的最大PGA我们每个进程分配的32位架构的结果。
有了一个2.3MB的SGA,有700MB留下的一切,包括PGA,堆栈,代码共享库等如果ORA-4030据报道,因为我们打了一个32位进程的地址限制,不会增加pga_aggregate_target的帮助。如果我们转移SGA基地址和减少SGA的2GB或更少,我们将增加可用的PGA。
使用VLM共享内存映射到内存的文件系统。共享池的访问是通过内存窗口,默认情况下,500MB大小的窗口。如果顾客使用VLM的选项,部分共享内存映射到共享内存文件系统。这可能允许较低的mapped_base的,从而有更多的PGA内存空间。
注260152.1和200266.1注中可以找到详细信息。
如果客户需要为PGA分配更多的内存资源,他们应该减少SGA的大小保持在传统的共享池。降低mapped_base的将减少每个进程的PGA大小。另外,检查,如果可能回到默认mapped_base的设置,。尝试使用hugemem内核,而不是SMP内核,这使得每一道工序,以解决更多的内存。
三)有益的文章:
note.1028623.6 SOLARIS系统:如何迁移的SGA(32位)
note.396940.1故障排除和诊断ORA-4031错误
note.233869.1诊断和解决ORA-4030错误
总结
在文件中提出的信息将帮助我们收集正确的数据调查ORA-4030/4031类型错误。这些数据应收集由OM工程师之前记录错误或通过SR至90mg/kg,以确保该问题上取得进展。
同时,顾客的期望,应正确设置。大部分时间都没有解决这些错误代码修复。发展不能再建筑师申请变更利用集合的模式,在大多数情况下,这些实际帮助的应用程序的性能。通常,它需要一些数据库和操作系统参数的调整,找到合适的内存分配的过程中完成。但它经常需要小批量的数据运行时,一切都失败了。
错误
ORA-4031,ORA-6508,ORA-4030,ORA-6510错误6508,4031错误,错误4030; 6508 ERROR 4030错误