![](/img/trans.png)
[英]ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired, exception is java.sql.SQLException
[英]Why my statement failed with resource busy exception?
作為ETL流程的一部分,我有以下交換子分區語句:
ALTER TABLE DWH.QV_FACT_AMS EXCHANGE SUBPARTITION P08_2018_300_SALES WITH TABLE DWH.STG_QV_FACT_AMS;
(每個運行具有不同的子分區,但具有相同的2個表)。
我們開始得到一個例外:
ORA-00054:資源正忙,並且已指定NOWAIT進行獲取,或者超時已過期。
這意味着某些進程會更新表,而我們不能更改。
由於最終表-QV_FACT_AMS僅用於報告,而STG_QV_FACT_AMS是在ETL本身中創建的內部動態表,所以我不知道誰可以更新這些表。
ETL不能與ETL本身的另一次運行發生沖突,因此它不能試圖從這兩個進程中修改同一張表。
交換聲明每天運行很多次並完成正常,並且異常僅在晚上9點左右出現。
所以我在這兩個表上應用了AUDIT ALL:
AUDIT ALL on dwh.qv_Fact_ams;
AUDIT ALL on dwh.stg_qv_Fact_ams;
但是所有對表的訪問都不是在那幾個小時內進行的,只是選擇不應該鎖定表。
失敗日志的示例:
LOG_ID: 5879089
START_TIME: 18-07-2019 21:29:01
END_TIME: 18-07-2019 21:29:28
STATUS: FAILED
ORA_EXCEPTION: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
我們可以看到例外發生在18-07-2019 21:29:28。
這是審計:
SELECT *
FROM DBA_MAINT.AUD$
WHERE OBJ$NAME IN ('QV_FACT_AMS','STG_QV_FACT_AMS')
ORDER BY TIMESTAMP# DESC;
除了etl本身之外,唯一的訪問權限只有action#= 3(選擇),然后3小時后...
在會話級別上設置DDL_LOCK_TIMEOUT以找出誰阻止了該命令。
使用默認設置,鎖定表上的DDL將立即失敗:
--Session #1: Insert but do not commit:
create table table1(a number);
insert into table1 values(1);
--Session #2:
--ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
alter table table1 move;
相反,我們可以告訴Oracle等待一定的秒數,而不是立即失敗。
--Session #2:
--The second command will hang for 9999 seconds, or until the lock is free.
alter session set ddl_lock_timeout = 9999;
alter table table1 move;
這給了我們足夠的時間來調查哪些會話和語句阻塞了我們的命令。 查找阻止程序的方法有很多,並且可能有很多誤報。 這段代碼是一個很好的起點:
--Find potential blockers:
select sid, final_blocking_session, gv$session.*
from gv$session
where final_blocking_session is not null;
一旦有了FINAL_BLOCKING_SESSION(這是阻塞會話的SID),我們就可以找到有關該會話的更多信息,例如它正在運行的語句。 此SQL語句可以幫助調查阻止程序:
--Use the FINAL_BLOCKING_SESSION from above.
select *
from gv$sql
join gv$session
on gv$sql.sql_id = gv$session.sql_id
where sid = <final_blocking_session>;
希望其中的一些信息有意義並揭示了罪魁禍首。 由於更改沒有顯示在審計跟蹤中,因此我猜有一個SYS用戶在運行命令,因為SYS不在同一位置進行審計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.