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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值