ITPub博客

首页 > 数据库 > Oracle > [20200220]关于SQLNET.EXPIRE_TIME and ENABLE=BROKEN的总结.txt

[20200220]关于SQLNET.EXPIRE_TIME and ENABLE=BROKEN的总结.txt

原创 Oracle 作者:lfree 时间:2020-02-20 11:21:51 0 删除 编辑

[20200220]关于SQLNET.EXPIRE_TIME and ENABLE=BROKEN的总结.txt

--//昨天做了大量关于SQLNET.EXPIRE_TIME and ENABLE=BROKEN的测试,晚上再仔细看,测试做的有点乱。
--//做一些总结:

1. 12c之前设置SQLNET.EXPIRE_TIME在sqlnet.ora文件中,DCD判断链接并不使用TCP keep-alive feature特性。它会定期发送探测包给客
   户端检测链接是否正常,如果在1个SQLNET.EXPIRE_TIME之内客户端有数据包发送,这个探测包在SQLNET.EXPIRE_TIME(单位:分钟)时
   间到来时,不会发送探测数据包给客户端,这样有可能出现最大2*SQLNET.EXPIRE_TIME时间端内,没有发送探测数据包给客户端的情
   况。

   这样会导致一种情况,假设路由器等网络相关设置在10分钟发送接受数据包网络就会断开,设置SQLNET.EXPIRE_TIME最安全的方式是
   设置SQLNET.EXPIRE_TIME=5,这样才能保持连接在空闲时链接不会断开。

--//注:关于这个10分钟来历,可以参考链接:http://blog.itpub.net/267265/viewspace-2150614/=>[20180129]测量网络断开时间.txt   

2. 12之前如果不设置SQLNET.EXPIRE_TIME在sqlnet.ora文件中,网络链接使用TCP keep-alive feature特性。这点你可以执行
   netsta -npo | grep <spid> 看看最后一个字段是否是keepalive确定。

   而linux下实际上使用如下参数:
# echo /proc/sys/net/ipv4/tcp_keepalive* | xargs   -n 1  strings -1 -f
/proc/sys/net/ipv4/tcp_keepalive_intvl: 75
/proc/sys/net/ipv4/tcp_keepalive_probes: 9
/proc/sys/net/ipv4/tcp_keepalive_time: 7200

--//参数解析:
/proc/sys/net/ipv4/tcp_keepalive_time    当keepalive起用的时候,TCP发送keepalive消息的频度。默认是2小时。
/proc/sys/net/ipv4/tcp_keepalive_intvl   当探测没有确认时,keepalive探测包的发送间隔。缺省是75秒。
/proc/sys/net/ipv4/tcp_keepalive_probes  如果对方不予应答,keepalive探测包的发送次数。缺省值是9。

默认的参数tcp_keepalive_time设置太长,不使用SQLNET.EXPIRE_TIME在sqlnet.ora文件中,必须修改内核对应参数符合实际需求。
假设路由器等网络相关设置在10分钟发送接受数据包网络就会断开,这样必须修改/etc/sysctl.conf文件:

net.ipv4.tcp_keepalive_time = 590
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes=4

这也是我个人推荐的模式,我个人感觉这样不会出现上面设置SQLNET.EXPIRE_TIME=5的情况。而且采用TCP keep-alive feature特性
更加科学,因为如果链接有数据包发送接收,计时重新开始(注:你可以执行sql语句后,使用netsta -npo | grep <spid> 看看最后一个字
段是否是keepalive确定),不会像设置SQLNET.EXPIRE_TIME时,定期发送探测包给客户端检测链接是否正常。

缺点就是必须手工设置内核参数/proc/sys/net/ipv4/tcp_keepalive*参数,符合网络需求。

3.12c之后(包括12c)设置SQLNET.EXPIRE_TIME在sqlnet.ora文件中,DCD判断链接使用TCP keep-alive feature特性。实际上就是将
  SQLNET.EXPIRE_TIME的数值换成秒,通过调用setsockopt(N, SOL_SOCKET, SO_KEEPALIVE, [1], 4) [注:这里N对应socket的句柄]。
  可以通过netsta -npo | grep <spid> 观察 最后一列是否是keepalive确定。

  从这里也可以看出使用TCP keep-alive feature特性更加合理科学,不然oracle不会采用这种方式。

4.ENABLE=BROKEN 设置在tns连接串中,设置它相当于客户端使用TCP keep-alive feature特性。
  如果不设置ENABLE=BROKEN,就是出现链接http://blog.itpub.net/267265/viewspace-2150555/=>奇怪的SQLNet message from dblink模拟
  的情况,大约等927秒(15分钟)才会报错。

"缺点"就是必须手工设置内核参数/proc/sys/net/ipv4/tcp_keepalive*参数,符合网络需求,[注:是指客户端的内核参数。]
而且许多客户端或者中间服务器使用的是windows系统,如何修改注册表,我还给上网查询测试看看,明天继续在查一些资料看看。

5.链接是否可以使用TCP keep-alive feature特性,linux下可以通过执行netsta -npo | grep <进程号> 观察 最后一列是否是keepalive确定。
  这是一种简单快捷的方式。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2676351/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2669
  • 访问量
    6426448