Oracle杀死死锁进程

先查看哪些表被锁住了:

 
  
  1. select b.owner,b.object_name,a.session_id,a.locked_mode  
  2. from v$locked_object a,dba_objects b  
  3. where b.object_id = a.object_id;  
  4. OWNER OBJECT_NAME SESSION_ID LOCKED_MODE  
  5. ------------------------------ -----------------  
  6. WSSB SBDA_PSHPFTDT  22 3  
  7. WSSB_RTREPOS WB_RT_SERVICE_QUEUE_TAB  24 2  
  8. WSSB_RTREPOS WB_RT_NOTIFY_QUEUE_TAB  29 2  
  9. WSSB_RTREPOS WB_RT_NOTIFY_QUEUE_TAB  39 2  
  10. WSSB SBDA_PSDBDT 47 3  
  11. WSSB_RTREPOS WB_RT_AUDIT_DETAIL 47 3  
  12. select b.username,b.sid,b.serial#,logon_time  
  13. from v$locked_object a,v$session b  
  14. where a.session_id = b.sid order by b.logon_time;  
  15. USERNAME  SID  SERIAL# LOGON_TIME  
  16. ------------------------------ ---------- -------  
  17. WSSB_RTACCESS 39 1178 2006-5-22 1  
  18. WSSB_RTACCESS 29 5497 2006-5-22 1  
  19. 杀进程中的会话

    杀掉Oracle进程中的会话,语法如下:

     
        
    1. alter system kill session 'sid,serial#'; 

     

    例如:
     
        
    1. alter system kill session '29,5497'; 

     

    如果有ora-00031错误,则在后面加immediate:
     
        
    1. alter system kill session '29,5497' immediate; 

    如何杀死Oracle死锁进程

    1.查哪个过程被锁

    查V$DB_OBJECT_CACHE视图:

     
        
    1. SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0'; 

    2.查是哪一个SID,通过SID可知道是哪个SESSION

    查V$ACCESS视图:

     
        
    1. SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名'

    3.查出SID和SERIAL#

    查V$SESSION视图:

     
        
    1. SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'

     

    查V$PROCESS视图:
     
        
    1. SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR'

    4.杀进程

    (1)先杀Oracle进程:

     
        
    1. ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#'; 

    (2)再杀操作系统进程:

    KILL -9 SPID SPID为前面查出的操作系统进程号。