[翻译自mos文章 ]Shutdown Immediate 挂起/活动的processes 阻止shutdown

本文介绍了解决Oracle数据库在执行'shutdown immediate'命令时出现挂起的问题。通常这是因为存在活跃的调用未完成导致。文章提供了几种解决方法,包括使相关会话处于非活动状态、强制关闭等。

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)

<think>好的,我现在需要帮用户解释一下这些Oracle数据库命令的作用:`connect / as sysdba`,`shutdown immediate`,和`exit`。首先,我得确认用户对Oracle的基本操作是否了解,可能他们是在管理数据库时遇到了问题,或者需要关闭数据库实例。 用户之前的问题是关于在Oracle 21c中调整bat脚本的,现在转向了具体的SQL*Plus命令,可能是在尝试手动关闭数据库时遇到了问题,或者想了解这些命令的具体用途。我需要分步骤解释每个命令的作用,确保他们理解每个步骤的意义,尤其是在生产环境中谨慎使用`shutdown immediate`的重要性。 接下来,要考虑到用户可能的使用场景。他们可能是在维护数据库,或者遇到故障需要关闭实例。需要提醒他们备份的重要性,以及这个命令可能带来的影响,比如中断当前连接的事务。同时,用户可能对权限有疑问,为什么需要使用`as sysdba`,这里需要解释操作系统认证和权限的问题。 另外,用户可能对命令的具体执行过程不太清楚,比如如何在SQL*Plus中运行这些命令,是否需要分号或者特定的格式。需要给出具体的示例,并说明每个步骤的结果,比如成功关闭后的提示信息。 还要注意潜在的风险,比如如果没有正确关闭数据库可能导致数据损坏,所以要强调只有在必要时才使用`shutdown immediate`,并确保有备份。同时,提醒他们重启数据库的步骤,可能需要`startup`命令,但用户当前的问题没有提到启动,所以可能不需要展开,但可以简要提及。 最后,用户可能有更深层的需求,比如如何自动化这些命令,或者在脚本中处理关闭和启动的情况,这时候可以建议他们参考之前的bat脚本调整,结合这些命令来实现完整的维护流程。但需要根据他们的问题范围来决定是否扩展,避免信息过载。</think>以下是Oracle数据库命令的详细解释及使用场景说明: ```sql connect / as sysdba shutdown immediate exit ``` **逐行解析:** 1. `connect / as sysdba` - **作用**:通过操作系统认证方式,以SYSDBA特权身份连接数据库 - **原理**: - `/`表示使用操作系统身份认证 - `as sysdba`获取数据库最高管理权限 - **适用场景**:本地服务器维护、紧急故障处理 - **权限要求**:当前操作系统用户需在`ORA_DBA`组(Windows)或`dba`组(Linux) 2. `shutdown immediate` - **作用**:立即关闭数据库实例 - **执行过程**: - 中断所有新连接 - 回滚未提交的事务 - 断开已连接的会话 - 最后关闭实例 - **与其它关闭模式对比**: - `shutdown normal`:等待所有会话主动退出(可能无限期等待) - `shutdown transactional`:等待事务完成 - `shutdown abort`:强制断电式关闭(需要后续恢复) 3. `exit` - **作用**:退出SQL*Plus命令行工具 - **扩展用法**:`quit`是等效命令 **完整执行示例:** ```sql C:\> sqlplus /nolog SQL> connect / as sysdba 已连接。 SQL> shutdown immediate 数据库已关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> exit 从 Oracle Database 21c Enterprise Edition 退出... ``` **注意事项:** 1. 生产环境慎用`shutdown immediate`,建议操作前: - 确认无活跃关键事务 - 提前通知用户下线 - 做好全量备份 2. 关闭后的重启流程: ```sql SQL> startup ORACLE 例程已经启动。 Database mounted. Database opened. ``` 3. Windows服务联动:执行关闭后,对应的`OracleService<SID>`服务仍会显示"已启动"状态,但实际实例已停止 4. 常见错误处理: - **ORA-01034**: 实例未启动 → 执行`startup` - **ORA-27101**: 内存分配失败 → 检查ORACLE_SID设置 - **ORA-12560**: 协议适配器错误 → 检查实例服务状态 **典型应用场景:** 1. 数据库迁移前的停止操作 2. 应用重大更新前的维护窗口 3. 调整需要重启生效的参数(如`memory_target`) 4. 解决资源锁死等紧急故障 建议在bat脚本中结合服务控制命令: ```bat net stop OracleServiceORCL sqlplus /nolog @shutdown.sql net start OracleServiceORCL ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值