问题引入

在 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_LIMIT 与 PROFILE 的
IDLE_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 分钟)。 - 连接验证:启用
testOnBorrow或testWhileIdle,避免无效连接堆积。 - 最大生命周期:设置
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_TIME 和 EXPIRE_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
如有任何疑问,欢迎大家留言,共同探讨~~~




