Shutdown Immediate 挂起/活动的processes 阻止shutdown

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                        oracle@lgiora09 (q001)
  248                        oracle@lgiora09 (q000)
  251 DBSNMP                 emagent@lgiora09 (TNS V1-V3)
  252 SYSMAN                 OMS
  253 SYSMAN                 OMS
  254 DBSNMP                 emagent@lgiora09 (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)

posted @ 2018-03-01 13:06  sunshine_boy_h  阅读(289)  评论(0编辑  收藏  举报