Oracle10g连接自动断开,报ORA-03135错误
(2010-08-26 10:41:35)
转载▼
标签:
杂谈
分类: oracle
转自:blog.csdn/rudyMatrix/archive/2010/03/04/5344801.aspx
问题描述:
开发人员报告,用myeclipse连接oracle后,过一段时间,连接断开,报ORA-03135错误。
问题挖掘:
用pl/sql和sqlplus连接oracle,也存在该问题,确定该问题与连接方式无关
查看服务器,发现没有防火墙,防火墙因素排除。
ping -t 服务器地址,发现没有丢包,都100%收到,网络通畅。
基本可以肯定问题出在oracle参数配置上。但也不排除其他因素。
解决过程:
根据ora-03135查询到oracle官方的解决方案:
ORA-03135: connection lost contact
Cause: 1) Server unexpectedly terminated or was forced to terminate.
      2) Server timed out the connection.
Action: 1) Check if the server session was terminated.
      2) Check if the timeout parameters are set properly a.
    查询相关资料,发现该问题可能与a设置参数SQLNET.EXPIRE_TIME 有关。因此server上面的a设置参数SQLNET.EXPIRE_TIME = 5(需在服务器监听reload一下使参数生效:lsnrctl reload),而在client不设置该参数,。等待一段时间后,没有出现该问题了,问题解决。
知识扩展:
在server端的a文件中设置SQLNET.EXPIRE_TIME这一参数可以启用DCD功能,DCD是Dead Connection Detection的缩写,用于检查死掉但没有断开的session。

例如:
SQLNET.EXPIRE_TIME = 20
可以设置为任意数值,单位分钟。
重启listener
bash-2.05$ lsnrctl reload
……
The command completed successfully
DCD可以用于防止防火墙的timeout。
当新连接建立的时候,会读取a中的这一设定,当20分钟间隔到达时,对inactive的session发送”probe” SQL*NET packet来确认client是否活着。如果已经死掉,那么相对应的resource会被自动清除。
如果client和server中间有防火墙,防火墙设有timeout参数,例如设置为一个小时,当一个小时中client和server间没有数据传输的时候,防火墙会断开连接。开启DCD后,通过设置SQLNET.EXPIRE_TIME的值小于防火墙的timeout参数可以避免这一情况。 “probe” package确保防火墙不会断开idle的session。
参考资料:
a afaq/a
oracle DCD  www.dbafan/blog/?p=174
pire_time and IDLE_TIME space.itpub/10687595/viewspace-420407
SQLNET.EXPIRE_TIME 的官方说明
Purpose
Use parameter SQLNET.EXPIRE_TIME to specify a the time interval, in minutes, to send a probe to verify that client/server connections are active. Setting a value greater than 0 ensures that connections are not left open indefinitely, due to an abnormal client termination. If the probe finds a terminated connection, or a connection that is no longer in use, it returns an error, causing the server process to exit. This parameter is primarily intended for the database server, which typically handles multiple connections at any one time.
Limitations on using this terminated connection detection feature are:
∙ It is not allowed on bequeathed connections.
∙ Though very small, a probe packet generates additional traffic that may downgrade network performance.
∙ Depending on which operating system is in use, the server may need to perform additional processing to distinguish the connection probing event from other events that occur. This can also result in degraded network performance.
发表于 2009-5-31 11:39:33 |只看该作者 |倒序浏览
oracle.**/exploiture/398192.html

根据上面的链接所说的,是不是如果在D:\oracle\ora92\network\a
设置
pire_time = 1

