阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired

139次阅读
没有评论

共计 2311 个字符,预计需要花费 6 分钟才能阅读完成。

一、故障描述:

早晨接到个开发人员的问题,truncat  table T_USER_LABEL 表时,报错:ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired,如下图。按照字面意思,是资源忙,被占用了。处理思路:查到谁在占用资源,并且杀掉占用该资源的会话就可以了。有可能产生的原因有:1. 创建索引时会产生的锁  2.dml 语句会产生的锁  3. 索引创建时加上关键字 online 时产生的锁。解决处理方法:1. 等待其他会话释放资源 2. 找出占用资源的会话,并删除 3. 重启数据库,当然只有第 2 种比较适用。
 
pl-sql 中报错:

ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired

sqlplus 中报错:

REPORTUSER@test > truncate table t_user_label;

truncate table t_user_label
              *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

二、故障处理
1. 检查哪个用户占用资源 T_USER_LABEL

SYS@test > select l.session_id,o.owner,o.object_name from v$locked_object l,dba_objects o where l.object_id=o.object_id;

SESSION_ID OWNER OBJECT_NAME
———- —————————— ————————————————–
      2205 REPORTUSER T_USER_LABEL
        76 REPORTUSER T_USER_LABEL
      1849 REPORTUSER T_TEMPORARY_CHANNEL_CUSTOMER
2. 利用查出来占用资源 T_USER_LABEL 的 session_id,查出更加详细的信息
点击 (此处) 折叠或打开

SYS@test > SELECT sid, serial#, username, oSUSEr, terminal,program ,action, prev_exec_start FROM v$session where sid = 2205;

      SID SERIAL# USERNAME OSUSE TERMINAL PROGRAM ACTION PREV_EXEC_START
———- ———- ———— —– ———- ————— —————————— ——————-
      2205 3045 REPORTUSER huhw PTYY-003 plsqldev.exe – procedure P_USER_LABE 2016-06-29 11:31:02

SYS@test > SELECT sid, serial#, username, osuser, terminal,program ,action, prev_exec_start FROM v$session where sid = 76;

      SID SERIAL# USERNAME OSUSE TERMINAL PROGRAM ACTION PREV_EXEC_START
———- ———- ———— —– ———- ————— —————————— ——————-
        76 1677 REPORTUSER huhw PTYY-003 plsqldev.exe SQL – ? 2016-06-29 14:00:54

3. 根据上面查出来的 SID,SERIAL# 杀掉占用资源 T_USER_LABEL 的两个会话

SYS@test > alter system kill session ‘2205,3045’;

System altered.

SYS@test > alter system kill session ‘76,1677’;

System altered.

4. 再次执行 truncate table 成功

REPORTUSER@test > truncate table T_USER_LABEL;

Table truncated.
 
三、总结
    问题回顾,通过上述查询信息中得出,有两个 SESSION 占用了 T_USER_LABEL 表资源,而且可以看出是在执行某个 procedure,名字为 P_USER_LABE,查看了这个 procedure 后,里面语句是通过查询其他表信息,最终要插入 T_USER_LABEL 表数据,在询问当事人后,昨天中午执行该 procedure 时,是强制中断了。导致最终没有提交事务,也未回滚,才会一直占用该资源。在这个案例中,学习掌握利用 v$locked_object 与 dba_objects 来找出哪个会话占用某对象,并且利用 v$session 来找出该会话的具体信息,包括 SID,SERIAL#,如何连接,正在执行什么等等。最终使用 alter system kill session‘sid,serial#’; 来 kill 掉占用资源的会话。

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137686.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2311字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中