當某個資料庫使用者在資料庫中插入、更新、删除一個表的資料,或者增加一個表的主鍵時或者表的索引時,常常會出現ora-00054:resource busy and acquire with nowait specified這樣的錯誤。
主要是因為有事務正在執行(或者事務已經被鎖),所有導緻執行不成功。
1、用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;
如:testuser 339 13545 2009-3-5 17:40:05 知道被鎖的使用者testuser,sid為339,serial#為13545
2、根據sid檢視具體的sql語句,如果sql不重要,可以kill
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;
查出來的sql,如: begin :id := sys.dbms_transaction.local_transaction_id; end;
3、kill該事務 alter system kill session '339,13545';
4、這樣就可以執行其他的事務sql語句了
如增加表的主鍵: alter table test add constraint PK_test primary key (test_NO);
若提示:ORA-00030: User session ID does not exist
alter session set events 'immediate trace name flush_cache level 1';
後果不詳
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.