首页 游戏 软件 资讯 排行榜 专题
首页
数据库
Oracle RAC如何清理无效的数据库连接?调整SQLNET超时

Oracle RAC如何清理无效的数据库连接?调整SQLNET超时

热心网友
57
转载
2026-04-23

ORA-03113/ORA-03137幽灵会话因SQL*Net未探测断连而残留ACTIVE状态,需配置SQLNET.EXPIRE_TIME、TCP.CONNECT_TIMEOUT等参数并统一RAC各节点,必要时kill -9 SPID强制清理。

ORA-03113/ORA-03137:连接断开后会话仍卡在ACTIVE状态

在Oracle RAC环境中,一个颇为恼人的现象是:客户端因为网络闪断、应用崩溃或者防火墙策略清理空闲连接而异常断开后,数据库的v$session视图里,却常常残留着一大批状态显示为‘ACTIVE’的会话。这些“幽灵会话”早已名存实亡,与客户端失去了联系,但它们既不响应常规的alter system kill session命令,也不受idle_time参数的限制。结果就是,它们持续占用着PGA内存、锁以及全局队列资源,在RAC这种共享架构下,极易引发全局缓存(GC)等待的连锁反应,拖累整个集群的性能。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

Oracle RAC如何清理无效的数据库连接?调整SQLNET超时

问题的根源,往往不在于数据库层面没有检测能力,而在于SQL*Net网络层默认没有开启主动探测或超时清理机制。要知道,在默认配置下,TCP连接的保活(keepalive)是由操作系统控制的,比如Linux系统默认的2小时超时,这远远超出了绝大多数业务场景的容忍范围。

  • 如何检查当前无效会话? 可以运行以下查询,找出那些状态为ACTIVE但最后一次调用已超过5分钟的会话:
    SELECT sid, serial#, username, status, server, program, sql_id, last_call_et FROM v$session WHERE status = 'ACTIVE' AND last_call_et > 300 AND username IS NOT NULL;
  • 如何确认会话是否真的无响应? 对于可疑的会话ID,查询v$session_wait视图。如果发现其等待事件(event)是‘SQL*Net message from client’,并且状态(state)为‘WAITING’,但等待时间(seconds_in_wait)却在持续累加,这基本就能断定客户端已经失联了。
  • RAC环境下的特有风险: 这类幽灵会话在集群实例间进行状态同步或争用全局资源时,可能会被其他节点反复尝试处理,无形中放大了集群的内部通信开销,让问题雪上加霜。

sqlnet.ora里必须配的3个超时参数

单纯依赖数据库的resource_limitidle_time参数,对这类连接是无能为力的。必须在$ORACLE_HOME/network/admin/sqlnet.ora文件中显式启用SQL*Net层的探测机制。这里有三个关键参数,可以说是缺一不可,而且需要注意它们的生效范围:

  • SQLNET.EXPIRE_TIME = 10:这是核心。它指示服务器每隔10分钟向空闲的客户端连接发送一个探测包(一个空的数据包)。需要明确的是,这并非“10分钟后断开连接”,而只是发起一次探测。只有当客户端对这次探测毫无响应时,连接才会在后续被真正关闭。
  • TCP.CONNECT_TIMEOUT = 60:这个参数主要影响新连接的建立阶段,比如TNS ping或首次登录尝试。对于已经建立的连接,它不起作用。但将其设置为一个合理的值(如60秒),可以有效避免因网络问题导致的大量连接请求堆积,阻塞监听器进程。
  • TCP.VALIDNODE_CHECKING = YES 配合 TCP.INVITED_NODES = (your_app_subnet):这组参数虽然不直接控制超时,但通过限制允许连接的主机,可以从源头上防止恶意扫描建立虚假连接,间接减少了无效连接产生的可能性。

⚠️ 一个关键的大坑: 在RAC环境中,SQLNET.EXPIRE_TIME这个参数必须在所有节点上保持配置一致。否则,可能出现一个节点因探测失败断开了连接,而客户端重连时被分配到另一个节点,却可能错误地复用了旧的连接句柄,导致会话状态陷入混乱。修改完sqlnet.ora后,数据库实例无需重启,但必须重启监听器(lsnrctl)以使新配置生效。

