oracle死結解決常用方法(屢試不爽),oracle死結屢試不爽
--1.查詢被鎖的情況
select object_name,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s
where l.object_id = o.object_id and l.session_id=s.sid;
--2.用下面語句kill掉死結的進程
alter system kill session '24,111'; --(其中24,111分別是上面查詢出的sid,serial#)
--3.如果上述kill不掉,則查詢os層級線程
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24 --24是上面的sid
--4.在os層級刪除線程
--1)在unix上,用root身份執行命令:
#kill -9 12345(即第3步查詢出的spid)
--2)在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個可執行命令,文法為:
orakill sid thread
--其中:
--sid:表示要殺死的進程屬於的執行個體名
--thread:是要殺掉的線程號,即第3步查詢出的spid。
oracle死結
經常在oracle的使用過程中碰到這個問題,所以也總結了一點解決方案:)
1)尋找死結的進程:
sqlplus "/as sysdba"
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進程。
oracle經常死結,鎖定資料庫的一些表,導致oracle死結的原因一般有那些?
一般情況只發生鎖逾時,就是一個進程需要訪問資料庫表或者欄位的時候,另外一個程式正在執行帶鎖的訪問(比如修改資料),那麼這個進程就會等待,當等了很久鎖還沒有解除的話就會鎖逾時,報告一個系統錯誤,拒絕執行相應的SQL操作。發生死結的情況比較少,比如一個進程需要訪問兩個資源(資料庫表或者欄位),當擷取一個資源的時候進程就對它執行鎖定,然後等待下一個資源空閑,這時候如果另外一個進程也需要兩個資源,而已經獲得並鎖定了第二個資源,那麼就會死結,因為當前進程鎖定第一個資源等待第二個資源,而另外一個進程鎖定了第二個資源等待第一個資源,兩個進程都永遠得不到滿足。
erp100.com