oracle会话不释放,kill session之后,会话一直无法释放的巧妙解决办法(lsof)

我的数据库版本:

SQL> select * from v$version ;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

PL/SQL Release 10.2.0.4.0 - Production

CORE    10.2.0.4.0      Production

TNS for HPUX: Version 10.2.0.4.0 - Production

NLSRTL Version 10.2.0.4.0 - Production

下面这些非法连接,需要被kill掉:

SQL> select 'alter system kill session '''||sid||','||serial#||'''; ',client_info,program,status

2  from v$session where client_info like '132.224.36.10';

'ALTERSYSTEMKILLSESSION'''||SI             CLIENT_INFO    PROGRAM                    STATUS

------------------------------------------ -------------- -------------------------- --------

alter system kill session '1365,1937';     132.224.36.10  (TNS V1-V3)  INACTIVE

alter system kill session '1367,17258';    132.224.36.10  (TNS V1-V3)  INACTIVE

alter system kill session '1383,7729';     132.224.36.10  (TNS V1-V3)  INACTIVE

alter system kill session '1402,3818';     132.224.36.10  (TNS V1-V3)  INACTIVE

alter system kill session '1638,4784';     132.224.36.10  (TNS V1-V3)  INACTIVE

alter system kill session '1982,7247';     132.224.36.10  (TNS V1-V3)  INACTIVE

alter system kill session '2004,4734';     132.224.36.10  (TNS V1-V3)  INACTIVE

为避免出现kill session之后,会话长期存在,先保存一下spid,也方便与后面的方法做对比

一般在10g之后,不会出现session被kill之后,在v$process中无法找到spid的情况,但实际上,我又反复碰到了

SQL> select spid from v$process where addr in

2  (select paddr from v$session where client_info='132.224.36.10') ;

SPID

------------

15843

16581

13466

16862

8224

7332

12161

7 rows selected

利用上面的脚本杀掉下面的会话:

alter system kill session '1365,1937';

alter system kill session '1367,17258';

alter system kill session '1383,7729';

alter system kill session '1402,3818';

alter system kill session '1638,4784';

alter system kill session '1982,7247';

alter system kill session '2004,4734';

结果KILLED状态的会话一直不释放,查询v$process也找不到对应的spid

无法通过在server端kill spid来快速释放连接了

SQL> select sid,serial#,client_info,status from v$session where status='KILLED';

SID    SERIAL# CLIENT_INFO                    STATUS

---------- ---------- ------------------------------ --------

1365       1937 132.224.36.10                  KILLED

1367      17258 132.224.36.10                  KILLED

1383       7729 132.224.36.10                  KILLED

1402       3818 132.224.36.10                  KILLED

1638       4784 132.224.36.10                  KILLED

1982       7247 132.224.36.10                  KILLED

2004       4734 132.224.36.10                  KILLED

7 rows selected

SQL> select spid from v$process where addr in

2  (select paddr from v$session where status='KILLED') ;

SPID

------------

SQL>

SQL> select paddr from v$session where status='KILLED' ;

PADDR

----------------

C000000CFD7023D8

C000000CFD7023D8

C000000CFD7023D8

C000000CFD7023D8

C000000CFD7023D8

C000000CFD7023D8

C000000CFD7023D8

7 rows selected

因为知道IP地址等信息,我们可以通过lsof工具,根据netstat的端口情况来判定spid

下面给出的就是这个方法:

crmdb2:/oracle>netstat -an | grep tcp | grep 132.224.36.10 |grep ESTABLISHED

tcp        0      0  130.34.3.10.1521       132.224.36.10.55190     ESTABLISHED

tcp        0      0  130.34.3.10.1521       132.224.36.10.55040     ESTABLISHED

tcp        0      0  130.34.3.10.1521       132.224.36.10.55004     ESTABLISHED

tcp        0      0  130.34.3.10.1521       132.224.36.10.55163     ESTABLISHED

tcp        0      0  130.34.3.10.1521       132.224.36.10.55065     ESTABLISHED

tcp        0      0  130.34.3.10.1521       132.224.36.10.54982     ESTABLISHED

tcp        0      0  130.34.3.10.1521       132.224.36.10.55227     ESTABLISHED

crmdb2:/oracle>/usr/local/bin/lsof -i tcp:54982 |grep 132.224.36.10

oracle  16862 oracle   22u  IPv4 0xe000000b88c31a00  0t14832  TCP crmdb2_vip:1521->132.224.36.10:54982 (ESTABLISHED)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值