ALTER SYSTEM KILL SESSION不生效?直接查SPID杀OS进程

有时候,你会发现v$session中的会话状态已经变成了‘KILLED’,但它占用的资源却迟迟没有释放。这在RAC环境中尤其常见,可能因为会话涉及跨实例的锁等待。此时,干等着PMON进程来清理可不是好主意,更主动的做法是定位到对应的操作系统进程并强制终止。

  • 第一步,查找操作系统进程ID(SPID):
    SELECT s.sid, s.serial#, s.status, p.spid, s.program FROM v$session s, v$process p WHERE s.paddr = p.addr AND s.sid = ;
  • 第二步,在会话所在的RAC节点上执行强制终止: 在Linux系统上使用 kill -9 ;在Windows系统上则使用 orakill
  • 第三步,验证清理结果: 执行 SELECT count(*) FROM v$process WHERE spid = '';,如果返回结果为0,就说明进程已被成功清除。

需要理解的是,ALTER SYSTEM KILL SESSION命令本身只是给会话打上一个“待清除”的标记,真正的清理工作是由后台进程PMON周期性地扫描来完成的(默认每3秒一次)。如果这个会话恰好持有未提交的DML锁,或者正卡在两阶段提交的中间状态,PMON的清理动作可能会被延迟数分钟甚至更久。在这种情况下,强制杀掉操作系统进程往往是唯一立竿见影的方法。当然,操作前最好通过v$transaction视图确认一下该会话是否还有未提交的事务,以评估强制终止的风险。

监听器日志里看真实断连时间点

数据库内部的视图只能告诉我们会话“何时被标记为失效”,如果想追踪网络层实际断开连接的确切时刻,就必须去查阅$ORACLE_HOME/network/log/listener.log这个监听器日志文件。

  • 搜索关键错误码: 重点关注TNS-12535(操作超时)、TNS-12608(发送超时)以及Failed to accept a connection这类信息。
  • 典型的日志记录如下:
    TNS-12535: TNS:operation timed out  TNS-12608: TNS:send timeout  ns secondary err code: 12535  nt main err code: 0
  • 结合时间戳和客户端IP地址进行分析, 可以反向推断出问题的源头:到底是应用程序侧的心跳机制缺失,还是中间的负载均衡设备(如F5、云负载均衡器)主动切断了连接。如果同一个IP地址频繁出现TNS-12535错误,那么很大概率是应用程序没有正确关闭连接,或者连接池的超时配置设置得过长。

真正棘手的是那些“隐形”的连接——它们既没有在监听器日志中留下错误记录,也没有被SQLNET.EXPIRE_TIME机制捕获。这类连接往往卡在操作系统的TCP FIN_WAIT2状态。排查它们需要从操作系统层面入手,例如使用netstat -an | grep :1521 | grep FIN_WAIT2这样的命令。遇到这种情况,调整的焦点通常就不再是数据库参数了,而是操作系统的内核网络参数,比如net.ipv4.tcp_fin_timeout

来源:https://www.php.cn/faq/2302693.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

防火墙设置白名单要重启吗?
电脑教程
防火墙设置白名单要重启吗?

防火墙设置白名单要重启吗? 先说一个核心判断:给防火墙设置白名单,通常不需要整机重启。但这事儿不能一概而论,关键在于你操作的是哪个层面——是操作系统内核、某个服务进程,还是一台物理设备?不同的平台和实现机制,决定了新规则是“秒级生效”还是需要“手动激活”。下面,咱们就按不同场景拆开细说,所有结论都有

热心网友
04.24
360路由器怎么进去登录界面
电脑教程
360路由器怎么进去登录界面

360路由器登录界面访问指南 想进入360路由器的管理后台?其实没那么复杂。官方提供了三个直达入口:域名“luyou 360 cn”、“ihome 360 cn”,以及通用IP地址“192 168 0 1”。这个设计考虑得很周全,兼顾了用户的不同习惯和设备兼容性。其中,“luyou 360 cn”是

