http://blog.csdn.net/msdnchina/article/details/37613451
Shutdown Immediate 挂起/活动的processes 阻止shutdown
原文:Shutdown Immediate Hangs / Active Processes Prevent Shutdown (Doc ID 416658.1)
适用于:
Oracle Database - Enterprise Edition - Version 10.1.0.2 to 11.2.0.2 [Release 10.1 to 11.2]
Information in this document applies to any platform.
症状:
The ‘shutdown immediate‘ 命令 挂起 or 十分缓慢 ( is very slow )
The alert log 显示类似如下的信息:
SHUTDOWN: waiting for active calls to complete.
ACTIVE PROCESSES PREVENT SHUTDOWN OPERATION
原因:
这不是bug
如果DB Control repository 正在database 上运行,
并且该database 正是 试图 shutdown immediate 的对象。此时,使用了不正确的关闭顺序。
Current database sessions may show:
SQL> select SID, USERNAME, PROGRAM from v$session;
SID USERNAME PROGRAM
----- ---------------------- ----------------------------------
243 SYSTEM SQL Developer
246 SYSMAN OMS
247 [email protected] (q001)
248 [email protected] (q000)
251 DBSNMP [email protected] (TNS V1-V3)
252 SYSMAN OMS
253 SYSMAN OMS
254 DBSNMP [email protected] (TNS V1-V3)
255 SYSTEM java.exe
256 SYSMAN OMS
很明显,OMS and OEM 经由sysman 和dbsnmp用户被连接到数据库中(Oracle Enterprise Manager Grid Control or DBConsole)
在shutdown immediate 执行之前,这些session 应该是非活动状态(that is to log off any OEM, OMS, SYSMAN and DBSNMP)
Oracle Enterprise Manager, Grid Control, Dbconsole and agents 维持着一些内部处理操作。
这些操作包括 一些 运行在database上的 PLSQL notification procedures。
比如BEGIN EMD_NOTIFICATION.QUEUE_READY(:1, :2, :3); END;
根据 shutdown immediate 的内部文档,如果有active calls,shutdown 应该要等待直到所有的active calls被完成。
解决方案:
1. 假设 oem 连接 是active(SYSMAN and DBSNMP),de-activate这些session,比如,通过stopping the agent/DBConsole
2.然后再执行 shutdown immediate
----------or--------------------
在shutdown时,可能会有进程在running 并且持有了 lock。
有时,这些是失败的job or transaction,
这些失败的job or transaction 是 事实上的 ‘zombies‘,
这些失败的job or transaction 是 不能从oracle中接收到signal
如果情况是这样,the only 方法是通过如下方法关闭数据库:
sql>
shutdown abort
startup restrict
shutdown normal
startup 会做任何需要的recovery and cleanup,因此 之后 可以做一个valid 的冷备份。
如果这个问题经常发生,那么最佳实践就是 在shutdown instance之前,看一下v$session 和 v$process中有没有 any active user processes running
如果这个问题继续存在,并且没有可见的用户进程是active的,你可以在发出shutdown 命令之前设置下面的这个event,来看看什么会发生。
当shutdown hang是,该event每个5分钟 dump 了一个 systemstate。
SQL>
connect / as sysdba
alter session set events ‘10400 trace name context forever, level 1‘;
然后再发出shutdown 命令
3. 你可以kill 那些 阻止关闭的 session。
参考:Alert Log: Shutdown Waiting for Active Calls to Complete (Doc ID 1039389.6)