分享
 
 
 

分析和解决ora-4030错误

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

分析和解决ora-4030错误

ORA-4030意味着什么?

这个错误意味着Oracle服务器进程不能从操作系统获得更多的内存。这里的内存指的是PGA(程序全局区)以及由配置决定的它的子项。对于专用的服务器进程,内存包括堆栈区、UGA(用户全局区)。UGA包括用户会话数据、游标信息和排序区。在多线程配置中(共享服务器),UGA处于SGA(系统全局区)中,它不会造成ora-4030错误。

因此,ora-4030意味着进程需要更多的内存(堆栈、UGA或者PGA)来执行它的工作。

是什么引起了这个错误?

这个错误表示操作系统不能分配足够的内存。这个错误可能是你的进程本身引起的,例如你的进程需要太多的内存,或者其它的原因引起操作系统内存枯竭,例如SGA区分得太大或者太多的进程竞争系统虚拟内存(物理内存+交换分区)。许多操作系统会限制某个进程获得的内存以保证系统稳定。

请按以下步骤检查你的系统:

· 是否仍有足够的内存供分配?

· 操作系统是否有限制?

· Oracle数据库是否有限制?

· 哪一个进程需要过多的内存?

· 如何收集那个(需要过多内存的)进程正在做什么的信息?

这些将在下一节里讨论。

进一步讨论主题:

· 避免此类错误的一般建议

· 参考

是否仍有足够的内存供分配?

要回答这个问题,我们需要使用操作系统特定的工具来检测内存使用情况。

1.OpenVMS系统:显示那些能告诉你物理内存和页面文件使用情况的信息。

PhysicalMemoryUsage(pages):

Total Free InUse Modified MainMemory(256.00Mb) 32768 24849 7500 419

……

PagingFileUsage(blocks):

FreeReservableTotal

DISK$BOBBIEAXPSYS:[SYS0.SYSEXE]SWAPFILE.SYS3072030720 39936DISK$BOBBIEAXPSYS:[SYS0.SYSEXE]PAGEFILE.SYS2261 60201088 249984DISK$BOBBIE_USER3:[SYS0.PAGEFILE]PAGEFILE.SYS462224405296499968

作为一般的原则,页面文件中的空闲容量总量应该不低于总容量的一半。交换文件应该几乎不使用,空闲的容量应该几乎和总容量一样。

1.Windows系统:在任务治理器中查看内存使用情况。

2.Unix系统:每一个Unix系统都有自己的工具来检测全部内存的使用情况,例如top,vmstat…..,并且每一个系统都有所不同。

o top常用来显示物理内存和交换空间的情况。

o swapon–s显示交换空间使用情况

o vmstat显示空闲物理内存情况

SampletopoutputonLinux:

在Linux上“top”的输出例子:

top-10:17:09up1:27,4users,loadaverage:0.07,0.12,0.05

Tasks:110total,4running,105sleeping,0stopped,1zombie

Cpu(s):0.3%user,1.6%system,0.0%nice,98.0%idle

Mem:1033012ktotal,452520kused,580492kfree,59440kbuffers

Swap:1052248ktotal,0kused,1052248kfree,169192kcached

.....

假如有足够的内存,那么请检查一下是否操作系统有强制限制。假如内存被耗尽了,我们就要找出这些内存被用在了哪里。

操作系统是否有限制?

假如仍有充足的虚拟内存剩余,可能是我们不能使用申请使用的那部分内存。请检查操作系统是否有限制。

1.OpenVMS系统:要检查你能使用的物理内存的总量,请检查工作(页面)区配额(workingsetquotas)和页面文件配额(pagefilequota)。请查询OpenVMS使用指南确定配额情况和如何修改它们。根据使用进程的不同以及启动它们方式的不同,配额使用将不同于oracle的统计。Process/id=<processid>/quota将显示对于一个特定的进程还有多少剩余配额可使用。

