发现操作系统的数据库出现死锁如何处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发现操作系统的数据库出现死锁如何处理相关的知识,希望对你有一定的参考价值。
where q.address = s.sql_addressand q.hash_value = s.sql_hash_value
and s.paddr = p.addr
and exists (select sid
from v$lock
where block=1 and sid=s.sid);
如果提示no rows select(没有行选中) ,则表示没有业务方面的锁,现在的锁不影响业务系统的正常运行,如果有这些提示,表示已经有锁已经影响业务系统的正常运行,根据下一步操作查询导致死锁语句,告之业务系统维护人员进行解锁;
b) 输入脚本
select nvl(s.username,‘Internal‘) username,
nvl(s.terminal,‘None‘) terminal,
L.sid||‘,‘||s.serial# kill,
u1.name||‘.‘||substr(t1.name,1,20) tab,
decode(L.lmode,1,‘No Lock‘,
2,‘Row Share‘,
3,‘Row Exclusive‘,
4,‘Share‘,
5,‘Share Row Exclusive‘,
6,‘Exclusive‘,null) lmode,
decode(L.request,1,‘No Lock‘,
2,‘Row Share‘,
3,‘Row Exclusive‘,
4,‘Share‘,
5,‘Share Row Exclusive‘,
6,‘Exclusive‘,null) request
from v$lock L,
v$session s,
sys.user$ u1,
sys.obj$ t1
where L.sid = s.sid
and t1.obj# = decode(L.id2,0,L.id1,L.id2)
and u1.user# = t1.owner#
and s.type != ‘BACKGROUND‘
order by 1,2,5;
如果提示no rows selected,,则表示没有死锁现象,如果有其他提示的,则表示有死锁的现象。
可根据L.sid||‘查询SQL语句:
SELECT sql_text FROM v$sqltext a WHERE a.hash_value = (SELECT sql_hash_value FROM v$session b WHEREb.SID =‘&sid‘)
将这些死锁现象交给数据库人员进行处理,
如果需要驻场人员进行进程的KILL,可以使用命令alter system kill session ‘kill字段的值‘; (kill字段的值即查询出的L.sid||‘,‘||s.serial#数值)
3)Kill后,再次查找死锁情况,确认没有死锁的情况,关闭CASE。
Ps:如果删除KILL会话,提示为ora-000031,建议处理方法如下:
1) 使用命令
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24(sid 为L.sid||‘)
查询出来的进程ID
2) 在linux下,用root身份运行,使用kill -9 12345
在windows下,orakill sid thread,其中: sid:表示要杀死的进程属于的实例名,thread:是要杀掉的线程号,即第3步查询出的spid。
例:c:>orakill orcl 12345
以上是关于发现操作系统的数据库出现死锁如何处理的主要内容,如果未能解决你的问题,请参考以下文章