会加重系统的负担??
生产库能设置这个参数吗?各位大牛管理的生产库,有没有设置国这个参数的?


    DCD 起初是专为 客户机没有从会话中断开联接的情况下断电的环境设计的.

    DCD由服务端开始建立联接. 这时候SQL*Net 从参数文件中读取变量, 设置一个定时器定时产生信号. 这个时间间隔是a文件中的SQLNET.EXPIRE_TIME提供的.
   
    当定时器设定的时间到了之后, 服务器上的SQL*Net 发送一个探测包到客户端.(如果是数据库联接, 目的端的服务器发送探测包到另一端). 探测包是由空的SQL*Net包组成, 不体现SQL*Net层任何数据, 但会在下一层的网络协议中产生数据流量.

    如果客户端的联接仍然是活动的, 探测包被丢弃. 计时装置复位. 如果客户端异常断掉. 服务器将收到由发送探测包的调用发出的错误. SQL*Net 将会通知操作系统释放联接占用的资源.

    在Unix服务器上 a 文件必须存在$TNS_ADMIN 或者 $ORACLE_HOME/network/admin目录下.  而不是/etc 或者 /var/opt/oracle

    同时也应该注意, SQL*Net 2.1.x中 一个活动的孤儿进程(例如, 单独的查询进程) 在查询完成之前不会被杀掉. SQL*Net 2.2中孤儿进程占用的资源将会被无条件释放.

    这只是服务器的特性,  客户端将会支持任何SQL*Net V2 的发行版
sql连接不上服务器   
    协议栈的功能
   
    虽然死联接检测是在SQL*Net层的, 但要成功执行在很大程度上要依靠下层协议栈. 例如, 如果在a文件中 设置SQLNET.EXPIRE_TIME=1, 但是一个孤儿进程很有可能在间隔到了之后被清除掉.

    TCP/IP协议是一个面向联接的协议, 同样的, 这个协议在超时时执行重传数据包的操作, 确保数据的安全和数据包的顺序. 如果对探测包没有及时回应, TCP/IP栈将在一段时间内重传这个包. 当TCP/IP放弃重传之后, SQL*Net 将会收到 探测失败的通知.

    TCP/IP超时的时间取决于 TCP/IP栈,  超时很多分钟是很常见的, 这个涉及到很多客户, 许多协议层的重传会造成孤儿进程被杀掉之前要等很长时间.

    最简单的办法检测协议栈有这个延迟需要测试不同的DCD间隔.
   
    测试协议栈
   
    设置参数SQLNET.EXPIRE_TIME = 1 min, 注意清除孤儿进程需要的时间. 然后设置为 5min,
    再次观察这个时间. 如果服务器没有释放资源是由于TCP/IP超时造成的, 清除影子的时间需要增加到4min.
    如果TCP/IP超时重传是造成问题的所在, 操作系统的内核参数应该调整一下, 在Unix平台下, /usr/include/netinet/tcp_timer.h 中包含着配置参数.

    减小重传间隔可能会影响系统的其它部分, 因为实际上减小了联接处理数据的窗口, 可能会在系统重负荷的情况下丢失联接, 远程慢的联接会受到这个更改的影响。

    系统参数会影响超时重传的有 TCP_TTL, TCPTV_PERSMIN, TCPTV_MAX, 和 TCP_LINGERTIME等。
    ********************
    为了防止对系统其他进程产生影响, 在调整系统参数时最好向相关的厂家咨询
    *******************
监控死联接检测
   
    检测DCD是否打开和运行正常最好的方法就是 产生一个服务跟踪文件, 查 DCD探测包.

    要产生一个服务跟踪文件, 在a文件中设置TRACE_LEVEL_SERVER=16, TACE_DIRECTORY_SERVER=<路径>;, 跟踪文件svr_;.trc文件会在那个目录下产生.
   
    DCD 是否打开?
    在跟踪文件中查:
    osntns: Enabling dead connection detection (1 min) 
    时间间隔应该和SQLNET.EXPIRE_TIME的一样.
    DCD是否正常工作?

  在跟踪文件中应该有类似:

nstimexp: entry
nstimexp: timer expired at 05-OCT-95 12: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: DATA flags: 0x0
nsdofls: sending NSPTDA packet
nspsend: entry
nspsend: plen=10, type=6
nttwr: entry
nttwr: socket 4 had bytes written=10
nttwr: exit
nspsend: 10 bytes to transport
nspsendacket dump
nspsend:00 0A 00 00 06 00 00 00  |........|
nspsend:00 00 00 00 00 00 00 00  |........|
nspsend: normal exit
nsdofls: exit (0)
nsdoacts: flushing transport
nttctl: entry
nsdoacts: normal exit
nsdo: normal exit
nstimexp: normal exit

