1. 程式人生 > >發現操作系統的數據庫出現死鎖如何處理

發現操作系統的數據庫出現死鎖如何處理

ack cte 進行 username null amp 現在 res bstr

where q.address = s.sql_address
and q.hash_value = s.sql_hash_value
and s.paddr = p.addr
and exists (select sid
from v$lock
where block=1 and sid=s.sid);
如果提示no rows select(沒有行選中) ,則表示沒有業務方面的鎖,現在的鎖不影響業務系統的正常運行,如果有這些提示,表示已經有鎖已經影響業務系統的正常運行,根據下一步操作查詢導致死鎖語句,告之業務系統維護人員進行解鎖;
b) 輸入腳本
select nvl(s.username,‘Internal‘) username,
nvl(s.terminal,‘None‘) terminal,
L.sid||‘,‘||s.serial# kill,
u1.name||‘.‘||substr(t1.name,1,20) tab,
decode(L.lmode,1,‘No Lock‘,
2,‘Row Share‘,
3,‘Row Exclusive‘,
4,‘Share‘,
5,‘Share Row Exclusive‘,
6,‘Exclusive‘,null) lmode,
decode(L.request,1,‘No Lock‘,
2,‘Row Share‘,
3,‘Row Exclusive‘,
4,‘Share‘,
5,‘Share Row Exclusive‘,
6,‘Exclusive‘,null) request
from v$lock L,
v$session s,
sys.user$ u1,
sys.obj$ t1
where L.sid = s.sid
and t1.obj# = decode(L.id2,0,L.id1,L.id2)
and u1.user# = t1.owner#
and s.type != ‘BACKGROUND‘
order by 1,2,5;
如果提示no rows selected,,則表示沒有死鎖現象,如果有其他提示的,則表示有死鎖的現象。
可根據L.sid||‘查詢SQL語句:
SELECT sql_text FROM v$sqltext a WHERE a.hash_value = (SELECT sql_hash_value FROM v$session b WHEREb.SID =‘&sid‘)
將這些死鎖現象交給數據庫人員進行處理,
如果需要駐場人員進行進程的KILL,可以使用命令alter system kill session ‘kill字段的值‘; (kill字段的值即查詢出的L.sid||‘,‘||s.serial#數值)
3)Kill後,再次查找死鎖情況,確認沒有死鎖的情況,關閉CASE。
Ps:如果刪除KILL會話,提示為ora-000031,建議處理方法如下:
1) 使用命令
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24(sid 為L.sid||‘)
查詢出來的進程ID
2) 在linux下,用root身份運行,使用kill -9 12345
在windows下,orakill sid thread,其中: sid:表示要殺死的進程屬於的實例名,thread:是要殺掉的線程號,即第3步查詢出的spid。
例:c:>orakill orcl 12345

發現操作系統的數據庫出現死鎖如何處理