万能是sql重启服务,不然,以下之:
在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个sql语句杀掉会话后,数据库并不会立即释放掉相关的资源,有时候你会发现锁定的资源很长时间也不会释放,即使会话状态为“KILLED”,依然会阻塞其它会话。
下面根据Eygel的"Oracle中Kill session的研究",构造一个案例看看kill session到底做了什么。如下所示
会话1:
会话2:
sql> show user
USER is "SYS"
update etl.test2 3090 会话3
select saddr,sid,serial#,paddr,username,status from v$session where username =upper('etl') or username ='sys');
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000025C233B00 27 33353 000000025F1D1FC8 ETL INACTIVE
000000025C23A608 37 11448 000000025F1D27B0 SYS ACTIVE
000000025C24BC50 63 54311 000000025F1D5F08 SYS ACTIVE
alter system kill '27,33353';
System altered.
SADDR SID SERIAL# PADDR USERNAME STATUS
--------------000000025C233B00 27 33353 000000025C21A0B0 ETL KILLED
000000025C23A608 37 11448 000000025F1D27B0 SYS ACTIVE
000000025C24BC50 63 54311 000000025F1D5F08 SYS INACTIVE
如下所示,我杀掉了其中两个会话后,这两个会话的地址都变为000000025C21A0B0了(请见PADDR列)。当在Oracle中kill session以后,Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断。然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON来清除该session.这被作为一次异常中断处理.
'63,54311';
000000025C233B00 27 33353 000000025C21A0B0 ETL KILLED
000000025C24BC50 63 54311 000000025C21A0B0 SYS KILLED
我们根据下面sql找到进程的地址,然后在v$process里面找到对应的spid,然后从操作系统中杀掉该进程。
2 minus
3 select s.paddr session s;
ADDR
--
000000025F1D1FC8
000000025F1D5F08
session
000000025C24BC50 63 54311 000000025C21A0B0 SYS KILLED
select addr,pid,spid,username from v$process where addr in ('000000025F1D1FC8','000000025F1D5F08');
ADDR PID SPID USERNAME
-- ---------- ------------ ---------------
000000025F1D1FC8 22 12959 oracle
000000025F1D5F08 38 12971 oracle
sql> ! kill -9 12959
kill -9 12971
000000025C23A608 37 11448 000000025F1D27B0 SYS ACTIVE