其中

nspsend:00 0A 00 00 06 00 00 00  |........|
nspsend:00 00 00 00 00 00 00 00  |........|


    代表探测包, 是由10个字节组成, 当协议头和尾被加上后, 这个包大概有70个字节长,
    如果DCD是打开的, 当定时器的时间到了之后, 在跟踪文件里会看到探测包. 在Unix系统下, 可以用:
    tail -f svr_;.trc 查看.
   
    了解DCD的问题和局限
   
    在很少的问题报告中, 最值得注意的是DCD在windosNT下很差的性能, 死联接只有在服务起重启或者数据库重启的情况下被清除. DCD在NT下怎样正确的工作依靠客户端的协议. SQL*Net v2.3 比其他发行版改进了一些性能。
    见bug#303578
   
    在SCO Unix下, 有个问题是 当DCD定时器到时后, 服务进程死循环, 消耗了大量的CPU资源, 这个问题是由于不正确的信号处理造成的,  可以禁止DCD来解决
    见bug#293264
    如果只是客户应用结束, 孤儿进程的资源不会被释放, 只有当客户端重启之后, DCD才是放这些资源, 例如, windows应用被杀掉, 客户端仍在运行, 探测包可以被收到, 像进程仍然活动着一样被丢掉. 看起来好像DCD检测客户端机器, 而不是客户端进程.
    见bug#280848
   
    DCD依靠探测包来检测联接, 所以在半双工的网络协议中, 这是不可能的, 所以DCD在APPC/LU6.2 等半双工协议下不能用.
   
    内网联接是用BEQ协议不能支持DCD, IPC协议可以使用
   
    DCD 在协议层是很消耗资源的, 所以如果要用DCD来清除死进程, 会加重系统的负担, 任何时候, 干净的退出系统, 这是首要的。
a常用参数(转帖)
(2010-08-03 16:13:52)
转载▼
标签:
it
分类: IT技术
注﹕在修改a文件之后重新启动监听﹐修改才能生效﹗﹗﹗
1.设置日志参数
#设置客户端和服务器端的log文件的目录
LOG_DIRECTORY_CLIENT
LOG_DIRECTORY_SERVER#设置客户端和服务器端的log文件的名称
LOG_FILE_CLIENT
LOG_FILE_SERVER
2.设置默认的domain,会在连接中自动追加domain
NAMES.DEFAULT_DOMAIN
如设置NAMES.DEFAULT_DOMAIN=us.acme,使用conn scott/tiger@test连接数据库时会自动追加domain,变成conn scott/tiger@test.us.acme,而直接使用conn scott/tiger@test.us.acme连接数据库则不会追加
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:Connect timeout occurred错误信息记录到sqlnet.log,而且客户端会收到ORA-12547: TNS:lost cont
act或ORA-12637: Packet receive failed错误信息。这个设置主要是为了防止denial-of-service攻击
SQLNET.INBOUND_CONNECT_TIMEOUT
8.设置在指定的时间间隔内必须有数据接收/发送,为了防止长时间的等待
SQLNET.RECV_TIMEOUT
SQLNET.SEND_TIMEOUT
9.限制访问数据库的客户端IP:
#允许访问的IP
TCP.INVITED_NODES=(192.168.1.103)
#不允许访问的IP
TCP.EXCLUDED_NODES=(192.168.1.102)
#检测上述参数的设置
TCP.VALIDNODE_CHECKING=yes
当不允许访问的客户端连入时,会出现下列错误
sys/st as sysdba
ERROR:
ORA-12537: TNS:connection closed
Warning: You are no longer connected to ORACLE.
10.对tnsping命令进行跟踪,文件名是
#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-yyyy hh:mi:ss:mi时间戳
TRACE_TIMESTAMP_CLIENT
TRACE_TIMESTAMP_SERVER#trace是否只写入独立的文件:设为off后,每个新的客户端会话的trace信息都会覆盖已有信息;设为on后,每个新的客户端会话的trace信息都会写
入单独的文件
TRACE_UNIQUE_CLIENT

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。