jxnxsdengyu
作者jxnxsdengyu课题专家组·2020-04-07 17:23
系统工程师·江西农信

故障处理---ORA-12547报错

字数 843阅读 1792评论 0赞 2

现象

未做任何变更,若干台服务器突然无法正常连接数据库。提交sqlplus命令后,经过大约两分钟等待,返回“ORA-12547: TNS:lost contact”,但服务端未见报错。

服务器为Windows操作系统,客户端为Linux操作系统。

排查

1、在客户端用netstat查看tcp连接,状态为ESTABLISHED,但SEND-Q大小只增不减;

2、所有服务器访问另一个数据库(数据库B)正常;

3、服务器B连接异常服务器(数据库A)正常;

4、两台数据库服务器互换IP,服务器B仍能正常访问服务器A;

5、在服务器和客户端同时抓包,未发现丢包,但有大量Duplicate报文;

6、strace跟踪客户端进程,发现阻塞在recv函数,但此时tcpdump信息来看响应报文已经到达客户端服务器,网络通讯不存在问题。

7、netstat检查统计信息,有较多包被拒绝

netstat -s
668 packets rejects in established connections because of timestamp

分析

仔细分析网络报文,发现服务器A返回的报文的TSval较大,超过2^31,通过计算确认Windows操作系统的TSval为操作系统启动后的累计值,增长速度为每0.1秒加1。因为故障产生的当晚服务器A的TCP报文中的TSval值刚好跨过2^31,Linux服务器采用s32转换该值(Windows的TSval为无符号类型,Linux的TSval为有符号类型),转换后TSval值变成负数,发生误判(tcp规范要求TSval只能增长),Linux服务器拒绝该报文(故出现大量Duplicate报文,且SEND-Q大小只增不减),导致后续通讯异常。三次握手发送的报文中的TSval为0,故不受影响。

禁用Linux服务器的tcp_timestamp检查或重启Windows服务器均可解决问题。

sysctl net.ipv4.tcp_timestamps=0


如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广