TNS-12535|TNS-00505 错误解决办法
作者 | DatabaseHobbyist
今天下午公司的一套 Oracle 19c 测试库开发人员说表空间不足,添加表空间时发现 alert 日志中有很多 TNS-505 的错误,虽然没有太大的问题但看着很是不爽,抽点时间去搞搞。
Fatal NI connect error 12170.
VERSION INFORMATION:
TNS for Linux: Version 19.0.0.0.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
Version 19.4.0.0.0
Time: 11-JUN-2021 17:04:44
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS:operation timed out
ns secondary err code: 12560
nt main err code: 505
TNS-00505: Operation timed out
nt secondary err code: 110
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=XX.X.XX.XX3)(PORT=55558))
2021-06-11T17:15:30.380100+08:00
从报错信息看,Fatal NI connect error 12170 是与 Oracle Net 和 TCP/IP 网络相关。这个报错信息内容上,是 Oracle 强制断开了与客户端的连接关系,终止会话过程。
Oracle Client Process 与 Server Process 是典型的一对一关系。在独占连接模式下,Client Process 发起连接请求,通过监听器建立起与 Server Process 的关系,此后两者的关系就是“同生共死”管理。正常情况下,只有在 Client Process 主动终止连接的情况下,Server Process 才会进行连接断开动作。在主动中断的过程中,Client Process 会存在一个终止信息回写的动作。
在一些特殊的情况下,是可能出现异常中断情况的。例如 Client Process 异常中断、无响应或者在网络层面切断。此外,一些网络防火墙设置也会自动的将长期闲置(或者认为闲置)的连接切断。
如果客户端与服务器长期保持连接关系,比如使用 PL/SQL Developer 或者 CS 客户端直连,两者之间没有数据传递。一些防火墙会自动监控这些闲置连接,如果闲置时间很长,防火墙会将这些连接自动打断。而且,长期运行的查询语句和 JDBC 方式连入的连接,出现断开的几率更高。
当然解决办法也很简单,在 **RDBMS_HOME/network/admin/sqlnet.ora 中设置的以下参数可以解决此类问题。
DCD 或 SQLNET.EXPIRE_TIME 可以模拟长时间空闲期间服务器和客户端之间的数据传输。
SQLNET.EXPIRE_TIME=n 其中 <n> 是以分钟为单位设置的非零值。
一旦此更改到位,就无需重新启动侦听器或数据库。更改将适用于更改后所有新生成的服务器进程。注意,在此设置之前建立的连接不会受到此更改的影响,也无需重启数据库和监听,新连接的进程会自动生效。
[oracle@test trace]$ cd $ORACLE_HOME/network/admin
[oracle@test admin]$ ls
samples shrept.lst sqlnet.ora
[oracle@test admin]$ vi sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.EXPIRE_TIME=1
--这里的 LLOWED_LOGON_VERSION_SERVER=8 是指的 Oracle 客户端版本兼容性,
--指低版本的客户端可以连接到此数据库。
--设置DCD检测时间为1分钟,指定时间间隔(以分钟为单位),以发送探测以验证客户端/服务器连接处于活动状态。
--设置一个大于0的值可确保不会由于客户端异常终止而无限期地断开连接。如果探针找到终止的连接或不再使用的连接,
--则它将返回错误,导致服务器进程退出。此设置用于数据库服务器,该服务器通常一次可以处理多个连接。
DCD(Dead Connection Detection)
死连接检测是一种通信查探技术,引入特性的初衷是解决死链接标记回收问题,这是 Oracle 提供的一个很不错的功能,死链接检测主要的产生环境是在客户端在没有正常断开连接后断开连接,问题出在客户端的网络上,死连接检测被初始化在服务器端。SQL*NET读取参数文件的设置。在 sqlnet.ora 文件里设置 SQLNET.EXPIRE_TIME 为非零参数时间间隔。当超过设置时间,SQL*NET 发送一个"探索"包到客户端。对于一个数据库链接,链接的目的地构成连接的服务器端。"探索"本质上是个空包。不会表示任何 SQL*NET 级别的数据,但是它创建了数据流在底层的协议。如果客户端是 ACTIVE, 包被丢弃,探索时间被重置,如果客户端异常终止,服务器端将会接受一个错误。服务端标记操作系统释放链接资源。
配置 DCD,可以在一定程度上缓解由于长时间连接中断造成的报错问题。同时也可以排除发现潜在前端应用在数据库连接方面的故障和问题。