ora-04021 无法锁表的解决办法
案例場(chǎng)景:
? ? ? 備庫(kù)上有一張分區(qū)表,在做數(shù)據(jù)導(dǎo)入出了點(diǎn)問(wèn)題,需要truncate掉重新導(dǎo)入,在執(zhí)行truncate table時(shí)發(fā)生了04021錯(cuò)誤。
錯(cuò)誤分析:
? ? ? ora-04021的解釋是等待鎖定對(duì)象時(shí)發(fā)生超時(shí),就是說(shuō)truncate操作鎖定不了表(5分鐘內(nèi)不能鎖定對(duì)象就會(huì)提示超時(shí)),有某些進(jìn)程或會(huì)話正在使用此對(duì)象,truncate操作此時(shí)是不被允許的。
解決辦法:
? ? ? 1,比較消極的辦法就是等。官方Action:Retry the operation later,等到其他進(jìn)程或會(huì)話釋放對(duì)象后再執(zhí)行。
缺點(diǎn)是,如果遇到死鎖,進(jìn)程掛起,或者是一個(gè)長(zhǎng)事務(wù)在占用這個(gè)對(duì)象,那就不知道要等多久了。。
? ? ? 2,找到那個(gè)進(jìn)程在鎖定對(duì)象,kill掉。
首先查看是否在表上發(fā)生了死鎖,如果有kill掉進(jìn)程
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#';如果沒(méi)有發(fā)生死鎖,優(yōu)先考慮是否有進(jìn)程占用或掛起的情況,查詢正在執(zhí)行的sql語(yǔ)句
SELECT?b.sid?oracleID,??b.username?登錄Oracle用戶名,??b.serial#,??????? spid?操作系統(tǒng)ID,??paddr,??sql_text?正在執(zhí)行的SQLFROM?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 ‘%表名%’;
發(fā)現(xiàn)正在后臺(tái)運(yùn)行的跟此表相關(guān)的SQL語(yǔ)句,用alter system kill session 干掉他們,再執(zhí)行truncate,
查詢v$locked_object發(fā)現(xiàn)此表已經(jīng)被truncate的session鎖定,證明truncate操作已經(jīng)在執(zhí)行了。
?
------------------總結(jié)----------------
此次事件中,truncate不能鎖定對(duì)象,是因?yàn)橹坝幸粋€(gè)此表上的select count(*) 在跑,記得是之前執(zhí)行過(guò)的一個(gè)操作,但是結(jié)果一直沒(méi)有跑出來(lái),備機(jī)是通過(guò)堡壘機(jī)打開(kāi)shell窗口管理的,一段時(shí)間不操作后窗口斷掉,這條語(yǔ)句就一直在后臺(tái)執(zhí)行,也一直占用著對(duì)象。
轉(zhuǎn)載于:https://www.cnblogs.com/benbenduo/p/6726606.html
總結(jié)
以上是生活随笔為你收集整理的ora-04021 无法锁表的解决办法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java常用系统变量收集
- 下一篇: 第4章 第一个程序