ORA-00031:session marked for kill處理oracle中殺不掉鎖的程式

xingfei80發表於2013-07-08

轉自:http://www.cnblogs.com/ReadCafe/archive/2013/06/06/3120742.html

一般Oracle 中的程式會透過PL/SQL 執行以下語句

select c.owner, c.object_name, c.object_type, b.sid, b.serial#, b.status, b.osuser, b.machine from
v$locked_object a, v$session b, dba_objects c
where b.sid = a.session_id
and a.object_id = c.object_id;

上面的語句得出 SID 和 SERIAL#

alter system kill session '137,1681' immediate;

其中 "137" 為 SID

"1681" 為SERIAL#

來進行"Killed" ,執行完之後,狀態為"Killed",但是鎖定的資源會很長一段時間不釋放,一開始沒有辦法,只好重啟資料庫。

後來,經過研究,搜尋資料,現提供下面的解決辦法,進行殺掉鎖的程式。

[@more@]

解決辦法如下:

1、透過上面的命令來殺死程式,程式的狀態會被置為"killed",但是鎖定的資源沒有被釋放,那麼可以在os一級再殺死相應的程式(執行緒),首先執行下面的語句獲得程式(執行緒)號:

select spid,osuser,s.program

from v$session s,v$process p

where s.paddr = p.addr and s.sid = '137'

注:這裡的 '137' 就是第一段語句查出來的SID,

執行上述語句,得出來的SPID 為 728

2、在OS 上通關cmd命令來殺死這個程式(執行緒)

1)第一種,在UNIX OS 上,用ROOT 身份執行下面的命令:

#kill -9 728 (728 1中的語句查詢出來的SPID)

2)第二種,在WINDOWS,用orakill殺死執行緒,

語法為:orakill sid thread

注:SID,這裡的SID 為你殺死該程式的資料庫的例項名

THREAD,指的是你要殺掉該程式的執行緒號,為1中查詢出來的SPID

例子如下:

C:Documents and SettingsAdministrator>orakill zghx 728

Kill of thread id 728 in instance zghx successfully signalled.

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

相關文章