Oracle 解除死鎖方法

2021-08-31 15:06:31 字數 1823 閱讀 9047

當利用pl/sql執行乙個sql語句的時候,有時候中途手動終止了該語句的執行,但是利用

--檢視正在執行的sql語句

select a.*,s.*

from v$sqltext a,v$session s

where s.status ='active' and s.sql_hash_value =a.hash_value

order by s.username,a.piece

會發現,該語句還在執行,這時候就要終止sql語句鎖對應的session,方法如下:

1. 利用「檢視正在執行的sql語句」找到該sql語句對應的sid 和 serial#

2. 執行alter system kill session 'sid,serial#' ,終止該session

3. 執行

select saddr,sid,serial#,paddr,username,status from v$session where username is not null

檢視session是否被成功終止,我們會發現被kill掉的session,狀態會被標記為killed,同時該session對應的paddr被修改,如果有多個session被kill,那麼多個被kill的session的paddr都被更改為相同的程序位址。

但其實這種情況下,很多時候,session占用的資源是無法釋放的,我們需要查詢spid,在作業系統級來kill這些程序。我們可以通過如下語句檢視系統中被鎖的物件:

select lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username user_name,

o.owner, o.object_name, o.object_type, s.sid, s.serial#, p.spid

from v$locked_object l, dba_objects o, v$session s, v$process p

where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr

order by o.object_id, xidusn desc

4. 但是由於被kill的session的paddr已經改變,我們無法通過v$session和v$process關聯來獲得該session對應os的程序。通過執行如下語句,來找到status=killed的session的addr,即為被kill掉的session的程序位址。

select s.username,s.status,

x.addr,x.ksllapsc,x.ksllapsn,x.ksllaspo,x.ksllid1r,x.ksllrtyp,

decode(bitand (x.ksupr***,2),0,null,1)

from x$ksupr x,v$session s

where s.paddr(+)=x.addr

and bitand(ksspa***,1)!=0

5. 現在我們獲得了session的位址,就可以在v$process中找到spid,select * from v$process v where v.addr='*******'

6. 登入作業系統,利用kill -9殺死對應的程序。

實際上,當在oracle中kill session以後, oracle只是簡單的把相關session的paddr 指向同乙個虛擬位址.此時v$process和v$session失去關聯,程序就此中斷.

然後oracle就等待pmon(oracle的後台程序之一,用來清理失敗的程序)去清除這些session.所以通常等待乙個被標記為killed的session退出需要花費很長的時間.

Oracle死鎖解除方法

查詢死鎖 select sess.sid,sess.serial lo.oracle username,lo.os user name,ao.object name,lo.locked mode,sess.machine from v locked object lo,dba objects ao,...

解除Oracle死鎖

解除oracle死鎖 1.查詢資料庫死鎖語句 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.sessio...

Oracle解除死鎖

電腦日益不給力,網路也隨時可能斷掉,用pl sql執行操作多多少少出現正在處理sql語句結果程式死掉了。導致這張表被鎖掉,無法執行sql操作。如何解除死鎖?1 執行下面sql,先檢視哪些表被鎖住了 select b.owner,b.object name,a.session id,a.locked ...