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

[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 看看最后一个字段是否是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 看看最后一个字

段是否是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 观察 最后一列是否是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确定。

这是一种简单快捷的方式。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值