來源於: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