【錯誤整理】ora-00054:resource busy and acquire with nowait specified解決方法【轉】

當某個數據庫用戶在數據庫中插入、更新、刪除一個表的數據,或者增長一個表的主鍵時或者表的索引時,經常會出現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

二、根據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;oracle

查出來的sql,如: begin :id := sys.dbms_transaction.local_transaction_id; end;ide

三、kill該事務


alter system kill session '339,13545';ui

四、這樣就能夠執行其餘的事務sql語句了

如增長表的主鍵:
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

原文地址

相關文章
相關標籤/搜索