簡體   English   中英

為什么我的語句由於資源繁忙異常而失敗?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM