文章出處

PLSQL查詢表是否被鎖定(轉)

http://blog.sina.com.cn/s/blog_70717ff00100qb85.html

 (2011-05-08 13:13:06)
標簽: 

雜談

分類: SQL的種種
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid  
order by t2.logon_time;
 
--查死鎖--
select sess.sid,sess.serial#, lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_mode
from v$locked_object lo,dba_objects ao,v$session sess
where ao.object_id = lo.object_id
and lo.session_id = sess.sid
 
--查死鎖--
Select decode(request, 0, 'holder:', 'waiter:') || sid sid,id1,id2,lmode,request,type,ctime/60 鎖定時間
  from v$lock where (id1, id2, type) in
       (select id1, id2, type from v$lock where request > 0) order by id1, request;
       
--根據sid獲取進程詳情--
SELECT a.username,a.machine,a.program,b.spid,a.sid,a.serial#,a.status,c.piece,c.sql_text
  FROM v$session a, v$process b, v$sqltext c
 WHERE a.sid = '749'
   AND b.addr = a.paddr
   AND a.sql_address = c.address(+)
 ORDER BY c.piece;
 
-- add 2012-09-14
-- 數據表死鎖的解決方法(轉)
死鎖是數據庫經常發生的問題,數據庫一般不會無緣無故產生死鎖,死鎖通常都是由于我們應用程序的設計本身造成的。產生死鎖時,如何解決呢,下面是常規的解決辦法:

1)執行下面SQL,先查看哪些表被鎖住了: 
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;

2)查處引起死鎖的會話
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;
這里會列出SID

3) 查出SID和SERIAL#: 
查V$SESSION視圖: 
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛才查到的SID'; 
這一步將得到PADDR 

4)查V$PROCESS視圖: 
SELECT SPID FROM V$PROCESS WHERE ADDR='剛才查到的PADDR'; 
這一步得到SPID 

5)殺死進程 
(1)在數據庫中,殺掉ORACLE進程: 
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#'; 

(2)如果在ORACLE中不能殺死進程,我們只能到操作系統中,使用操作系統命令殺死進程 
KILL -9  “剛才查出的SPID”
在WINDOWS平臺,可以是偶那個orakill。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()