UAF>showoracle7

Username:ORACLE7Owner:Oracle7DBA

Account:SUPPORTUIC:[200,2]([SUPPORT,ORACLE7])

CLI:DCLTables:DCLTABLES

Default:DISK$BOBBIE_USER1:[ORACLE7]

LGICMD:LOGINFlags:

Primarydays:MonTueWedThuFri

Secondarydays:SatSun

NoAccessrestrictions

Expiration:(none)Pwdminimum:6LoginFails:0

Pwdlifetime:(none)Pwdchange:3-DEC-199715:38

LastLogin:27-MAY-200314:54(interactive),26-MAY-200316:15(non-interactive)

Maxjobs:0Fillm:1200Bytlm:180000

Maxacctjobs:0Shrfillm:0Pbytlm:0

Maxdetach:0BIOlm:500JTquota:8192

Prclm:20DIOlm:500WSdef:2500

Prio:4ASTlm:4000WSquo:4096

Queprio:0TQElm:4000WSextent:30000

CPU:(none)Enqlm:18000Pgflquo:750000

AuthorizedPrivileges:.....

$shoproc/id=20200139/quota

24-JUN-200312:30:54.39User:ORACLE7ProcessID:20200139

Node:BOBBIEProcessname:"ORA_BOB901_PMON"

ProcessQuotas:

Accountname:SUPPORT

CPU limit:InfiniteDirectI/Olimit:100

BufferedI/Obytecountquota:9994816BufferedI/Olimit:100

Timerqueueentryquota:99Openfilequota:29997

Pagingfilequota:145968Subprocessquota:10

Defaultpagefaultcluster:64ASTquota:496

Enqueuequota:49995Sharedfilelimit:0

Maxdetachedprocesses:0Maxactivejobs:0

2.Windows系统:在微软的windows操作系统上,oracle进程集作为一个进程的许多线程来运行。

地址空间不能超过2GB(包括堆栈、PGA、SGA)。这个限制可以突破到3GB或更高。(请看oracle文档<NOTE:46001.1>)。关于oracle数据库和WindowsNT内存结构的情况,请查询技术公告板。Oracle进程使用的总的内存情况(不包括进程堆栈和代码)可以用query查看。

3.Unix系统:使用内置的shell命令:limit/ulimit。注重那些unlimited的不一定意味着无限制,而是可能有着老系统的限制,例如2GB。

Linux系统上输出的一个例子:

aroelant@aroelant-be:~>ulimit-a

corefilesize(blocks,-c)0

datasegsize(kbytes,-d)unlimited

filesize(blocks,-f)unlimited

maxlockedmemory(kbytes,-l)unlimited

maxmemorysize(kbytes,-m)unlimited

openfiles(-n)1024

pipesize(512bytes,-p)8

stacksize(kbytes,-s)unlimited

cputime(seconds,-t)unlimited

maxuserprocesses(-u)7168

virtualmemory(kbytes,-v)unlimited

有可能是内存限制定得太小了,需要增大它。也可能是我们需索得太多

Oracle数据库是否有限制?

从oracle9i以后,有一个参数决定一个oracle实例可以分配到PGA总量。<Note:223730.1>"AutomaticPGAMemoryManagmentin9i"提供了更多关于这方面的信息。下面的查询可以用来找出分配给所有会话的PGA区域的内存总量。

SQL>selectsum(value)/1024/1024Mbfromv$sesstats,v$statnamen

Wheren.STATISTIC#=s.STATISTIC#andname=’sessionpgamemory’;

哪一个进程需要过多的内存? 某些操作需要大量的内存例如巨大PL/SQL表或者大量的排序操作。在这种情况下,在返回ora-4030错误之前进程将运行一段时间。希望我们可以找出内存被分配给哪个进程以及为什么被分配。你可以使用如下的查询查出oracle数据库PGA和UGA的运行情况。

