您好,欢迎访问一九零五行业门户网

oracle杀死死锁进程

先查看哪些表被锁住了 selectb.owner,b.object_name,a.session_id,a.locked_mode fromv$locked_objecta,dba_objectsb whereb.object_id=a.object_id; ownerobject_namesession_idlocked_mode -------------------------------------------------------------
先查看哪些表被锁住了
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
owner                          object_name                                 session_id locked_mode
------------------------------ --------------------------------------      -------
wssb                           sbda_pshpftdt                               22           3
wssb_rtrepos                   wb_rt_service_queue_tab                     24           2
wssb_rtrepos                   wb_rt_notify_queue_tab                      29           2
wssb_rtrepos                   wb_rt_notify_queue_tab                      39           2
wssb                           sbda_psdbdt                                 47           3
wssb_rtrepos                   wb_rt_audit_detail                          47           3
select b.username,b.sid,b.serial#,logon_time 
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
username                              sid    serial# logon_time
------------------------------ ---------- ---------- -----------
wssb_rtaccess                          39       1178 2006-5-22 1
wssb_rtaccess                          29       5497 2006-5-22 1
杀会话
alter system kill session 'sid,serial#';
e.g
alter system kill session '29,5497';
如果有ora-00031错误,则在后面加immediate;
alter system kill session '29,5497' immediate;
-------------
1.查哪个过程被锁
查v$db_object_cache视图:
select * from v$db_object_cache where owner='过程的所属用户' and clocks!='0';
2. 查是哪一个sid,通过sid可知道是哪个session.
查v$access视图:
select * from v$access where owner='过程的所属用户' and name='刚才查到的过程名';
3. 查出sid和serial#
查v$session视图:
select sid,serial#,paddr from v$session where sid='刚才查到的sid'
查v$process视图:
select spid from v$process where addr='刚才查到的paddr';
4. 杀进程
(1).先杀oracle进程:
alter system kill session '查出的sid,查出的serial#';
(2).再杀操作系统进程:
kill -9 刚才查出的spid

orakill 刚才查出的sid 刚才查出的spid
------------------
oracle的死锁
查询数据库死锁
select t2.username||'   '||t2.sid||'   '||t2.serial#||'   '||t2.logon_time||'   '||t3.sql_text
      from v$locked_object t1,v$session t2,v$sqltext t3
      where t1.session_id=t2.sid 
      and t2.sql_address=t3.address
      order by t2.logon_time;
查询出来的结果就是有死锁的session了,
下面就是杀掉
拿到上面查询出来的sid和serial#,填入到下面的语句中
alter system kill session 'sid,serial#';
一般情况可以解决数据库存在的死锁了,
或通过session id 查到对应的操作系统进程,在unix中杀掉操作系统的进程。
select a.username,c.spid as os_process_id,c.pid as oracle_process_id from v$session a,v$process c 
          where  c.addr=a.paddr and a.sid=  and a.serial#=  ;
然后采用kill (unix) 或 orakill(windows )
在unix中
ps -ef|grep os_process_id
kill -9 os_process_id
ps -ef|grep os_process_id
----
经常在oracle的使用过程中碰到这个问题,所以也总结了一点解决方法:)
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进程。
其它类似信息

推荐信息