smon进程互为死锁案例--oracle一个bug处理[@more@]以下这篇文章发表在我的blog上。
贴到这里与大家共享。
=====================
环境:
OS: AIX 5.2
DB: oracle9206 RAC
两个实例上面smon进程都在等待enqueue事件。从而导致部分用户无法登陆,排序请求临时表空间也不行。。。
接到客户电话,说有些用户无法登陆,挂在那里,修改它的密码也是挂在那里。并且好多查询结果都出不来。。
登上去检查,发现smon进程在等待enqueue事件。所以引起了上面的现象。检查v$lock
A节点:
12 TX 2752512 475202 6 0
12 TM 22 0 3 0
12 TM 18 0 3 0
12 TX 1441873 792576 0 6
B节点:
12 TX 1441873 792576 6 0
12 TM 22 0 3 0
12 TM 18 0 3 0
12 TX 2752512 475202 0 6
从这里也可以发现,两个实例之间发生死锁了。
客户说他前一天晚上重起过数据库,重启后也是一样的。
检查smon进程的sql语句:
select o.owner#,o.obj#,decode(o.linkname,null, decode(u.name,null,'SYS',u.name),o.remoteowner),
o.name,o.linkname,o.namespace,o.subname
from user$ u, obj$ o where u.user#(+)=o.owner# and o.type#=1
and not exists (select p_obj# from dependency$ where p_obj# = o.obj#)
order by o.obj# for update;
从SQL语句上看,应该是smon进程在清理obj$对象。
在metalink搜索,发现oracle有个这样的bug,导致互为死锁。oracle提供了相应的补丁,但是没有aix上面的版本。
现在由于两个实例的smon进程都在清理obj$表格,从而导致了死锁,如果禁止掉一个smon进程清理obj$表格,这个bug不就可以避免了吗?
于是想起10052事件,其功能禁止smon进程清理obj$表。
event="10052 trace name context forever"
在其中一个实例上填加10052事件后,重启这个实例后,一切正常。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8225414/viewspace-899037/
,如需转载,请注明出处,否则将追究法律责任。