Oracle session连接数和inactive的问题记录

 从上周起,服务器Oracle数据库出现问题,用不到半天,就会报maxsession(150)的问题,肯定是数据库的会话超过最大数了。
  由于服务器跑的是文件传输应用,占用的请求和会话肯定很大,因此用户数不大就已经让oracle的会话数达到最大值。
  处理方式不外乎两种:扩大oracle最大session数以及清除inactive会话,当然还有,就是从数据库连接池和程序bug上面下手。

从各处收集了一些查看当前会话的语句,记录一下:

1.select count(*) from v$session;
  select count(*) from v$process;
  查看当前总会话数和进程数,这两个视图就是跟会话及进程有关的重要视图啦,信息都是从这里面取的。

2.查询那些应用的连接数此时是多少
select  b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and  b.USERNAME is not null   group by  b.MACHINE  , b.PROGRAM order by count(*) desc;

3.查询是否有死锁
select * from v$locked_object;
如果查询结果为no rows selected,说明数据库中没有死锁。否则说明数据库中存在死锁。


接下来说明一下会话的状态:
1.active 处于此状态的会话,表示正在执行,处于活动状态。
2.killed 处于此状态的会话,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;
3.inactive 处于此状态的会话表示不是正在执行的,比如select语句已经完成。我一开始以为,只要是inactive状态的会话,就是该杀,为什么不释放呢。其实,inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。解决inactive的方法最好的就是在oracle中直接设置超时时间,也是有两种方法,区别暂时还不清楚:

1.修改sqlnet.ora文件,新增expire_time=x(单位是分钟)  
我的sqlnet.ora位置在D:/oracle/ora92/network/admin

2.通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。

<think>嗯,用户这次的问题是关于Oracle数据库的v$session视图,具体想了解wait_classstatus字段的含义,以及Idleinactive状态的区别。这个问题很专业,用户可能是DBA或者运维工程师,正在排查数据库性能问题。 从用户引用的资料来看,ta已经做了一些功课,比如注意到FIXED_TABLE_SEQUENCE字段可以用来监控session活跃度,还引用了关于session等待事件inactive状态处理的讨论。不过用户似乎对wait_class的分类两种空闲状态的区别还有些困惑。 关于wait_class字段,这是Oracle对等待事件的分类体系,12c之后有12个大类。需要特别强调"Idle"这个类,它包含的都是非工作状态的等待,比如SQL*Net message from client,这种等待通常不需要关注。其他如"User I/O"、"Concurrency"这些才是真正需要关注的性能瓶颈点。 status字段的inactiveidle区别确实容易混淆。inactive是逻辑上的"可工作但无任务"状态,比如应用连接池里的空闲连接;而idle是物理上的"无任何操作"状态。用户引用的材料3提到不处理inactive session是常见做法,这点很重要,因为kill掉它们可能导致中间件报错。 用户引用的例子4展示了FIXED_TABLE_SEQUENCE的变化,正好可以用来说明:只有活跃session这个值才会增长。这个细节可以补充进回答里,帮助用户理解监控原理。 考虑到用户正在研究session监控,可以在相关问题里加入ASH报表等待链分析的内容,这些都是DBA常用的进阶诊断手段。另外用户似乎对中间件连接也有兴趣,所以补充了连接池配置的问题。</think>以下是Oracle数据库`v$session`视图中关键字段的解释及状态分析: --- ### **1. `wait_class` 字段含义** - **定义**:表示会话当前或最后一次等待事件的类别,用于**快速定位性能瓶颈类型**。 - **常见值及意义**: - `User I/O`:用户读写数据文件(如全表扫描、索引扫描)[^2] - `Concurrency`:锁争用(如行锁、enqueue) - `Commit`:事务提交后的日志同步等待 - `Network`:网络传输延迟 - `Idle`:**非工作状态等待**(需重点关注其他类别) - `System I/O`:后台进程的I/O操作(如DBWR写数据文件) > 📌 **关键点**:`Idle` 类中的等待(如 `SQL*Net message from client`)通常无需优化,它表示会话正等待客户端指令。 --- ### **2. `status` 字段含义** - **定义**:会话的当前活跃状态。 - **主要状态对比**: | **状态** | **含义** | **是否消耗资源** | |--------------|--------------------------------------------------------------------------|------------------| | `ACTIVE` | 正在执行SQL或PL/SQL代码 | 是 | | `INACTIVE` | **连接已建立,但无SQL执行**(如应用连接池中的空闲连接) | 否(但占用内存) | | `IDLE` | **会话完全空闲**(如SQL*Plus连接后未执行命令) | 否 | | `KILLED` | 会话被DBA强制终止 | 部分残留 | --- ### **3. `Idle` vs `Inactive` 详解** - **`IDLE` 状态**: - 会话**无任何操作**,通常由客户端工具(如SQL*Plus)建立连接后未提交任务引起。 - 示例:用户登录数据库后未执行命令,会话显示为 `IDLE`。 - **`INACTIVE` 状态**: - 会话**已完成上一个任务,正等待新指令**,常见于应用服务器数据库连接池。 - 示例:Web应用通过连接池查询数据库后,连接返回到池中但未被复用,此时会话状态为 `INACTIVE`[^3]。 > ⚠️ **运维建议**: > - `INACTIVE` 会话可能占用内存进程数(受 `PROCESSES` 参数限制),但**强制终止可能导致应用报错**。 > - 监控建议:结合 `FIXED_TABLE_SEQUENCE` 值变化判断活跃度(如1小时内值未增长,说明会话完全空闲)[^1][^4]。 --- ### **4. 诊断性能问题示例** ```sql -- 检查非空闲等待的活跃会话 SELECT sid, serial#, username, wait_class, event, status FROM v$session WHERE status = 'ACTIVE' AND wait_class <> 'Idle'; ``` > 此查询可快速定位正在经历性能瓶颈的会话(如长时间等待 `User I/O` 或 `Concurrency`)[^2]。 --- ### **相关问题** 1. 如何根据 `v$session` 的 `wait_class` 定位数据库性能瓶颈? 2. `INACTIVE` 会话过多会导致什么风险?如何安全清理? 3. Oracle中如何区分会话是应用连接池保持还是真正的死连接? 4. `FIXED_TABLE_SEQUENCE` 字段在会话监控中的具体实践方法? [^1]: FIXED_TABLE_SEQUENCE 用于监控会话活跃度,其值增长表示会话在处理请求。 [^2]: `v$session` 的等待事件是性能分析起点,非空闲等待指向实际瓶颈。 [^3]: 强制终止 `INACTIVE` 会话可能导致中间件错误,需谨慎操作。 [^4]: 通过对比 `FIXED_TABLE_SEQUENCE` 值变化可判断会话是否在指定时间段内活跃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值