我在plsql 里编译一个存储过程, 窗口卡死, v$session 里出现 library cache pin 事件, 说明这个存储过程应该正在执行;
于是我想通过kill 会话来停止这个正在执行的存储过程;
--下面语句可以查到这个存储过程的记录, pins=0, locks=0
select t.name, t.pins, t.locks, t.* from v$db_object_cache t where upper(t.name) = 'PROC_NAME';
--但是查sid, v$access 里没有这个过程 (sys.v_$access里也没有)
select t.sid, t.* from v$access t where upper(t.object) = 'PROC_NAME';
我的疑问是, 这个存储过程到底是不是正在执行? 怎么把它手动停掉? 求教, 谢谢~
------解决方案--------------------
1)查找死锁的进程:
sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2)kill掉这个死锁的进程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
3)如果还不能解决:
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
其中sid用死锁的sid替换: exit
ps -ef
------解决方案--------------------
grep spid
其中spid是这个进程的进程号,kill掉这个Oracle进程
from:http://southking.javaeye.com/blog/550832
如果实在还不行,允许的话重启oracle服务
------解决方案--------------------
select DISTINCT T1.SID,T1.SERIAL#,T2.SQL_TEXT from v$session T1,V$OPEN_CURSOR T2 WHERE T1.SADDR=T2.SADDR;
------解决方案--------------------
plsql 看下 v$session ,应该很直观的看到sql把,kill掉即可。