当前位置:数据库 > Oracle >>

[Oracle]Kill Session经验总结

[Oracle]Kill Session经验总结
 
在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。
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,