ITPub博客

首页 > 数据库 > Oracle > 【ERROR】ORA-00054:resource busy and acquire with NOWAIT ...

【ERROR】ORA-00054:resource busy and acquire with NOWAIT ...

原创 Oracle 作者:yhdmy 时间:2016-06-30 16:39:45 0 删除 编辑
一、故障描述:
     早晨接到个开发人员的问题,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中报错:


sqlplus中报错:

点击(此处)折叠或打开

  1. REPORTUSER@test > truncate table t_user_label;
  2. truncate table t_user_label
  3.                *
  4. ERROR at line 1:
  5. ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

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

点击(此处)折叠或打开

  1. 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;

  2. SESSION_ID OWNER OBJECT_NAME
  3. ---------- ------------------------------ --------------------------------------------------
  4.       2205 REPORTUSER T_USER_LABEL
  5.         76 REPORTUSER T_USER_LABEL
  6.       1849 REPORTUSER T_TEMPORARY_CHANNEL_CUSTOMER

2.利用查出来占用资源 T_USER_LABEL的session_id,查出更加详细的信息

点击(此处)折叠或打开

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

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

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

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

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

点击(此处)折叠或打开

  1. SYS@test > alter system kill session '2205,3045';

  2. System altered.

  3. SYS@test > alter system kill session '76,1677';

  4. System altered.

4.再次执行truncate table 成功

点击(此处)折叠或打开

  1. REPORTUSER@test > truncate table T_USER_LABEL;

  2. 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 掉占用资源的会话。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26148431/viewspace-2121271/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
曾就职于铁道科学研究院,太极计算机公司,合力中税。负责过国家电网数据库部署、迁移、升级、灾备等实施规划工作。大唐发电厂、北京市公安局数据库运维及优化工作。现任工场高级DBA岗位,负责oracle、mysql数据库相关工作。拥有Oracle技术10g/11g的 OCP与OCM认证,Oracle YEP成员,OCM联盟成员。

注册时间:2013-04-22

  • 博文量
    111
  • 访问量
    1751021