在一个客户案例中,客户尝试关闭数据库启动归档模式,但是发现通过immediate方式无法关闭数据库,只能abort关闭,但是再次重新启动数据库之后,发现仍然无法正常关闭数据库,还是只能abort关闭,但是abort关闭数据库之后,下次启动需要执行数据库的实例恢复(Instance Recovery),无法启用归档模式。
诊断这个问题,首先在会话级别启用10046跟踪,然后执行shutdown 操作,示范如下:
[eygle@hpserver2 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.5.0 - Production on Fri Jun 15 17:24:23 2012 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. SQL> alter session set events '10046 trace name context forever,level 12'; Session altered. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down.
分析生成的跟踪文件,即可进行数据库关闭相关的分析。如下内容是在客户案例中生成的跟踪文件,跟踪文件显示,在immediate过程中,数据库以instance state change等待事件处于循环等待。该事件含义为:等待实例状态改变,此处是等待实例由Open变更为Close。这个等待只说明当前状况,造成等待的原因来自之前的SQL:
我们注意DELETE语句对SYS用户的mon_mods$表进行操作,该表的创建语句如下,可以看出其作用是为了记录对于数据库对象的修改操作,包括增(INSERT)删(DELETE)改(UPDATE)的次数:
create table mon_mods$ ( obj# number, /* object number */ inserts number, /* approx. number of inserts since last analyze */ updates number, /* approx. number of updates since last analyze */ deletes number, /* approx. number of deletes since last analyze */ timestamp date, /* timestamp of last time this row was changed */ flags number, /* flags */ /* 0x01 object has been truncated */ drop_segments number /* number of segemnt in part/subpartition table */ ) storage (initial 200K next 100k maxextents unlimited pctincrease 0) /
数据库关闭时需要执行的DELETE操作,目的是将那些OBJ$不存在的对象内容删除(可能有些对象被DROP掉),由于早期版本中,NOT IN操作的执行计划走了全表扫描,导致该操作可能极其缓慢。
在这个案例中,有两个选择,一是手工删除这些记录,或者多等一段时间,数据库完成这个删除操作之后,自然就可以正常关闭了。这个问题作为BUG,在Oracle 9i之后的版本中已经被修正。
最后修改时间:2019-07-24 10:37:57
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。