Oracle20111219ORA03135连接失去联系

上传人:工**** 文档编号:486289875 上传时间:2022-11-16 格式:DOCX 页数:13 大小:32.35KB
返回 下载 相关 举报
Oracle20111219ORA03135连接失去联系_第1页
第1页 / 共13页
Oracle20111219ORA03135连接失去联系_第2页
第2页 / 共13页
Oracle20111219ORA03135连接失去联系_第3页
第3页 / 共13页
Oracle20111219ORA03135连接失去联系_第4页
第4页 / 共13页
Oracle20111219ORA03135连接失去联系_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《Oracle20111219ORA03135连接失去联系》由会员分享,可在线阅读,更多相关《Oracle20111219ORA03135连接失去联系(13页珍藏版)》请在金锄头文库上搜索。

1、Oracle10g连接自动断开,报ORA-03135错误(2010-08-2610:41:35)转自:问题描述:开发人员报告,用myeclipse连接oracle后,过一段时间,连接断开,报ORA-03135错误。问题挖掘:用pl/sql和sqlplus连接oracle,也存在该问题,确定该问题与连接方式无关。查看服务器,发现没有防火墙,防火墙因素排除。ping-t服务器地址,发现没有丢包,都100%收到,网络通畅。基本可以肯定问题出在oracle参数配置上。但也不排除其他因素。解决过程:根据ora-03135查询到oracle官方的解决方案:ORA-03135:connectionlostc

2、ontactCause:1)Serverunexpectedlyterminatedorwasforcedtoterminate.2)Servertimedouttheconnection.Action:1)Checkiftheserversessionwasterminated.2)Checkifthetimeoutparametersaresetproperlyinsqlnet.ora.查询相关资料,发现该问题可能与sqlnet.ora设置参数SQLNET.EXPIRE_TIME有关。因此在server上面的sqlnet.ora设置参数SQLNET.EXPIRE_TIME=5(需在服务器监

3、听reload一下使参数生效:lsnrctlreload),而在client不设置该参数,。等待一段时间后,没有出现该问题了,问题解决。知识扩展:在server端的sqlnet.ora文件中设置SQLNET.EXPIRE_TIME这一参数可以启用DCD功能,DCD是DeadConnectionDetection的缩写,用于检查死掉但没有断开的session例如:SQLNET.EXPIRE_TIME=20可以设置为任意数值,单位分钟。重启listenerbash-2.05$lsnrctlreloadThecommandcompletedsuccessfullyDCD可以用于防止防火墙的timeo

4、ut。当新连接建立的时候,会读取sqlnet.ora中的这一设定,当20分钟间隔到达时,对inactive的session发送probeSQL*NETpacket来确认client是否活着。如果已经死掉,那么相对应的resource会被自动清除。如果client和server中间有防火墙,防火墙设有timeout参数,例如设置为一个小时,当一个小时中client和server间没有数据传输的时候,防火墙会断开连接。开启DCD后,通过设置SQLNET.EXPIRE_TIME的值小于防火墙的timeout参数可以避免这一情况。probepackage确保防火墙不会断开idle的session。参考

5、资料:sqlnet.oraoracleDCDsqlnet.expire_timeandIDLE_TIMESQLNET.EXPIRE_TIME的官方说明PurposeUseparameterSQLNET.EXPIRE_TIMtoEspecifyathetimeinterval,inminutes,tosendaprobetoverifythatclient/serverconnectionsareactive.Settingavaluegreaterthan0ensuresthatconnectionsarenotleftopenindefinitely,duetoanabnormalclien

6、ttermination.Iftheprobefindsaterminatedconnection,oraconnectionthatisnolongerinuse,itreturnsanerror,causingtheserverprocesstoexit.Thisparameterisprimarilyintendedforthedatabaseserver,whichtypicallyhandlesmultipleconnectionsatanyonetime.Limitationsonusingthisterminatedconnectiondetectionfeatureare:It

7、isnotallowedonbequeathedconnections.Thoughverysmall,aprobepacketgeneratesadditionaltrafficthatmaydowngradenetworkperformance.Dependingonwhichoperatingsystemisinuse,theservermayneedtoperformadditionalprocessingtodistinguishtheconnectionprobingeventfromothereventsthatoccur.Thiscanalsoresultindegradedn

8、etworkperformance.发表于2009-5-3111:39:33|根据上面的链接所说的,是不是如果在D:oracleora92networkadminsqlnet.ora设置sqlnet.expire_time=1会加重系统的负担?生产库能设置这个参数吗?各位大牛管理的生产库,有没有设置国这个参数的?DCD起初是专为客户机没有从会话中断开联接的情况下断电的环境设计的.DCD由服务端开始建立联接.这时候SQL*Net从参数文件中读取变量,设置一个定时器定时产生信号.这个时间间隔是sqlnet.ora文件中的SQLNET.EXPIRE_TIME提供的.当定时器设定的时间到了之后,服务器

