“ORA-00054: 資源正忙,鎖表”以及“ORA-00031:標記要終止的會話”的解決方法


一、現象描述

     在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進程是在服務端操作,而不是你程序所在客戶機。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM