201939 oracle 解决死锁,解决JOB死锁

2024年2月19日 来读此前的文章,不知道自己在忙啥。
哈哈

今天truncate 一张表的时候,发现 提示:
ORA-00054: 资源正忙, 但指定以NOWAIT 方式获取资源, 或者超时失效
定位到,死锁

select * from v$locked_object; 

果真,有死锁。
根据 session_id 值,到 Tools-会话 里,找到 Sid 值 与 session_id 值一样的session,然后 关掉 该 session
再来 执行: select * from v$locked_object;
就没有死锁了!



以下为原文

原创:https://blog.csdn.net/hongping626/article/details/8002897

问题来源:
oracle一查,发现好多dba_jobs_running
好多 v$locked_object

约摸着因为job的运行,导致发生了死锁
而且,研究出,dba_jobs_running 与 v$locked_object 中是sid有关联关系

不过,根据上文连接中的指引
我是做的如下操作:

1 执行代码一:

select b.USERNAME,c.JOB,b.sid,b.serial#,spid,d.NEXT_DATE,d.WHAT
from v$process a,v$session b,dba_jobs_running c,dba_jobs d
where a.ADDR= b.paddr
and b.sid= c.SID
and c.JOB =d.JOB
order by next_date;
  1. 根据上文得出的 job号
    到 sql command中执行:
    exec dbms_job.broken(Job号, TRUE);
    这样的效果是,job的next_time 变成了 4000/1/1
    最好记得提交哦,我好像因为忘记提交,总是变不成 4000/1/1

  2. 根据上文得出的 spid,到 Windows的cmd执行:
    c:\Users\Administratror> orakill 数据库实例名 spid

    Linux 服务器,就是 ROOT用户执行: kill -9 spid

  3. 再次执行代码1,发现,刚才的 dba_running_jobs 已经不存在了

  4. 回到 sql中的 sql command中,执行:
    SQL> exec dbms_job.broken(341,false);
    以启用刚被禁用的job
    另外,同样要记得提交哦~

=================== 花絮 ==================
在确认了无running_jobs后
我又check了一下死锁情况
使用代码:
select a.* ,b.*,c.*
from v$process a,v$session b,v$locked_object c
where a.ADDR= b.paddr
and b.sid= c.session_id;
然后拿到spid后,直接执行第3步,直到所有死锁消失~

================= 新体验 =====================
今天遇到了一个情况,直接 broken 一个job的时候,进程会死掉
我是先 kill -9 spid,然后在 job还没有起来之时,赶紧 broken这个job
问题非常快地得到了解决。

链接中的每句话都是言简意赅啊!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值