9、上的SQL*Net发送一个探测包到客户端.(如果是数据库联接,目的端的服务器发送探测包到另一端).探测包是由空的SQL*Net包组成,不体现SQL*Net层任何数据,但会在下一层的网络协议中产生数据流量.如果客户端的联接仍然是活动的,探测包被丢弃.计时装置复位.如果客户端异常断掉.服务器将收到由发送探测包的调用发出的错误.SQL*Net将会通知操作系统释放联接占用的资源.在Unix服务器上sqlnet.ora文件必须存在$TNS_ADMIN或者$ORACLE_HOME/network/admin目录下.而不是/etc或者/var/opt/oracle同时也应该注意,SQL*Net一个活动的孤儿

10、进程(例如,单独的查询进程)在查询完成之前不会被杀掉.SQL*Net2.2中孤儿进程占用的资源将会被无条件释放.这只是服务器的特性,客户端将会支持任何SQL*NetV2的发行版协议栈的功能虽然死联接检测是在SQL*Net层的,但要成功执行在很大程度上要依靠下层协议栈.例如,如果在sqlnet.ora文件中设置SQLNET.EXPIRE_TIME=1,但是一个孤儿进程很有可能在间隔到了之后被清除掉.TCP/IP协议是一个面向联接的协议,同样的,这个协议在超时时执行重传数据包的操作,确保数据的安全和数据包的顺序.如果对探测包没有及时回应,TCP/IP栈将在一段时间内重传这个包.当TCP/IP放弃重

11、传之后,SQL*Net将会收到探测失败的通知.TCP/IP超时的时间取决于TCP/IP栈,超时很多分钟是很常见的,这个涉及到很多客户,许多协议层的重传会造成孤儿进程被杀掉之前要等很长时间.最简单的办法检测协议栈有这个延迟需要测试不同的DCD间隔.测试协议栈设置参数SQLNET.EXPIRE_TIME=1min,注意清除孤儿进程需要的时间.然后设置为5min,再次观察这个时间.如果服务器没有释放资源是由于TCP/IP超时造成的,清除影子的时间需要增加到4min.如果TCP/IP超时重传是造成问题的所在,操作系统的内核参数应该调整一下,在Unix平台下,/usr/include/netinet/t

12、cp_timer.h中包含着配置参数.减小重传间隔可能会影响系统的其它部分,因为实际上减小了联接处理数据的窗口,可能会在系统重负荷的情况下丢失联接,远程慢的联接会受到这个更改的影响。系统参数会影响超时重传的有TCP_TTL,TCPTV_PERSMIN,TCPTV_MAX,和TCP_LINGERTIME等。*为了防止对系统其他进程产生影响,在调整系统参数时最好向相关的厂家咨询*监控死联接检测检测DCD是否打开和运行正常最好的方法就是产生一个服务跟踪文件,查找DCD探测包.要产生一个服务跟踪文件,在sqlnet.ora文件中设置TRACE_LEVEL_SERVER=16,TACE_DIRECTOR

13、Y_SERVER=;,跟踪文件svr_;.trc文件会在那个目录下产生.DCD是否打开?在跟踪文件中查找:osntns:Enablingdeadconnectiondetection(1min)时间间隔应该和SQLNET.EXPIRE_TIME的一样.DCD是否正常工作?在跟踪文件中应该有类似:nstimexp:entrynstimexp:timerexpiredat05-OCT-9512:15:05nsdo:entrynsdo:cid=0,opcode=67,*bl=0,*what=1,uflgs=0nsdo:nsctx:state=8,flg=0x621c,mvd=0nsdo:gtn=93

14、,gtc=93,ptn=10,ptc=2048nsdoacts:entrynsdofls:entrynsdofls:DATAflags:0x0nsdofls:sendingNSPTDApacketnspsend:entrynspsend:plen=10,type=6nttwr:entrynttwr:socket4hadbyteswritten=10nttwr:exitnspsend:10bytestotransportnspsendacketdumpnspsend:000A000006000000|nspsend:0000000000000000|nspsend:normalexitnsdof

15、ls:exit(0)nsdoacts:flushingtransportnttctl:entrynsdoacts:normalexitnsdo:normalexitnstimexp:normalexit其中nspsend:000A000006000000|nspsend:0000000000000000|代表探测包,是由10个字节组成,当协议头和尾被加上后,这个包大概有70个字节长,如果DCD是打开的,当定时器的时间到了之后,在跟踪文件里会看到探测包.在Unix系统下,可以用:tail-fsvr_;.trc查看.了解DCD的问题和局限在很少的问题报告中,最值得注意的是DCD在windosNT下很差的性能,死联接只有在服务起重启或者数据库重启的情况下被清除.DCD在NT下怎样正确的工作依靠客户端的协议.SQL*Netv2.3比其他发行版改进了一些性能。见bug#303578在SCOUnix下,有个问题是当DCD定时器到时后,服务进程死循环,消耗了大量的CPU资源,这个问题是由于不正确的信号处理造成的,可以禁止DCD来解决见bug#293264如果只是客户应用结束,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号