Oracle服务器不返回消息给客户端(失去连接),告警日志中“Fatal NI connect error 12170”、TNS-12535、TNS-00505、nt OS err code、nt main err code等错误处理

0    178    4

Tags:

👉 本文共约4689个字,系统预计阅读时间或需18分钟。

现象

现象1

在数据库服务器上执行一个update语句或执行一个存储过程,时间大概40分钟,可以正常结束,可以获取到执行成功的返回消息,但是拿到远程客户端去执行的时候(无论是使用sqlplus还是plsql developer或者Navicat执行),执行了很久也没有返回结果,,,但是,通过查询会话,发现该SQL已经正常执行完成,只是没有返回消息给客户端

查看告警日志报错:

仔细分析出问题的时间点,就是SQL执行完成的时间。。。。

现象2

有意思的是,INACTIVE状态的会话并不会被断开,而ACTIVE状态的会话跑着跑着却会被断开,但其实服务端会话仍然在,这个通过开多个sqlplus客户端可以观察到。

分析

从MOS上的信息反馈看,这个类型错误提示是一种正常的Oracle工作机制。当客户端进程Client Process与服务器进程Server Process建立联系之后,两者就形成了“同生共死”的关系(专有连接模式)。除非客户端主动发起中断或者Server Process被异常kill。

在实际运行环境中,这种理想状态常常被打破。如果Client Process只是保持连接,不执行语句,会话就处于idle状态。这种连接很容易被诸如防火墙等网络层面设备切断。

在Oracle11gR2中,如果长期没有连接动作的Server Process被外力切断,Oracle就会自动将信息作为提示错误写入到alert log中,作为一种提示。在11R1版本中,这种信息是会写入到sqlnet.log中。

归纳MOS和网络中的各种方法,大体有两重策略,分别为使用DCD和禁用ADR。

DCD全称Dead Connection Detection,是一种基于主动测探方式检查Oracle僵尸客户端进程Client Process的策略。配置DCD的关键是设置sqlnet.expire_time参数在SQL Net体系下,Oracle会依据这个时间间隔给所有的Client Process发送网络通信包,用来确定Client是否存活。正是借助这个包通信,可以让防火墙认为这个网络连接还是处在active状态,不会进行强制断开动作。类似的机制还有Linux上的tcp keep live机制,也是使用类似的策略进行检查。

另一种方式也是Oracle推荐的,就是关闭11g的ADR机制。ADR(Automatic Diagnostic Repository)是Oracle进行自动诊断、自动提醒的工具组件。Oracle认为如果用户不需要在SQL Net组件中应用ADR,可以再sqlnet.ora中进行配置关闭。

nt secondary err code返回值的不同

生成日志

可以配置trace进行跟踪,生成日志来分析:

也可以使用事件跟踪“ORA-03135: 连接失去联系错误”生成trace:

SQL查询排查

解决

1、修改数据库服务器端的listener.ora 和 sqlnet.ora文件

2、若是Linux服务器,则配置如下参数:

对于Linux服务器,如果参数net.ipv4.tcp_max_tw_bucketsnet.core.somaxconnnet.ipv4.tcp_max_syn_backlog配置过小,则可能会导致该文中的问题。

对于Windows平台请参考:https://www.xmmup.com/linuxhewindowspingtaishangtcp_keepalive_timetcp_keepalive_intvlhetcp_keepalive_probesdepeizhi.html

3、重新reload监听器配置,或者重启监听器

其它可能原因排查

1、数据库防火墙原因,请关闭防火墙或配置防火墙的长连接。这里的防火墙涉及数据库服务端和客户端2个主机的防火墙。

2、检查客户端和服务器之间是否有丢包及延迟现象,可以使用ping或mtr测试,参考:https://www.xmmup.com/shiyong-mtr-fenxiwangluoyanchijidiubaowenti.html

3、检查profile文件是否有限制:

4、若数据库是12.2版本及以上,请检查是否配置了参数MAX_IDLE_TIMEMAX_IDLE_BLOCKER_TIME

5、是否配置了定时任务,定时清理会话,请查询:dba_jobsdba_scheduler_jobs

6、检查pga_aggregate_limitpga_aggregate_target是否过小。

7、其它杀毒软件导致的短连接,请关闭Windows Defender 防火墙等。

