ora-04021 無法鎖表的解決辦法


案例場景:

      備庫上有一張分區表,在做數據導入出了點問題,需要truncate掉重新導入,在執行truncate table時發生了04021錯誤。

錯誤分析:

      ora-04021的解釋是等待鎖定對象時發生超時,就是說truncate操作鎖定不了表(5分鍾內不能鎖定對象就會提示超時),有某些進程或會話正在使用此對象,truncate操作此時是不被允許的。

解決辦法:

      1,比較消極的辦法就是等。官方Action:Retry the operation later,等到其他進程或會話釋放對象后再執行。

缺點是,如果遇到死鎖,進程掛起,或者是一個長事務在占用這個對象,那就不知道要等多久了。。

      2,找到那個進程在鎖定對象,kill掉。

首先查看是否在表上發生了死鎖,如果有kill掉進程

select object_name,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;
alter system kill session 'sid,serial#';

如果沒有發生死鎖,優先考慮是否有進程占用或掛起的情況,查詢正在執行的sql語句

SELECT b.sid oracleID,  
       b.username 登錄Oracle用戶名,  
       b.serial#, 
       spid 操作系統ID,         paddr,         sql_text 正在執行的SQL
FROM v$process a, v$session b, v$sqlarea c   WHERE a.addr = b.paddr     AND b.sql_hash_value = c.hash_value   and sqltext like%表名%’;

發現正在后台運行的跟此表相關的SQL語句,用alter system kill session 干掉他們,再執行truncate,

查詢v$locked_object發現此表已經被truncate的session鎖定,證明truncate操作已經在執行了。

 

------------------總結----------------

此次事件中,truncate不能鎖定對象,是因為之前有一個此表上的select count(*) 在跑,記得是之前執行過的一個操作,但是結果一直沒有跑出來,備機是通過堡壘機打開shell窗口管理的,一段時間不操作后窗口斷掉,這條語句就一直在后台執行,也一直占用着對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM