一、現象描述
在ORACLE數據處理過程中,當某個PL/SQL developer正在運行創建一個臨時表對大的數據進行暫存處理時,由於處理速度很慢,這時突然做了中斷處理,甚至於直接從“任務管理器”中關掉PL/SQL developer。再次對該數據臨時表進行處理時,會發現無論是刪除、更新、查詢等操作,都處於一直的執行等待狀態。這種情況,很有可能是表已經被鎖住了。但是當查詢到死鎖會話,采用alter system kill session'sid,serial#';來處理時,卻提示報錯,無法殺掉線程,只能到操作系統級殺掉線程了。下面就對這種情況的處理過程進行詳細的說明。

二、解決方法
一些ORACLE中的進程被殺掉后,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫。但是shutdown immediate又怕可能進程殺不掉會一直停留在shutdown immediate,直接shutdown abort又怕損壞數據庫。現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
1、下面的語句用來查詢哪些對象被鎖:
select a.object_name,b.session_id,c.serial#,c.program,c.username,c.command,c.machine,c.lockwait from all_objects a,v$locked_object b,v$session c
where a.object_id=b.object_id and c.sid=b.session_id;
2、查詢鎖表原因以及sid、serial#
select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#, l.os_user_name, s.machine, s.terminal, a.sql_text, a.action from v$sqlarea a, v$session s, v$locked_object l where l.session_id = s.sid and s.prev_sql_addr = a.address order by sid, s.serial#;
3、用下面的語句用來殺死引起死鎖的進程:
alter system kill session 'sid,serial#';
注意:如果出現“ORA-00031:標記要終止的會話”的錯誤,則說明在數據庫級不能殺掉該死鎖進程,需要到操作系統級來處理了。如下圖所示:
可以通過下列語句查詢:
select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED';

4、如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在OS級再殺死相應的進程(線程),首先執行下面的語句獲得進程(線程)號:
select b.spid,a.osuser,b.program from v$session a,v$process b where a.paddr=b.addr and a.sid=176 --176就是上面的sid
5、在OS上殺死這個進程(線程)
1)、在unix/linux上,用root身份執行命令:#kill -9 9532(9532 即第4步查詢出的spid)
2)、在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個可執行命令,語法為:
orakill sid thread
其中:
sid:表示要殺死的進程屬於的實例名
thread:是要殺掉的線程號,即第3步查詢出的spid。
例:C:>orakill ACVS 9532
注意:這里要注意的是kill OS進程是在服務端操作,而不是你程序所在客戶機。