[Oracle] Kill Session 经验总结

长平狐 发布于 2013/06/03 15:03
阅读 116
收藏 0
在Oracle的日常维护中,经常出现以下两种情况需要我们DBA kill session:
1. App抱怨他们的应用hang住了,在数据库里查询得知他们的session被其它session block,此时要把其它session kill掉,以便App应用能及时跑完。
2. App的应用跑到一半,突然决定不跑了,需要DBA把他们的session kill掉。
以下是我经常采用的kill session的方法:
1. 在数据库层面用语句alter system kill 'sid, serial#'
2. 在某些特殊情况下,方法1无法使用,便在OS层面执行kill -9
采用以上方法经常碰到的问题是:对于那些已经跑了很久的session,不是一下子就能kill掉的,有时要等很久,此时就只能傻傻的在那等,当App那边的人问“session消失了吗?如果没有消失,还要等多久?”等等之类的问题的时候,总是无法给他们确切的答案,直到今天看了Ask tom里的一篇文章后,才找到解决方法。
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4974573906087

1. alter system kill 'sid, serial#'这条语句会做什么?
每当执行以下语句时:
A105024@O02DMS1>alter system kill session '524,24148';

System altered.

总是能很快的返回System altered的结果,很多人误以为此时session已经被killed了,其实不然,该语句只是发出一个命令,告诉这个session:你被killed掉了,如果此时session为空闲状态,它可以马上结束,但是如果此时session正在做一个事务,它在结束前需要将事务回滚,并释放锁。

因此,对于那些需要长时间回滚才能被kill掉的session来说,在执行alter system kill session之后,它的状态变成KILLED,比如:
select username, status from v$session where sid= 524;

SID             STATUS
--------------- ----------

524             KILLED


2. KILLED状态的session还要多少时间才能消失?

如果去评估KILLED状态的session还要多少时间才能消失呢?我们可以查询v$transcation中的USED_UBLK,比如used_ublks当前值为500,1分钟后剩下400,那么你可以估计该session大概还需要400/(500-400)=4分钟的时间才能结束,以下是一个实际中的例子:
select used_ublk from v$transaction;

USED_UBLK
----------
2262

1 row selected.

SQL> /

USED_UBLK
----------
1430

1 row selected.

SQL> /

USED_UBLK
----------
1103

1 row selected.

一直监控USED_UBLK的值,只要它不等于0,该session还是处于KILLED的状态:

select username, status from v$session where sid= 524;

SID             STATUS
--------------- ----------
524             KILLED

select used_ublk from v$transaction;

USED_UBLK
----------
1048

1 row selected.

SQL> /

USED_UBLK
----------
489

1 row selected.

SQL> /

no rows selected

没有USED_UBLK返回,说明回滚已经结束。

3.为什么USED_UBLK的值已经为0了,session还是显示killed的状态?

这是因为必需得等到client端收到ORA-00028错误之后,session才会消失,换句话说,即使session已经回滚完毕,但如果client端还没有确认,session还是保持在killed的状态,如:

select used_ublk from v$transaction;

no rows selected

虽然USED_UBLK已经为0了,但是session还是killed的状态:

select username, status from v$session where sid= 524;

SID             STATUS
--------------- ----------
524             KILLED

在client端,尝试任何执行语句,都会出现ORA-00028:

SQL> select instance_name from v$instance;
select instance_name from v$instance
*
ERROR at line 1:
ORA-00028: your session has been killed

此时session才会消失:

select username, status from v$session where sid= 524;

no rows selected

4. kill -9与alter system kill session的区别

alter system kill session的原理是让session自己把自己kill掉,也就是session自己回滚;而kill -9是让pmon清理session。
kill -9的速度看起来比alter system kill session要快一些,这是因为pmon会做一些并行的处理,让回滚更快一些,
但是kill -9不建议使用,因为:
1. 在OS层面直接kill进程,存在未知的风险;
2. 容易误操作,如果万一把Oracle的关键进程(如smon)kill掉,会造成数据库宕机的事故;
3. 无法监控事务回滚进度。
所以,不到万不得已的情况下,尽量不要用kill -9。
原文链接:http://blog.csdn.net/u010415792/article/details/8914598
加载中
返回顶部
顶部