1. 程式人生 > >Oracle報 ORA-00054資源正忙的解決辦法

Oracle報 ORA-00054資源正忙的解決辦法

1.查詢資料庫中的鎖

select * from v$lock;
select * from v$lock where block=1;

2.查詢被鎖的物件

select * from v$locked_object;

3.查詢阻塞

查被阻塞的會話
select * from v$lock where lmode=0 and type in ('TM','TX');

查阻塞別的會話鎖
select * from v$lock where lmode>0 and type in ('TM','TX');

4.查詢資料庫正在等待鎖的程序

select * from v$session where lockwait is not null;

5.查詢會話之間鎖等待的關係

select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;

6.查詢鎖等待事件
select * from v$session_wait where event='enqueue';

解決方案:
select session_id from v$locked_object; --首先得到被鎖物件的session_id
SELECT sid, serial#, username, osuser FROM v$session where sid = session_id; --通過上面得到的session_id去取得v$session的sid和serial#,然後對該程序進行終止。
ALTER SYSTEM KILL SESSION 'sid,serial';
example:
ALTER SYSTEM KILL SESSION '13, 8';

一些ORACLE中的程序被殺掉後,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟資料庫。現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。

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.下面的語句用來殺死一個程序:
alter system kill session '24,111'; (其中24,111分別是上面查詢出的sid,serial#)

【注】以上兩步,可以通過Oracle的管理控制檯來執行。

3.如果利用上面的命令殺死一個程序後,程序狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那麼可以在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。
例:c:>orakill orcl 12345