解决方案 »

  1.   

    一般我都是直接在v$session中直接找到SID 和serial#来kill掉会话
      

  2.   

    一般我都是直接在v$session中直接找到SID 和serial#来kill掉会话问题是怎么确定执行这个存储过程的是哪个会话呢
      

  3.   

    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服务
      

  4.   

    一般我都是直接在v$session中直接找到SID 和serial#来kill掉会话问题是怎么确定执行这个存储过程的是哪个会话呢select DISTINCT T1.SID,T1.SERIAL#,T2.SQL_TEXT from v$session T1,V$OPEN_CURSOR T2 WHERE T1.SADDR=T2.SADDR;
      

  5.   


    相关的表没有发生死锁啊.感觉就是存储过程卡在那里了, 我是从两点判断的:
    1) plsql 里编译这个存储过程, 窗口卡死, 查看 v$session 里有 library cache pin 事件
    2) 存储过程分两步往表里插数, insert 和 merge into, insert 的字段已经有值了, merge 的字段还为空, 应该是卡在 merge 了我的存储过程是由JOB 调的, 过程卡了, JOB 也就卡在那里了. 刚才手动把JOB STOP 了, JOB新周期开始后已经正常了. 接下来准备优化merge....另外, job stop 后过程可以编译, 也近一步证实过程是一直在执行. 也发现在 JOB STOP 前后, 
    select t.name, t.pins, t.locks, t.* from v$db_object_cache t where upper(t.name) = 'PROC_NAME';
    里都能查到这个过程, 感觉用上面语句查"正在执行的存储过程" 不太靠谱. 还有自始至终没在 v$access 里看到这个过程, 所以也不确定网上说的用 v$db_object_cache 和 v$access 查正在执行的存储过程的方法是否好用....各种想不通谢谢~
      

  6.   

    一般我都是直接在v$session中直接找到SID 和serial#来kill掉会话问题是怎么确定执行这个存储过程的是哪个会话呢select DISTINCT T1.SID,T1.SERIAL#,T2.SQL_TEXT from v$session T1,V$OPEN_CURSOR T2 WHERE T1.SADDR=T2.SADDR; 在V$ACCESS 里找一个正在执行的存储过程测试了一下, 能找到过程里的SQL, 好用
    可惜我已经手动把JOB停了, 那个过程也停了, 等问题重现了再验证一下.谢谢前辈
      

  7.   

    plsql 看下 v$session ,应该很直观的看到sql把,kill掉即可。
      

  8.   


    终于明白了!
    我们的环境是RAC 双节点, 存储过程是由JOB 调度的, 原来JOB 是分节点的--可以先确定JOB 是在哪个节点上运行的
    select t.running_instance, t.* from user_scheduler_running_jobs t;
    --然后到对应节点上查正在执行的存储过程
    select t.sid, t.* from v$access t where t.object = 'PROC_NAME';
    --然后找到对应会话
    select t.sid, t.serial#, t.* from v$session t where t.sid = '&sid';
    --杀掉会话
    alter system kill session '&sid, &serial#';谢谢大家