查詢並刪除Oracle中等待的鎖

uuxa發表於2008-05-28

找到等待的鎖:

1.正在等待別人的使用者:

SELECT a.SID, a.serial#, a.machine, a.last_call_et, a.username, b.id1
FROM (SELECT a.username, a.SID, a.serial#, a.lockwait, a.machine, a.status,
a.last_call_et, a.sql_hash_value, a.program
FROM v$session a
WHERE NVL (a.username, 'NULL') < > 'NULL') a,
(SELECT id1, kaddr, SID, request, TYPE
FROM v$lock) b
WHERE a.lockwait = b.kaddr

2.被等待的使用者

[@more@]

SELECT a.SID, a.serial#, a.machine, a.last_call_et, a.username, b.TYPE,
a.status, b.id1
FROM (SELECT a.username, a.SID, a.serial#, a.lockwait, a.machine, a.status,
a.last_call_et, a.sql_hash_value, a.program
FROM v$session a
WHERE NVL (a.username, 'NULL') < > 'NULL') a,
(SELECT id1, kaddr, SID, request, TYPE
FROM v$lock) b
WHERE b.id1 IN (
SELECT DISTINCT e.id1
FROM (SELECT a.username, a.SID, a.serial#, a.lockwait,
a.machine, a.status, a.last_call_et,
a.sql_hash_value, a.program
FROM v$session a
WHERE NVL (a.username, 'NULL') < > 'NULL') d,
(SELECT id1, kaddr, SID, request, TYPE
FROM v$lock) e
WHERE d.lockwait = e.kaddr)
AND a.SID = b.SID
AND b.request = 0
3.刪除等待鎖的方法:

首先執行指令碼"正在等待別人的使用者.sql" 和"被等待的使用者" 來查詢鎖等待程式

若發現該阻塞其它使用者程式的程式是正常操作中,則可通知該使用者對其進行提交, 從而達到釋放鎖資源的目的;若為未正常操作,即,其狀態為"inactive",且其last_call_et已為較多長時間,則可執行以下語句將該程式進行清除:

alter system kill session 'sid, serial#'

說明: alter語句後面是一個包含sid和serial#的串,
在真正刪除會話時,可以使用指令碼"被等待的使用者.sql"和"正在等待別人的使用者.sql"來得到想要刪除的sid和serial#組合

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7416120/viewspace-1004786/,如需轉載,請註明出處,否則將追究法律責任。

相關文章