Oracle1219ORA03135连接失去联系.docx
- 文档编号:4782391
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:10
- 大小:25.84KB
Oracle1219ORA03135连接失去联系.docx
《Oracle1219ORA03135连接失去联系.docx》由会员分享,可在线阅读,更多相关《Oracle1219ORA03135连接失去联系.docx(10页珍藏版)》请在冰豆网上搜索。
Oracle1219ORA03135连接失去联系
Oracle10g连接自动断开,报ORA-03135错误
(2010-08-2610:
41:
35)
转载▼
标签:
杂谈
分类:
oracle
转自:
/archive/2010/03/04/5344801.aspx
问题描述:
开发人员报告,用myeclipse连接oracle后,过一段时间,连接断开,报ORA-03135错误。
问题挖掘:
用pl/sql和sqlplus连接oracle,也存在该问题,确定该问题与连接方式无关。
查看服务器,发现没有防火墙,防火墙因素排除。
ping-t服务器地址,发现没有丢包,都100%收到,网络通畅。
基本可以肯定问题出在oracle参数配置上。
但也不排除其他因素。
解决过程:
根据ora-03135查询到oracle官方的解决方案:
ORA-03135:
connectionlostcontact
Cause:
1)Serverunexpectedlyterminatedorwasforcedtoterminate.
2)Servertimedouttheconnection.
Action:
1)Checkiftheserversessionwasterminated.
2)Checkifthetimeoutparametersaresetproperlyinsqlnet.ora.
查询相关资料,发现该问题可能与sqlnet.ora设置参数SQLNET.EXPIRE_TIME有关。
因此在server上面的sqlnet.ora设置参数SQLNET.EXPIRE_TIME=5(需在服务器监听reload一下使参数生效:
lsnrctlreload),而在client不设置该参数,。
等待一段时间后,没有出现该问题了,问题解决。
知识扩展:
在server端的sqlnet.ora文件中设置SQLNET.EXPIRE_TIME这一参数可以启用DCD功能,DCD是DeadConnectionDetection的缩写,用于检查死掉但没有断开的session。
例如:
SQLNET.EXPIRE_TIME=20
可以设置为任意数值,单位分钟。
重启listener
bash-2.05$lsnrctlreload
……
Thecommandcompletedsuccessfully
DCD可以用于防止防火墙的timeout。
当新连接建立的时候,会读取sqlnet.ora中的这一设定,当20分钟间隔到达时,对inactive的session发送”probe”SQL*NETpacket来确认client是否活着。
如果已经死掉,那么相对应的resource会被自动清除。
如果client和server中间有防火墙,防火墙设有timeout参数,例如设置为一个小时,当一个小时中client和server间没有数据传输的时候,防火墙会断开连接。
开启DCD后,通过设置SQLNET.EXPIRE_TIME的值小于防火墙的timeout参数可以避免这一情况。
“probe”package确保防火墙不会断开idle的session。
参考资料:
sqlnet.ora/Sqlnet.ora
oracleDCD/?
p=174
sqlnet.expire_timeandIDLE_TIME/viewspace-420407
SQLNET.EXPIRE_TIME的官方说明
Purpose
UseparameterSQLNET.EXPIRE_TIMEtospecifyathetimeinterval,inminutes,tosendaprobetoverifythatclient/serverconnectionsareactive.Settingavaluegreaterthan0ensuresthatconnectionsarenotleftopenindefinitely,duetoanabnormalclienttermination.Iftheprobefindsaterminatedconnection,oraconnectionthatisnolongerinuse,itreturnsanerror,causingtheserverprocesstoexit.Thisparameterisprimarilyintendedforthedatabaseserver,whichtypicallyhandlesmultipleconnectionsatanyonetime.
Limitationsonusingthisterminatedconnectiondetectionfeatureare:
∙Itisnotallowedonbequeathedconnections.
∙Thoughverysmall,aprobepacketgeneratesadditionaltrafficthatmaydowngradenetworkperformance.
∙Dependingonwhichoperatingsystemisinuse,theservermayneedtoperformadditionalprocessingtodistinguishtheconnectionprobingeventfromothereventsthatoccur.Thiscanalsoresultindegradednetworkperformance.
发表于2009-5-3111:
39:
33|只看该作者|倒序浏览
根据上面的链接所说的,是不是如果在D:
\oracle\ora92\network\admin\sqlnet.ora
设置
sqlnet.expire_time=1
会加重系统的负担?
?
生产库能设置这个参数吗?
各位大牛管理的生产库,有没有设置国这个参数的?
DCD起初是专为客户机没有从会话中断开联接的情况下断电的环境设计的.
DCD由服务端开始建立联接.这时候SQL*Net从参数文件中读取变量,设置一个定时器定时产生信号.这个时间间隔是sqlnet.ora文件中的SQLNET.EXPIRE_TIME提供的.
当定时器设定的时间到了之后,服务器上的SQL*Net发送一个探测包到客户端.(如果是数据库联接,目的端的服务器发送探测包到另一端).探测包是由空的SQL*Net包组成,不体现SQL*Net层任何数据,但会在下一层的网络协议中产生数据流量.
如果客户端的联接仍然是活动的,探测包被丢弃.计时装置复位.如果客户端异常断掉.服务器将收到由发送探测包的调用发出的错误.SQL*Net将会通知操作系统释放联接占用的资源.
在Unix服务器上sqlnet.ora文件必须存在$TNS_ADMIN或者$ORACLE_HOME/network/admin目录下.而不是/etc或者/var/opt/oracle
同时也应该注意,SQL*Net一个活动的孤儿进程(例如,单独的查询进程)在查询完成之前不会被杀掉.SQL*Net2.2中孤儿进程占用的资源将会被无条件释放.
这只是服务器的特性,客户端将会支持任何SQL*NetV2的发行版
协议栈的功能
虽然死联接检测是在SQL*Net层的,但要成功执行在很大程度上要依靠下层协议栈.例如,如果在sqlnet.ora文件中设置SQLNET.EXPIRE_TIME=1,但是一个孤儿进程很有可能在间隔到了之后被清除掉.
TCP/IP协议是一个面向联接的协议,同样的,这个协议在超时时执行重传数据包的操作,确保数据的安全和数据包的顺序.如果对探测包没有及时回应,TCP/IP栈将在一段时间内重传这个包.当TCP/IP放弃重传之后,SQL*Net将会收到探测失败的通知.
TCP/IP超时的时间取决于TCP/IP栈,超时很多分钟是很常见的,这个涉及到很多客户,许多协议层的重传会造成孤儿进程被杀掉之前要等很长时间.
最简单的办法检测协议栈有这个延迟需要测试不同的DCD间隔.
测试协议栈
设置参数SQLNET.EXPIRE_TIME=1min,注意清除孤儿进程需要的时间.然后设置为5min,
再次观察这个时间.如果服务器没有释放资源是由于TCP/IP超时造成的,清除影子的时间需要增加到4min.
如果TCP/IP超时重传是造成问题的所在,操作系统的内核参数应该调整一下,在Unix平台下,/usr/include/netinet/tcp_timer.h中包含着配置参数.
减小重传间隔可能会影响系统的其它部分,因为实际上减小了联接处理数据的窗口,可能会在系统重负荷的情况下丢失联接,远程慢的联接会受到这个更改的影响。
系统参数会影响超时重传的有TCP_TTL,TCPTV_PERSMIN,TCPTV_MAX,和TCP_LINGERTIME等。
********************
为了防止对系统其他进程产生影响,在调整系统参数时最好向相关的厂家咨询
*******************
监控死联接检测
检测DCD是否打开和运行正常最好的方法就是产生一个服务跟踪文件,查找DCD探测包.
要产生一个服务跟踪文件,在sqlnet.ora文件中设置TRACE_LEVEL_SERVER=16,TACE_DIRECTORY_SERVER=<路径>;,跟踪文件svr_;.trc文件会在那个目录下产生.
DCD是否打开?
在跟踪文件中查找:
osntns:
Enablingdeadconnectiondetection(1min)
时间间隔应该和SQLNET.EXPIRE_TIME的一样.
DCD是否正常工作?
在跟踪文件中应该有类似:
nstimexp:
entry
nstimexp:
timerexpiredat05-OCT-9512:
15:
05
nsdo:
entry
nsdo:
cid=0,opcode=67,*bl=0,*what=1,uflgs=0
nsdo:
nsctx:
state=8,flg=0x621c,mvd=0
nsdo:
gtn=93,gtc=93,ptn=10,ptc=2048
nsdoacts:
entry
nsdofls:
entry
nsdofls:
DATAflags:
0x0
nsdofls:
sendingNSPTDApacket
nspsend:
entry
nspsend:
plen=10,type=6
nttwr:
entry
nttwr:
socket4hadbyteswritten=10
nttwr:
exit
nspsend:
10bytestotransport
nspsendacketdump
nspsend:
000A000006000000|........|
nspsend:
0000000000000000|........|
nspsend:
normalexit
nsdofls:
exit(0)
nsdoacts:
flushingtransport
nttctl:
entry
nsdoacts:
normalexit
nsdo:
normalexit
nstimexp:
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
如果只是客户应用结束,孤儿进程的资源不会被释放,只有当客户端重启之后,DCD才是放这些资源,例如,windows应用被杀掉,客户端仍在运行,探测包可以被收到,像进程仍然活动着一样被丢掉.看起来好像DCD检测客户端机器,而不是客户端进程.
见bug#280848
DCD依靠探测包来检测联接,所以在半双工的网络协议中,这是不可能的,所以DCD在APPC/LU6.2等半双工协议下不能用.
内网联接是用BEQ协议不能支持DCD,IPC协议可以使用
DCD在协议层是很消耗资源的,所以如果要用DCD来清除死进程,会加重系统的负担,任何时候,干净的退出系统,这是首要的。
sqlnet.ora常用参数(转帖)
(2010-08-0316:
13:
52)
转载▼
标签:
it
分类:
IT技术
注﹕在修改sqlnet.ora文件之后重新启动监听﹐修改才能生效﹗﹗﹗
1.设置日志参数
#设置客户端和服务器端的log文件的目录
LOG_DIRECTORY_CLIENT
LOG_DIRECTORY_SERVER#设置客户端和服务器端的log文件的名称
LOG_FILE_CLIENT
LOG_FILE_SERVER
2.设置默认的domain,会在连接中自动追加domain
NAMES.DEFAULT_DOMAIN
如设置NAMES.DEFAULT_DOMAIN=,使用connscott/tiger@test连接数据库时会自动追加domain,变成connscott/tiger@,而直接使用connscott/tiger@
3.设置客户端的命名方法和优先级(最常用的参数),可选值有tnsnames,onames,hostname,ldap等
NAMES.DIRECTORY_PATH
4.设置允许连入数据库的客户端版本,可选值10,9,8,7
SQLNET_ALLOWED_LOGON_VERSIONS
5.设置使用何种验证方式,可选值
none(使用用户名/密码的方式连接数据库)
all(使用所有方式的验证,包括OS验证)
nts(OS验证方式,连入OS后可以不用密码连接数据库)
SQLNET.AUTHENTICATION_SERVICES
6.设置客户端和服务器是否使用加密,可选值
accepted(如果对方设置为requested或required,则使用加密服务)
rejected(不使用加密服务,即使对方设置为requested也不使用)
requested(如果对方使用加密服务,则使用加密服务)
required(使用加密服务,如果对方没有使用则无法连接)
SQLNET.ENCRYPTION_CLIENT
SQLNET.ENCRYPTION_SERVER
#设置使用的加密算法
SQLNET.ENCRYPTION_TYPES_CLIENT
SQLNET.ENCRYPTION_TYPES_SERVER
7.设置连入数据库后必须在多长时间内完成认证(如:
输入用户名/密码),超过此时间没有完成的话,数据库会断开此连接,并将客户端的IP地址和ORA-12170:
TNS:
Connecttimeoutoccurred错误信息记录到sqlnet.log,而且客户端会收到ORA-12547:
TNS:
lostcontact或ORA-12637:
Packetreceivefailed错误信息。
这个设置主要是为了防止denial-of-service攻击
SQLNET.INBOUND_CONNECT_TIMEOUT
8.设置在指定的时间间隔内必须有数据接收/发送,为了防止长时间的等待
SQLNET.RECV_TIMEOUT
SQLNET.SEND_TIMEOUT
9.限制访问数据库的客户端IP:
#允许访问的IP
TCP.INVITED_NODES=(
#不允许访问的IP
TCP.EXCLUDED_NODES=(
#检测上述参数的设置
TCP.VALIDNODE_CHECKING=yes
当不允许访问的客户端连入时,会出现下列错误
sys/assysdba
ERROR:
ORA-12537:
TNS:
connectionclosed
Warning:
YouarenolongerconnectedtoORACLE.
10.对tnsping命令进行跟踪,文件名是tnsping.trc
#trace文件的目录,默认在$ORACLE_HOME/network/trace下
TNSPING.TRACE_DIRECTORY
#trace的等级:
有off,user,admin,support4个可选值,默认是off的(不进行跟踪)
TNSPING.TRACE_LEVEL
11.设置trace参数
#设置客户端和服务器端的trace文件的目录
TRACE_DIRECTORY_CLIENT
TRACE_DIRECTORY_SERVER
#设置客户端和服务器端的trace文件的名称
TRACE_FILE_CLIENT
TRACE_FILE_SERVER
#设置客户端和服务器端的trace文件的最大大小,超过后trace信息会写入新的文件
TRACE_FILELEN_CLIENT
TRACE_FILELEN_SERVER
#设置客户端和服务器端的trace文件的最多个数,trace文件是循环写的
TRACE_FILENO_CLIENT
TRACE_FILENO_SERVER#trace的等级:
有off,user,admin,support4个可选值,默认是off的(不进行跟踪)
TRACE_LEVEL_CLIENT
TRACE_LEVEL_SERVER
#是否在trace中写入每条trace信息的dd-mon-yyyyhh:
mi:
ss:
mi时间戳
TRACE_TIMESTAMP_CLIENT
TRACE_TIMESTAMP_SERVER#trace是否只写入独立的文件:
设为off后,每个新的客户端会话的trace信息都会覆盖已有信息;设为on后,每个新的客户端会话的trace信息都会写入单独的文件
TRACE_UNIQUE_CLIENT
12.强制使用dedicated方式连接数据库
#当设置为on时,会在连接描述中自动添加(SERVER=dedicated),如果已经设置了(SERVER=shared)也会被覆盖,默认为off
USE_DEDICATED_SERVER
idle>connsys/oracle@test1assysdba
Connected.
sys@TEST>selectserverfromv$sessionwhereusername='SYS';
SERVER
---------
SHARED
在sqlnet.ora中设置了USE_DEDICATED_SERVER=on
sys@TEST>selectserverfromv$sessionwhereusername='SYS';
SERVER
---------
DEDICATED
Oracle的sqlnet.ora文件配置
博客分类:
∙数据库
转自:
/sqlnet-ora.html
DBA对这个文件一定不会陌生,大家了解最多的也一定是sqlnet.ora用来决定oracle怎么解析一个连接中出现的字符串,例如:
sqlplussys/oracle@orcl
那么这个orcl怎么解析?
如果你的sqlnet.ora这样配置的:
SQLNET.AUTHENTICATION_SERVICES=(NTS)
NAMES.DIRECTORY_PATH=(TNSNAMES,HOSTNAME)
那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例,当然我这里orcl并不是一个主机名
如果我是这个样子
NAMES.DIRECTORY_PATH=(TNSNAMES)
那么客户端就只会从tnsnames.ora查找orcl的记录
今天,我们来详细的了解一下sqlnet.ora中参数的配置以及各自的意义。
按官方文档的说法,sqlnet.ora有这么多作用:
Specifytheclientdomaintoappendtounqualifiednames
Prioritizenamingmethods
Enableloggingandtracingfeatures
Routeconnectionsthroughspecificprocesser
Configureparametersforexternalnaming
ConfigureOracleAdvancedSecurity
Useprotocol-specificparameterstorestrictaccesstothedatabase
重要参数及解释:
1.BEQUEATH_DETACH
控制unix系统中signalhandling的开关,默认是no,即signalhandling打开。
2.DEFAULT_SDU_SIZE
指定sessiondataunit(SDU)的大小,单位是bytes,建议在client端和server端都设置这个参数,确保链接的时候使用相同的SDUsize,如果client端和server端配置的值不匹配会使用较小的。
3.LOG_DIRECTORY_CLIENT/LOG_DIRECTORY_SERVER
指定客户端/server端log日志文件的位置
设定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle1219ORA03135 连接 失去 联系