SQL>colnameformata30SQL>selectsid,name,valuefromv$statnamen,v$sesstats

wheren.STATISTIC#=s.STATISTIC#andnamelike'session%memory%'orderby3asc;

这个查询将显示列表中的对内存“饥饿”的进程。从操作系统角度来看,确定进程的内存使用量也是一个好主意。总之,不大可能是oracle数据库的服务器进程使用了过多的内存。一般地,对于服务器进程来说,oracle数据库和操作系统之间或多或少的可以就内存的使用达成一致。下面的命令答应你从操作系统的角度找出进程的内存使用量。

1.OpenVMS系统:“showsystem”命令给出进程和资源的使用情况的概览。那些频繁调用页面失败的进程经常消耗了大量的虚拟内存。“page”列指出物理内存的使用情况。“showprocess/continious”(原文如此,我怀疑是continuous)命令则给出物理内存(工作页面区)和虚拟内存的使用情况。

$showsystem/page

OpenVMSV7.2-1onnodeBOBBIE13-JUN-200309:56:30.44Uptime1718:58:18

PidProcessNameStatePriI/OCPUPagefltsPages

20200101SWAPPERHIB160000:00:02.4500

20200106CLUSTER_SERVERHIB13104000:00:00.0387104

20200107CONFIGUREHIB1021000:00:00.067717

$shoprocess/id=xxx/cont:

ProcessAROELANT10:00:53

StateCURWorkingset131

Cur/basepriority6/4Virtualpages11714

CurrentPC800D9B28CPUtime000:00:01.28

CurrentPSL00000003DirectI/O178

CurrentuserSP7A5227F0BufferedI/O962

PID20200469Pagefaults1312

UIC [SUPPORT,AROELANT]EventflagsC0000003C0000000

2.Windows系统:对于微软的windows操作系统来说,oracle进程集作为一个进程的许多线程来运行。

到目前为止,我还没有找到一个方法来查看某个线程的内存使用情况。然而我们可以检查出oracle是否对操作系统分配的内存感到满足。从操作系统的角度来看,我们可以使用任务治理器。调出任务治理器,点击“查看”按钮,选择“选择列”,在弹出的窗口中在“虚拟内存大小”前打上勾。oracle.exe进程使用的虚拟内存大小( VMsize)应该和SGA、PGA和进程堆栈以及代码使用的内存总量相匹配。下面的查询命令可以给出oracle使用的内存量,然而,这不包括进程堆栈以及代码使用的内存量。

