案例學習Oracle錯誤:ORA-00054
2024-08-29 13:38:25
供稿:網友
原文: ORA-00054 resource busy and acquire with NOWAIT specifie .
Cause:The NOWAIT keyWord forced a return to the command PRompt because a resource was unavailable for a LOCK TABLE or SELECT FOR UPDATE command.
Action:Try the command after a few minutes or enter the command without the NOWAIT keyword .
原因:對表進行相關操作時,該表被鎖定,或表正在被其他程序占用,導致系統忙。
解決:對表解鎖或等待完成。
案例1:取消事務之后重新構建索引的時候出現錯誤
問題描述:有一個事務花費的時間比正常的要長一些,所以用戶結束了這個會話(ctrl+alt+del)。現在,這個表有一個ROW-X 鎖。以下是有關鎖的具體信息:
OS User : rosemarie
OS PID : 396:482
Oracle User : ROSEM
Oracle ID : 27
Lock Type : DML
Lock Held : Row-X (SX)
Lock Requested : None
Status : Not Blocking
Object Owner : TOTALPLANT
Object Name : CUS_PRODUCTS
在重新構建這個表的索引的時候,得到如下錯誤信息:
alter index CUS_PRODUCT_IDX1 rebuild tablespace
TBSIDX_001
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT
specified
解決方案:當事務被取消的時候,事務所作的已經結束的工作需要回滾到上一個點。在取消之前,你的事務運行得時間較長,那么完全回滾的過程很可能也會較長。除非事務已經回滾完畢,否則,數據定義語言,例如ALTER INDEX REBUILD這樣的命令就不能獲得它要執行完畢所需要的鎖。這種類型的命令不會等待鎖被釋放。這就是為什么出現ORA-54錯誤信息的原因。在你獲得這個反饋的時間里,你的長的運行事務應該是已經回滾完畢。所以你再次運行ALTER INDEX REBUILD語句,應該是可以工作良好的。
案例2:停止回滾的方式
問題描述:有一個表,它有10個分區。每個分區都有1百萬行。我想要使用rid=1來刪除第1分區里面的行。它用了好長好長時間。所以我殺死了這個會話。現在,我的數據庫正在回滾,所有的行都刪除了。有沒有一種方法可以停止回滾?假如我馬上關閉,我估計它會用很長時間來關閉。假如我異常中止,當我重新啟動數據庫的時候,它會用很長很長的時間進行恢復嗎?我不關心數據是否被刪除了。我想要一種方法來"alter table xyz nologging",而不會出現"ORA-00054 resource busy ..."這個錯誤。
解決方案:你不能阻止系統回滾一個異常中止的事務。因為你殺死了會話,那么被取消的會話和系統除了回滾你所作的任何修改之外,別無選擇。系統不能由你來決定保持哪個取消的事務,以及除掉哪個。所以,它會回滾所有內容。即使是你關閉了數據庫并且進行了備份,它也仍然會在數據庫啟動之后執行回滾。你不必等待它的結束。一旦它回滾結束,你就不會收到ORA-00054錯誤信息了。