select username, status from v$session where sid= 524;2. KILLED状态的session还要多少时间才能消失?
SID STATUS
--------------- ----------
524 KILLED
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。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26277071/viewspace-708826/ ,如需转载,请注明出处,否则将追究法律责任。