selectsum(bytes)/1024/1024Mbfrom(selectbytesfromv$sgastatunionselectvaluebytesfromv$sesstats,v$statnamenwheren.STATISTIC#=s.STATISTIC#andn.name='sessionpgamemory');MB

----------517.296406

在我的系统上,任务治理器中显示的虚拟内存大小比上面的查询出的内存使用量多大约30MB。当你确认是oracle使用了这个内存,这个查询将给出哪一个会话用得最多。

3.Unix系统:“top”工具是一个很有用的工具,你能够定制显示和排序的列。“ps”命令在大多数系统中可以使用,但也有些不能。例如,在Linux上,“ps-AF--sortresident”将列出所有的进程最近的最大常驻内存集(residentset)(注二)。你也可参考<Note:174555.1>"UNIX:DeterminingtheSizeofanOracleProcess".

如何收集那个(需要过多内存的)进程正在做什么的信息?

本节将只讨论oracle服务器进程。使用前面几节介绍的方法,你应该可以判定一个或多个oracle服务器进程造成了内存资源的枯竭。记住并不总是由于进程造成了内存资源的枯竭从而导致ORA-4030错误。这个错误仅仅意味着进程不能获得它需要的内存资源。

假如进程不断增长对内存的需求,我们可以在它运行的时候查看一下它的情况。

o 你可以用下面的查询语句在v$sql_area表中查询有什么进程正在执行中。

SQL>selectsql_textfromv$sql_areaa,v$sessions

wherea.address=s.sql_addressands.sid=<SID>;

o We can force a heapdump and have it examined by oracle support services。(这句不知如何译)

SQL>oradebugunlimitSQL>oradebugsetorapid10(这是对应 oraclepid,用“setospid”对应操作系统的进程id)SQL>oradebugdumpheapdump7

假如问题不再发生,或者某些进程太快而不能作这样的检查,很有可能这就是引起内存枯竭的原因。我们可以在这个进程引起这个错误时使用事件集来获得一个 heapdump.

SQL>altersessionsetevents'4030tracenameheapdumplevel25';

或者在数据库的init.ora文件中设置这个事件。<Note:21234.1>EVENT:10261"LimitthesizeofthePGAheap" 这个dump能帮助OracleSupport分析并找出引起过多的内存分配的原因。

对于如何避免这个错误的一般建议。

o 正如前面提到的一样,某些操作会需要大量的内存。对于排序操作来说,减少SORT_AREA_SIZE可能有所帮助。Oracle服务器进程会在PGA中分配排序操作需要的SORT_AREA_SIZE字节。假如完成某个查询需要过多的内存,服务器进程将会使用临时段。这意味着,当查询需要大量的排序操作时,更少的SORT_AREA_SIZE可以使得执行更紧凑。

o 对于9i或更高版本的oracle数据库,可以设备参数WORKAREA_SIZE_POLICY为AUTO来打开自动SQLexecution内存治理功能,也可以在初始化文件中指定PGA_AGGREGATE_TARGET的大小。

<Note:262946.1>"PerformanceIssuesAfterIncreasingWorkload",<Note:223730.1>"AutomaticPGAMemoryManagmentin9i",<Note:223299.1>"TopOracle9iinit.oraParametersAffectingPerformance"

o PL/SQL例程也可能会需要大量内存,因此有必要在你的应用程序中重写这部分查询代码。假如某个PL/SQL表经常被使用,它确实会在PGA中分配一块内存。

o 再看一下优化策略,由于排序操作可能某些访问路径会需要太多的内存,函数调用返回过多的行等等……

o 在某些操作系统上,例如Microsoftwindows,SGA的大小应该降低,以便于PGA获得更大的内存。

o 确信你的操作系统和oracle数据库的内存限制是适度的。

o 确信有足够的内存(物理内存和交换空间)。

参考

General:

<Note:237899.1>ResolvingORA-4030ErrorsAfterUpgrading

NT:

<Note:116076.1>TacklingORA-4030onWindowsNT

<Note:46001.1>OracleDatabaseandtheWindowsNTmemoryarchitecture,TechnicalBulletin

Unix:

<Note:199746.1>HowtoResolveORA-4030ErrorsonUNIX(unixspecificbutgeneralenoughforsomesuggestions)

UNIX:DeterminingtheSizeofanOracleProcess

VMS:

<Note:67033.1>Backgroundprocessquotas<Note:68663.1>Dedicatedserverprocessquotas(SQL*NetV2.3.3,V8.0.X)<Note:70671.1>ProcessquotasforBequeathconnections(V7,V8)<Note:68849.1>Bequeathlistenerprocessquotas(V7,V8)<Note:68226.1>Listenerprocessquotas(SQL*NetV2.3.3,V8.0.X)

@Internal:

@<Note:21234.1>EVENT:10261"LimitthesizeofthePGAheap"

@Thiseventisveryusefull.ItwillcausetheprocesstodumpinformationwhenthePGAgrowsabovethespecifiedlimit

本人注一:工作(页面)区(workingset):1.为避免过多的调页所必须激活的用户页面的集合。2.为避免系统失效,调页所需要的实存容量。

本人注二:常驻内存集(residentset):在虚存系统中,任一时候都存在于主存储器内的某个程序的页面 或程序段的全部。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有