plsql、dblink连接Oracle数据库长时间空闲后自动断开及远程终端连接linux空闲超时后自动断开问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lk_db/article/details/51424300
一、plsql及dblink连接Oracle数据库长时间空闲后自动断开
现象:
1、plsql连接数据库长时间空闲后自动断开
2、使用dblink访问数据,长时间空闲后,连接时报错失去连接等,需要重新连接才能正常
检查及解决办法:
1、 profiles中idle_time设置(默认unlimited)
2、检查杀毒软件或者OS防火墙设置;可尝试退出第三方杀毒软件或者关闭OS防火墙。
3、网络不稳定因素(网络问题,驱动或者协议有问题等)
4、硬件防火墙设置(防火墙上可以设置最大允许的长连接时长,可以调整放开此限制)
5、在4的情况下,如因特殊原因不能放开的话(网管解释可能将防火墙撑爆或者网络不安全等):可以设置oracle定时job,每隔多长时间(小于防火墙设置的时间)发包通讯(select 1+1 from dual)或者设置DCD:SQLNET.EXPIRE_TIME=10
(1)开启DCD(设置SQLNET.EXPIRE_TIME值小于防火墙设置允许的空闲连接时间)
开启DCD,只需要在服务端的sqlnet.ora文件中添加SQLNET.EXPIRE_TIME参数,单位为分钟:SQLNET.EXPIRE_TIME=10 
如果时间达到这个值,server端就是发出一个”probe” packet 给客户端,如要客户断是正常的,这个packet就被忽略,timer重新计时;如果客户端异常中断,则server端就会收到一个消息,用以释放连接
注意:在11gR2的RAC中,需要在$ORACLE_HOME/network/admin的sqlnet.ora中设置,而不是GRID用户的HOME下设置:
GRID: Dead Connection Connection or DCD and RAC 11.2 (文档 ID 1136945.1)
--11gR2 rac中, dcd 要在 db_home中设置,而不是在GRID_HOME中设置
参考Oracle官方资料解释如下:
With DCD is enabled, the Server-side process sends a small 10-byte packet to the client process after the duration of the time interval specified in minutes by the SQLNET.EXPIRE_TIME parameter.
How to Check if Dead Connection Detection (DCD) is Enabled in 9i ,10g and 11g (文档 ID 395505.1)
How Dead Connection Detection is Triggered
Let us take an example. Suppose we set the sqlnet.expire_time = 2 and the timer got armed at 10.00 am, 
then the DCD packets will be sent only if there is no network(I/O) activity for that connection in the next 2 min. i.e. till 10.02 am. 
If there is an i/o in between 10 to 10.02 then the connection is not dead one as the activity took place on that particular connection, which means the connection is alive and hence the DCD packets will not be sent for this period of time. 
So, at any point of time, the DCD packets will only be sent if there is no activity for the full span of specified time interval. 
As the first connection operation itself considered a successul I/O, the first DCD probe packet would go only after 2 * expire_time and successive one's would be sent every expiry_time provided no activity in that next span too.

(2)在有使用dblink访问的数据库中:
多数因晚间无业务时,使用dblink访问数据,长时间空闲后,连接时报错失去连接等,需要重新连接才能正常;为防止连接超时断开,可以通过设置job定时执行的方式解决,job内容可以简单设置为如下:select 1+1 from dual@dblink
(设置job的间隔执行时间小于防火墙设置允许的空闲连接时间)

二、远程终端连接linux空闲超时后自动断开问题
现象:
在使用SecureCRT或者其他SSH工具通过telnet或SSH方式访问linux时,空闲会话一段时间后连接会自动断开或者提示超时/重连。
原因分析:
1、服务器存在防火墙,会关闭超时空闲连接,或设置了关闭超时空闲连接。
2、客服端存在防火墙,会关闭超时空闲连接。
3、客服端和服务器之间存在路由器,路由器也可能带有防火墙,会关闭超时空闲连接。(一般情况下此种可能性较大)
解决办法:
1、服务器端解决办法:
使用root用户修改/etc/ssh/sshd_config配置文件 ClientAliveInterval 300(默认为0,这里如果选项前面有“#”,表示被注释掉需要打开,同时TCPKeepAlive 也需要设置为yes)这个参数300的是意思是每5分钟,服务器向客户端发一个消息,用于保持连接,当然数值要比防火墙超时时间的最小值小,否则还没等发送空闲包,连接就被断开了。
修改后使用service sshd reload 命令执行生效,这个修改适用于所有终端连接,但不支持telnet方式连接,SSH方式可以保持连接。
2、客户端解决办法:
原理同上,让客户端每隔多长时间向服务器发一个消息,用于保持连接,来实现客户端与服务器之间的连接“不空闲”;设置如下:
如下设置的时间也需要比防火墙超时时间的最小值小。
secureCRT在选项 终端 反空闲 中设置每隔多少秒发送一个字符串,或者是NO-OP协议包。(依据SecureCRT版本不同选择位置可能有所不同)
putty:putty -> Connection -> Seconds between keepalives ( 0 to turn off ), 默认为0, 改为300。

3、修改硬件防火墙策略,解除空闲断开限制(但考虑到网络安全,一般不建议这么做)

三、说明以上通过简单网络发包的方式解决超时或者空闲时间过长自动断开的问题,对网络影响极小,建议使用。


阅读更多
换一批

没有更多推荐了,返回首页