當某個數據庫用戶在數據庫中插入、更新、刪除一個表的數據,或者增長一個表的主鍵時或者表的索引時,經常會出現ora-00054:resource busy and acquire with nowait specified這樣的錯誤。sql
主要是由於有事務正在執行(或者事務已經被鎖),全部致使執行不成功。數據庫
一、用dba權限的用戶查看數據庫都有哪些鎖select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;windows
如:testuser 339 13545 2009-3-5 17:40:05
知道被鎖的用戶testuser,sid爲339,serial#爲13545session
select sql_text from v$session a,v$sqltext_with_newlines b
where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
and a.sid=&sid order by piece;oracle
查出來的sql,如: begin :id := sys.dbms_transaction.local_transaction_id; end;ide
三、kill該事務
alter system kill session '339,13545';ui
如增長表的主鍵:
alter table test
add constraint PK_test primary key (test_NO);this
若提示:ORA-00030: User session ID does not exist線程
alter session set events 'immediate trace name flush_cache level 1';unix
後果不詳
ORA-00031: session marked for kill
一些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
ORA-00031: session marked for kill
Cause: The session specified in an ALTER SYSTEM KILL SESSION command cannot be killed immediately (because it is rolling back or blocked on a network operation), but it has been marked for kill. This means it will be killed as soon as possible after its current uninterruptible operation is done.
Action: No action is required for the session to be killed, but further executions of the ALTER SYSTEM KILL SESSION command on this session may cause the session to be killed sooner.
kill -9 12345