关于oracle session非法中断,无法释放的问题

这是前几天遇到的一个非常头痛的问题:

客户这边的网络不稳定, 一遇到网络故障, 连接在数据库上的近300的连接就变成了死session, 当网络故障排除后, 而数据库上的垃圾session还没有释放, 近300的客户端发起再一次的连接, 造成服务器物理内在占用率100%, 服务器拒绝任何新的连接.. #^&*^%$#$$#^%$&^%

这篇的内容是这个问题在ITPUB上的提问及各路英雄的回复, 以及我自己的摸索.

 

提问:

关于oracle session非法中断,无法释放的问题

环境: oracle 9.2.0.6
OS: hp-ux 11.23

客户端是一个不知道什么的应用程序,利用Oracle Client直接连接到数据库服务器, 每个客户端都直接连接数据库服务器, 没有中间件;

今天做了个测试, 在客户端启动一个程序,正常登录后, 把客户端电脑的网线拔掉, 客户端程序非法退出, 而服务器端查询v$session表, 发现有一个来自该客户端的进程不会被释放:
select username,status,osuser,program,terminal from v$session where terminal like '%IBM%';

重新将客户端电脑网络接通, 再次启动客户端应用程序, 再查看服务器v$session表, 发现2条来自该客户机的连接.

以上是现象, 这样可以判断出, 如果客户端应用程序非法中断, 则服务器上的session不会被释放, 在网上查询, 有网友说Oracle会隔段时间自动清理这些session, 不过至发贴为止有30分钟有余, 服务器仍然没有释放这些垃圾session.

请教, 该怎么来释放这些垃圾session, 或者说在服务器上的session在多长时间内没有活动就直接释放?
2楼:
关注
alter system kill session 'sid,serial#';
偶回复:
谢谢关注!
手动杀掉不太现实.
如果仅仅是因为我手动操作造成这样的问题还好, 可是我有将近500个这样的真实客户端, 而出现客户端程序非法中断的不在少数, 所以我需要数据库能自动的清除, 在尽可能短的时间里.

还有, 在出现这样的问题之后的约2个小时的时间, 数据库自动清除了这个垃圾session.
4楼:
是不是可以用profile文件里的idle_time或是connect_time来控制啊?
偶回复:
QUOTE:
原帖由 smmip 于 2008-5-22 09:41 发表
是不是可以用profile文件里的idle_time或是connect_time来控制啊?
idle_time或是connect_time参数会不会影响到当前正在连接,但暂时无操作的客户端啊, 老板明确要求不允许中断正常连接的客户端.

现在我仍然面临这样的问题, 刚才可能是中心的VPN中断, 导致约200用户的中断和重新连接, 接着很快, 内存占用就达到100%, 然后监听自动停止, 再然后OS拒绝新的连接, 再然后...被老板狂K...
再者, Oracle难道无法判断哪些连接已经被客户端非法中断, 哪些连接是正常连接吗?
idle_time的问题
对用户ABC做了idle_time的限制, 限制其值为5分钟. 发现以下问题:
1. 客户端连接到服务器, 然后空闲时间超过了idle_time的限制, 但是如果客户端一直空闲不做任何动作, 则该session会一直保留在服务器端不被中断, 直到客户端再次做查询或其它动作时, 如下例:
select username,program from v$session where username='ABC'
*
第 1 行出现错误:
ORA-02396: exceeded maximum idle time, please connect again
此时, 服务器才会中断该超时session

2. 客户端连接到服务器, 持续空闲时间超过idle_time的限制后, 在客户端继续保持空闲的情况下, 中断客户端的网络, 则该session又会变成垃圾session, 不再受客户端的影响, 不再受idle_time限制的影响.
8楼:
sqlnet.ora
设置expire_time
偶回复:
谢谢, 设了这个参数=2分钟后做测试, 发现在客户端如果是用sqlplus登录的话,则客房端断网2分钟内,服务器上的该session会终止,但在客户端用那个“#$W@#^%”程序登录,再拔掉网线,到这会儿半个小时了,服务器依然没有终止该session,不知何故?
$ more sqlnet.ora
sqlnet.expire_time = 2

$lsnrctl stop
$lsnrctl start
那个不听话的、超出expire_time限制的客户端:
Oracle 9.2.0.2 Client
Windows XP
客户端应用程序依赖oracle的$ORACLE_HOME/network/admin/tnsnames.ora来解决数据库服务器地址。
到这里就没人理了.
在网上找到了一贴子, 说可能是由于oracle的BUG引起的, 该贴如下:
主题: Bug 4185270 - PMON "failed to acquire row cache enqueue" cleaning a dead process
 文档 ID: 注释:4185270.8类型: PATCH
 上次修订日期: 03-APR-2008状态: PUBLISHED
Click here for details of sections in this note.

Bug 4185270 PMON "failed to acquire row cache enqueue" cleaning a dead process

This note gives a brief overview of bug 4185270.

Affects:

Product (Component)Oracle Server (Rdbms)
Range of versions believed to be affectedVersions < 11
Versions confirmed as being affected
  • 9.2.0.5
  • 10.1.0.4
  • 10.2.0.1
Platforms affectedGeneric (all / most platforms affected)

Fixed:

This issue is fixed in
  • 9.2.0.8 (Server Patch Set)
  • 10.1.0.5 (Server Patch Set)
  • 10.2.0.2 (Server Patch Set)
  • 11.1.0.6 (Base Release)

Symptoms:

Related To:

  • (None Specified)

Description

PMON may fail to clean up a process because it cannot get a row
enqueue held by that same process.

Workaround: 
  Restart the instance
目前只能先找时间给数据库升级到9.2.0.8试试了
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值