Solaris5.9
集群件:veritas cluster server
文件系统:VXFS
oracle9207 on rac
接到电话,说在任何一个实例上无法创建任何数据库对象。之前曾经发生过此类故障,客户为重启实例后解决。结果这几天该故障重现,
查看到v$lock存在锁定情况,通过查询dba_waiters后发现sid为12的会话持有obj$表的锁。发现在v$sql中的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;
再通过与v$process关联取得spid后,发现此会话为smon进程。而该进程直接持有了obj$的锁。也就是说,两个实例SMON互锁,导致无法创建任何数据库对象。但是为什么会造成互锁呢?我们知道smon的作用是在实例启时负责进行恢复工作。此外,还负责清除系统中不再使用的临时段, 以及为数据字典管理的表空间合并相邻的可用数据扩展,而在RAC中,一个实例的 SMON 进程能够为出错的 CPU 或 实例进行实例恢复。这我们的情况中,RAC并没有出现实例crash. 当然不存在恢复。那么还有可能的情况就是清除临时段了,通过查询,我们发现运营商的DBA发生了一个严重的错误,那就是将temp表空间使用datafile来创建,而且并且是dict管理模式。这样导致了两个实例的smon相互对此临时段进行清除以及合并,从而导致了互锁,才导致后面出现的无法创建任何数据库对象。解决方法,重建temp表空间,使用tempfile,以及创建为local方式的temp tablespace.然后重启节点。另外一种方法就是使用
Event来禁止某个实例smon
Event=’ 10052 trace name context forever’;
目前我所采用的是第一种策略了.从半个月时间看来,数据库运行正常.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/104152/viewspace-139990/ ,如需转载,请注明出处,否则将追究法律责任。