8、是否有云层面、高层次、顶层的防火墙配置,例如,新华三防火墙“H3C SECPATH F5000-M”需要配置老化时间为较长时间:

Oracle服务器不返回消息给客户端(失去连接),告警日志中“Fatal NI connect error 12170”、TNS-12535、TNS-00505、nt OS err code、nt main err code等错误处理

参考:

https://zhiliao.h3c.com/questions/dispcont/114689

https://zhiliao.h3c.com/Theme/details/164108

另外,例如天融信防火墙配置TCP维持超时等时间,如下:

Oracle服务器不返回消息给客户端(失去连接),告警日志中“Fatal NI connect error 12170”、TNS-12535、TNS-00505、nt OS err code、nt main err code等错误处理

9、修改所有配置后,最后重启OS,再进行尝试。

其它处理

SQLNET.AUTHENTICATION_SERVICES的推荐值

另外,对于sqlnet.ora文件的参数SQLNET.AUTHENTICATION_SERVICES的推荐值:

大事务分批处理

另外,对于大事务,可以考虑分批更新,参考:https://www.xmmup.com/oraclezaicaozuodashujuliangshiruhefenpicharufenpigengxinfenpishanchufenpitijiao.html

Navicat和PLSQL Developer软件的配置

若是因为网络不稳定的原因,或通过代理方式、或通过VPN等方式导致的时断时连,则可以考虑配置客户端软件的长连接。

对于Navicat来说,配置高级属性中的 保持连接间隔。选项:

Oracle服务器不返回消息给客户端(失去连接),告警日志中“Fatal NI connect error 12170”、TNS-12535、TNS-00505、nt OS err code、nt main err code等错误处理

对于PLSQL Developer软件,进入Preferences,然后选择左边的Connection选型,选择Check connection,配置后,每隔60秒会检查1次:

Oracle服务器不返回消息给客户端(失去连接),告警日志中“Fatal NI connect error 12170”、TNS-12535、TNS-00505、nt OS err code、nt main err code等错误处理

Oracle服务器不返回消息给客户端(失去连接),告警日志中“Fatal NI connect error 12170”、TNS-12535、TNS-00505、nt OS err code、nt main err code等错误处理

参数介绍

sqlnet.expire_time

sqlnet.expire_time = 5指定用于定期验证客户端和服务器连接活动状态的时间间隔,单位为分钟。例如,在这里表示每隔5分钟发一个 probe 包证明 client/server connections 是 active 的。

To specify a time interval, in minutes, to send a check to verify that client/server connections are active.

DISABLE_OOB

"DISABLE_OOB"是Oracle数据库中的一个参数,指定是否在Out-Of-Band (OOB)通道上进行数据传输。

OOB通道是一个备用的、不同于主数据通道的通道,用于在主通道无法使用时进行数据传输。例如,当主通道出现故障或拥塞时,OOB通道可以用于重要数据的传输,以确保数据的可靠性和完整性。

如果将DISABLE_OOB参数设置为TRUE,则Oracle数据库将禁用OOB通道,只使用主数据通道进行数据传输。这可能会降低数据传输的可靠性和速度,但可以提高系统的安全性,因为攻击者无法利用OOB通道进行潜在的攻击。

如果将DISABLE_OOB参数设置为FALSE(默认值),则Oracle数据库将启用OOB通道,以便在必要时使用备用通道进行数据传输。

请参考: Oracle Net Performance Tuning (Doc ID 67983.1)

Data exception or break is a function in Oracle NET that allows a transaction to be interrupted before it is
completed. It returns both the client and the server to a condition from which they can continue. A break
such as Ctrl-c can be sent as part of the normal data stream (inband), or as a separate asynchronous
message (outband). An outband break is much faster and interrupts the flow of data.

Out Of Band Breaks (OOB) are enabled by default provided the underlying protocol supports sending
urgent data.

If the parameter DISABLE_OOB is set to OFF then it enables Oracle Net to send and receive "break"
messages using urgent data provided by the underlying protocol.

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
Oracle服务器不返回消息给客户端(失去连接),告警日志中“Fatal NI connect error 12170”、TNS-12535、TNS-00505、nt OS err code、nt main err code等错误处理后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章
验证码:
请关注本站微信公众号,回复“小麦苗博客”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部