博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORA-00054 资源正忙
阅读量:5284 次
发布时间:2019-06-14

本文共 2609 字,大约阅读时间需要 8 分钟。

现象:

    执行update、truncate提示 ORA-00054: resource busy and acquire with NOWAIT specified.

 

解决方法:

    因为系统是RAC系统,当时在第一个node没有查询到锁状态,查看第二台时候才看到锁的信息

 

1.查询数据库中的锁

  select * from v$lock;

  select * from v$lock where block=1;

2.查询被锁的对象

  select * from v$locked_object;

3.查询阻塞

  查被阻塞的会话

  select * from v$lock where lmode=0 and type in ('TM','TX');

  查阻塞别的会话锁

  select * from v$lock where lmode>0 and type in ('TM','TX');

4.查询数据库正在等待锁的进程

  select * from v$session where lockwait is not null;

5.查询会话之间锁等待的关系

  select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;

6.查询锁等待事件

  select * from v$session_wait where event='enqueue';

解决方案:

1)首先得到被锁对象的session_id

  select session_id from v$locked_object;

2)通过上面得到的session_id去取得v$session的sid和serial#,然后对该进程进行终止。

  SELECT sid, serial#, username, osuser FROM v$session where sid = session_id;
  ALTER SYSTEM KILL SESSION 'sid,serial';
example:

SQL> select session_id from v$locked_object;

SESSION_ID

----------
1383
1503
1503

SQL> SELECT sid, serial#, username, osuser FROM v$session where sid = 1383;

SID    SERIAL# USERNAME   OSUSER

---------- ---------- ------------     ---------------

1383      34768     CRMS         oracle

SQL>ALTER SYSTEM KILL SESSION '1383,34768';

 

一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。

 

1.下面的语句用来查询哪些对象被锁:

select object_name,machine,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;

2.下面的语句用来杀死一个进程:

alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)

以上两步,可以通过Oracle的管理控制台来执行。

3.如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:

select spid, osuser, s.program 
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24 (24是上面的sid)

4.在OS上杀死这个进程(线程):

1)在unix上,用root身份执行命令: 
#kill -9 12345(即第3步查询出的spid)
2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即第3步查询出的spid。
例:c:>orakill orcl 12345

 

 

------------------------------------------------------------------------------------

通过sessionid获取当前执行的sql语句:

select

substr(s.username,1,18) username,
s.sid,s.serial#,s.machine,y.sql_text
from v$session s,v$process p,v$transaction t,v$rollstat r,v$rollname n,v$sql y
where s.paddr = p.addr
and s.taddr = t.addr (+)
and t.xidusn = r.usn (+)
and r.usn = n.usn (+)
and s.username is not null
and s.sql_address=y.address
--and s.sid=3062
order by s.sid,s.serial#,s.username,s.status;

转载于:https://www.cnblogs.com/onlybobby/p/9478399.html

你可能感兴趣的文章
leetcode 383. 赎金信(Ransom Note)
查看>>
Mysql联合查询UNION和UNION ALL的使用介绍
查看>>
node js学习(二)——REPL(交互式解释器)
查看>>
百度地图简单使用——添加折线,圆形等(html,js)
查看>>
Spring @Transactional ——事务回滚
查看>>
发货出库单默认不设置打样仓库
查看>>
NMON记录服务器各项性能数据
查看>>
Xitrum学习笔记05 - 模板引擎
查看>>
JavaBase 变量,数据类型和运算符
查看>>
Android Audio Focus的应用(requestAudioFocus)
查看>>
1django 视图与网址
查看>>
实现如下语法的功能:var a = (5).plus(3).minus(6); //2
查看>>
MFC添加背景图片
查看>>
未找到arm-linux-gcc解决办法
查看>>
统计Xcode项目代码行数
查看>>
SharePoint回环检查(Loopback Check)相关问题
查看>>
戏说 .NET GDI+系列学习教程(三、Graphics类的应用_验证码)
查看>>
Oracle tnsnames.ora
查看>>
python_basic
查看>>
记录下神策数据春季校园招聘第一轮电话面试内容
查看>>