数据库告警日志信息如下:
在观察时段内,虽未出现数据库服务故障报错,但发现多起包括TNS-12535、12560、12170和00505等错误。通过检查相应时段的应用日志,也记录了相关连接重置的报错信息,如java.sql.SQLRecoverableException和.SocketException等。
问题分析:
一、数据库层面分析:
参考官方文档关于TNS-12170/TNS-12535/TNS-12560/TNS-00505错误的说明(Doc ID 2461900.1),这些错误通常是由于网络问题导致的已建立连接超时。可能的原因包括网络电缆被拔出、防火墙断开连接或客户端崩溃而没有通知服务器等。在这种情况下,Oracle服务器进程需等待tcp保活超时(可能长达数小时),随后该过程将被终止,相应的错误消息将记录在警报日志中。问题应是一个网络/应用程序层面的问题,而非Oracle数据库本身的错误。需从数据库外部因素进行排查。
二、应用报错层面分析:
对于SQLRecoverableException这类应用报错,可参考官方文档JDBC 11.2.0.3版本的应用程序失败与java.sql.SQLRecoverableException: IO Error: Connection reset的相关文章(Doc ID 1575238.1)。根据日志版本匹配情况,问题可能源于位于客户端和服务器之间的TCP/IP网络设备设置,如防火墙、路由器等。这些设备可能设置了任何MTU(最大传输单元)或数据包大小的限制,导致通信异常。
根据Oracle官方文档,导致".SocketException: Connection Reset"错误的常见原因包括:
1. 客户端浏览器刷新或关闭。若因此报告错误消息,则可能系统中存在性能问题,需找到性能瓶颈并优化。
2. 客户端和服务器间的防火墙断开连接,需正确配置防火墙设置。
3. 网络拥塞导致操作超时,缓解网络拥塞问题应能解决此类情况。
综合以上分析,此次问题主要归因于应用端与数据库服务器端之间的网络通信异常。建议采取以下措施:
网络层面:请网络工程师检查并确保应用端、服务器端及防火墙的MTU值一致。建议调整应用端和服务器的MTU值与防火墙的MTU值相匹配(通常默认为1500字节,但可调至较高值如9000,需根据实际环境和需求进行调整)。可通过ping包的方式测试并确定最佳MTU值。
数据库层面:在sqlnet.ora文件中添加参数SQLNET.INBOUND_CONNECT_TIMEOUT并设置为0,同时在listener.ora文件中添加INBOUND_CONNECT_TIMEOUT_LISTENER参数并设为0,以优化数据库连接超时设置。