暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

Oracle11g数据库出现大量 INACTIVE 会话

原创 飞天 2026-03-16
491

问题引入

f39ee88270345a65138b7b2261f795d7.png
在 Oracle RAC 环境中,出现大量 INACTIVE 会话(本例中 964 个,占进程总数的 68.86%)是常见问题,可能导致数据库进程数耗尽、新连接失败或系统资源浪费。作为专业 DBA,需系统性地排查并制定解决方案。

1. 理解 INACTIVE 会话

INACTIVE 会话表示客户端已与数据库建立连接,但当前未执行任何 SQL 操作。通常来自应用连接池(保持空闲连接)、客户端异常断开(网络中断、客户端崩溃未及时释放)、开发人员未正确关闭连接等。若不及时处理,可能耗尽 PROCESSES 参数(当前为 1400),影响业务。

2. 诊断步骤

2.1 查看 INACTIVE 会话的详细信息

在 RAC 中查询 gv$session 获取所有实例的会话信息,重点关注:

  • 用户名 (username)
  • 客户端机器 (machine)
  • 程序名 (program)
  • 模块 (module)
  • 登录时间 (logon_time)
  • 最后调用时间 (last_call_et,距离上一次用户调用过去的秒数)
  • 状态 (status)、等待事件 (event)
-- 查看所有 INACTIVE 会话详情 SELECT inst_id, sid, serial#, username, machine, program, module, logon_time, last_call_et, event FROM gv$session WHERE status = 'INACTIVE' ORDER BY last_call_et DESC, logon_time;

2.2 按维度统计来源

找出产生最多 INACTIVE 会话的应用、用户或机器:

-- 按用户名统计 SELECT username, COUNT(*) AS inactive_count FROM gv$session WHERE status = 'INACTIVE' GROUP BY username ORDER BY 2 DESC; -- 按程序名统计 SELECT program, COUNT(*) AS inactive_count FROM gv$session WHERE status = 'INACTIVE' GROUP BY program ORDER BY 2 DESC; -- 按机器统计 SELECT machine, COUNT(*) AS inactive_count FROM gv$session WHERE status = 'INACTIVE' GROUP BY machine ORDER BY 2 DESC;

2.3 检查连接池应用特征

若程序名/模块包含连接池标识(如 Weblogic、Tomcat 等),需关注连接池配置。

2.4 检查数据库参数与超时设置

  • SQLNET.EXPIRE_TIME:在 $ORACLE_HOME/network/admin/sqlnet.ora 中设置,定期探测空闲连接是否存活,默认未启用。

  • RESOURCE_LIMITPROFILEIDLE_TIME:启用资源限制后,可为用户指定 idle 超时。

    -- 查看当前资源限制状态 SHOW PARAMETER resource_limit; -- 查看所有 profile 的 idle_time SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'IDLE_TIME';

2.5 检查是否因网络或客户端异常导致僵尸连接

例如客户端防火墙超时、应用服务器重启未释放连接等,可通过 last_call_et 很大的会话(数小时甚至数天未活动)判断。

3. 处理措施

3.1 紧急清理长时间 INACTIVE 的会话

若进程数接近上限或业务受影响,可手动终止长时间空闲的会话。需谨慎,确认非核心业务或测试连接。

-- 生成 kill 语句(RAC 环境需指定 inst_id) SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ',@' || inst_id || ''' IMMEDIATE;' AS kill_cmd FROM gv$session WHERE status = 'INACTIVE' AND last_call_et > 3600 -- 空闲超过1小时 AND username NOT IN ('SYS','SYSTEM'); -- 排除管理员

执行生成的 kill 命令。若无法立即 kill,可加 IMMEDIATE 或使用 DISCONNECT SESSION POST_TRANSACTION

3.2 优化应用连接池配置

与应用开发团队协作,调整连接池参数:

  • 最小空闲连接数:降低到合理值(例如 5~10)。
  • 空闲连接超时:设置 idleTimeout(如 30 分钟)。
  • 连接验证:启用 testOnBorrowtestWhileIdle,避免无效连接堆积。
  • 最大生命周期:设置 maxLifetime 防止连接永久缓存。

3.3 启用数据库端空闲超时

a) 使用 PROFILE 限制 IDLE_TIME

启用 RESOURCE_LIMIT 并设置空闲超时(单位:分钟):

ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH; ALTER PROFILE default LIMIT IDLE_TIME 30; -- 空闲30分钟自动断开 -- 或为特定应用用户创建专用 profile

注意IDLE_TIME 仅对服务器进程有效,不适用于共享服务器模式,且需要用户再次发起调用时才会检查,不是实时断开会话。

b) 设置 SQLNET.EXPIRE_TIME

在 RAC 所有节点的 sqlnet.ora 中添加:

SQLNET.EXPIRE_TIME = 10   -- 每10分钟发送探测包

需重启监听或重载配置生效。该参数检测客户端是否仍存活,若客户端无响应则终止会话,有效清理死连接。

3.4 调整数据库 PROCESSES 参数

若业务确实需要更多连接,可适当增加 PROCESSES 值,但应结合操作系统资源评估。当前总连接 1087,剩余 313,若确认增长趋势,可增大至 2000 左右。修改后需重启数据库(RAC 需滚动重启)。

4. 预防与监控

4.1 建立定期清理脚本

编写作业(如 DBMS_SCHEDULER)每天低谷时段清理空闲超时会话,避免堆积。

4.2 监控告警

  • 监控 v$session 中 INACTIVE 会话比例,设置阈值告警(例如超过 60%)。
  • 监控剩余进程数:SELECT (SELECT value FROM v$parameter WHERE name='processes') - COUNT(*) FROM v$session
  • 在 RAC 中分别监控每个实例的会话分布,防止单节点压力过大。

4.3 审计与沟通

定期向应用团队通报连接使用情况,推动连接池规范。记录异常会话来源,持续优化。

5. RAC 环境特别注意事项

  • 使用 gv$session 区分实例,kill 会话时需指定 @inst_id
  • 参数修改(如 sqlnet.ora)需同步至所有节点。
  • 监控工具应考虑全局视图。

6. 示例:快速查看空闲会话分布(当前环境)

根据您提供的数据:

  • PROCESSES = 1400
  • 总连接 1087,其中 INACTIVE 964,ACTIVE 123
  • INACTIVE 占比 68.86%

剩余进程数应为 313。若进程数持续逼近 1400,需立即干预。建议按上述步骤诊断源头,优先调整应用连接池,同时设置 IDLE_TIMEEXPIRE_TIME 作为兜底。

通过以上系统性排查与处理,可有效控制 INACTIVE 会话,保障数据库稳定运行。

关于作者

网名:飞天,墨天轮2024年度、2025年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证、MySQL 8.0 OCP认证以及OBCA、KCP、KCSM、ACP、YCP、HCIP-openGauss、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgreSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论