数据库告警日志 如下图 。发现 问题时间段,没有 数据库服务故障 报错,但是存在较多 TNS-12535 、 12560 、 12170 、 00505 错误:
通过检查问题时间段应用日志, 也记录了 Caused by: java.sql.SQLRecoverableException: IO 错误: Connection reset 和 Caused by: java.net.SocketException: Connection reset 等 连接 重置 的相关报错:
问题分析:
1 、 数据库层面分析:
参考官网关于这类数据库错误的文章:A Demonstration of the Alert Log Timeouts Occur: TNS-12170/TNS-12535/TNS-12560/TNS-00505 (Doc ID 2461900.1)
ORACLE官方针对这类错误明确:错误堆栈依次为TNS-12170/TNS-12535/TNS-12560/TNS-00505,这表明由于网络问题,已建立的连接超时。例如,网络电缆被拔出,防火墙断开连接,或者客户端崩溃而没有通知服务器等等。
在这种情况下,oracle服务器进程无法确定客户端状态,它必须等到tcp保活超时(可能是几个小时),则该过程将被终止,并且上述消息将被打印在警报日志中。这是一个网络/应用程序问题,而不是oracle错误。
所以原因需要从数据库以外方向去查。
2 、 应用报错层面分析
参考官网关于 SQLRecoverableException 这类应用报错误的文章 1 :JDBC 11.2.0.3 Application Fails With java.sql.SQLRecoverableException: IO Error: Connection reset (Doc ID 1575238.1)
可以看到该应用程序日志的版本与上面官网JDBC 11.2.0.3 ojdbc6.jar connection with JDK 1.6 匹配。
主要原因为:该问题是由位于客户端和服务器之间的TCP/IP网络设备(防火墙、路由器等)引起的,该设备设置为在超过任何MTU(最大传输单元)或数据包大小时限制或限制通过它的通信。
What Causes the "java.net.SocketException: Connection Reset" Error? (Doc ID 786219.1)
ORACLE官方认为,导致connection reset被重置的常见原因为:
1)客户端浏览器已刷新或关闭。如果由于这种情况而报告错误消息,通常是因为系统中可能存在性能问题。要解决此问题,请找到性能不佳的瓶颈并消除它。
2)客户端和WebLogic服务器之间有防火墙,防火墙已断开连接。对于这种情况,请正确设置防火墙。
3)网络拥塞导致操作超时。缓解网络拥塞,问题应该得到解决
所以该问题主要是由于 应用端与 数据库 服务器端的网络通信异常 导致本次问题。建议做如下调整:
网络层面:检查应用端、服务器端、防火墙的MTU值是否一致,更改应用端、服务端的MTU值与防火墙一致,MTU默认值为1500,参考可调至9000(oracle原厂建议oracle服务器是 9000,同时参考了其他银行的MTU值),建议网络工程师可以用ping包的方式 测试出符合当前环境的最佳MTU 。
数据库层面:
在sqlnet.ora增加参数:
SQLNET.INBOUND_CONNECT_TIMEOUT = 0
在 listener.ora 增加:
INBOUND_CONNECT_TIMEOUT_LISTENER = 0