日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ora-04021 无法锁表的解决办法

發布時間:2025/1/21 编程问答 97 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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窗口管理的,一段時間不操作后窗口斷掉,這條語句就一直在后臺執行,也一直占用著對象。

轉載于:https://www.cnblogs.com/benbenduo/p/6726606.html

總結

以上是生活随笔為你收集整理的ora-04021 无法锁表的解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。