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

來源於:http://www.cnblogs.com/loveLearning/p/3625544.htmlhtml

 

oracle之報錯:ORA-00054: 資源正忙,要求指定 NOWAIT數據庫

問題以下:windows

SQL> conn scott/tiger@vm_database
Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0
Connected as scottsession

。。。。。。oracle

SQL> drop table student2;post

drop table student2線程

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效
=========================================================unix

解決方法以下:htm

=========================================================對象

SQL> select session_id from v$locked_object;

SESSION_ID
----------
142

SQL> SELECT sid, serial#, username, osuser FROM v$session where sid = 142;

SID SERIAL# USERNAME OSUSER
---------- ---------- ------------------------------ ------------------------------
142 38 SCOTT LILWEN

SQL> ALTER SYSTEM KILL SESSION '142,38';

System altered

 

 

 

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

相關文章
相關標籤/搜索