热心网友
04.23
Oracle RAC如何清理无效的数据库连接?调整SQLNET超时
数据库
Oracle RAC如何清理无效的数据库连接?调整SQLNET超时

ORA-03113 ORA-03137幽灵会话因SQL*Net未探测断连而残留ACTIVE状态,需配置SQLNET EXPIRE_TIME、TCP CONNECT_TIMEOUT等参数并统一RAC各节点,必要时kill -9 SPID强制清理。 ORA-03113 ORA-03137:连接断开后会话

热心网友
04.23
SQL注入防护的最佳实践_采用存储过程封装数据操作
数据库
SQL注入防护的最佳实践_采用存储过程封装数据操作

存储过程不能自动防SQL注入,但能大幅降低风险——前提是不用拼接动态SQL;真正起防护作用的是参数化执行路径,所有外部输入必须走声明的强类型参数且不参与字符串拼接。 存储过程真能防SQL注入? 答案是不能自动防,但它确实能成为一道强大的防线——前提是,你得避开那个最常见的陷阱:在存储过程内部拼接动态

热心网友
04.23
麒麟OS怎么关闭防火墙_麒麟OS安全设置调整【步骤】
系统平台
麒麟OS怎么关闭防火墙_麒麟OS安全设置调整【步骤】

麒麟系统禁用防火墙的四种方法概览 当你在麒麟操作系统上部署服务或调试网络时,可能会遇到防火墙拦截端口的情况。系统默认启用的firewalld或kylin-firewall服务虽然能提升安全性,但在特定场景下需要暂时关闭。下面这四种方法能帮你快速解决这个问题: 一、命令行方式:使用systemctl管

热心网友
04.22

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

Llama中文社区
AI
Llama中文社区

Llama中文社区是什么 提起近年来火热的大语言模型,Meta的Llama系列无疑是开源领域的明星。但一个绕不开的问题是:如何让这些“国际范儿”的模型,更好地理解和使用中文?这恰恰是Llama中文社区诞生的初衷。简单来说,它是由LlamaFamily打造的一个高级技术社区,核心目标非常聚焦:致力于对

热心网友
04.25
Tech Talent AI
AI
Tech Talent AI

Tech Talent AI Sourcing是什么 简单来说,Tech Talent AI Sourcing 是摆在技术招聘领域的一个“效率翻跟斗”。由TalentSight开发的这款AI招聘工具,核心目标很明确:帮助招聘团队,尤其是那些在IT人才红海里“淘金”的团队,更快、更准地锁定对的人。它的

热心网友
04.25
CentOS系统如何防止SFTP被攻击
网络安全
CentOS系统如何防止SFTP被攻击

在CentOS系统上防止SFTP被攻击的配置与加固指南 对于依赖SFTP进行文件传输的CentOS服务器而言,安全配置绝非小事。攻击者一旦找到入口,数据泄露和系统失陷的风险便会急剧上升。别担心,通过一系列系统性的配置和加固措施,我们可以为SFTP服务构筑起坚实的防线。下面这份实操指南,将带你一步步完

热心网友
04.25
Linux里记事本软件如何进行文件加密
网络安全
Linux里记事本软件如何进行文件加密

在Linux里记事本软件如何进行文件加密 很多刚接触Linux的朋友可能会发现,系统自带的记事本类软件(比如gedit)并没有一个直接的“加密”按钮。这其实很正常,因为Linux的设计哲学更倾向于“一个工具做好一件事”。不过别担心,虽然记事本本身不内置加密,但我们可以借助几个强大且成熟的外部工具,轻

热心网友
04.25
debian分区如何加密
网络安全
debian分区如何加密

Debian分区加密全攻略:LUKS与LVM两种方案深度解析 在数据安全日益重要的今天,为Debian系统分区实施加密已成为系统管理员和资深用户的必备技能。本文将详细对比两种主流的Debian分区加密方法,帮助您根据实际需求选择最佳方案。下图直观展示了两种方案的核心流程与关系: 接下来,我们将深入剖

热心网友
04.25