zoukankan      html  css  js  c++  java
  • oracle shutdown immediate命令关闭数据库时,长时间无法关闭数据库

    原文: https://www.cnblogs.com/kerrycode/p/3435581.html

    在测试服务器上使用shutdown immediate命令关闭数据库时,长时间无法关闭数据库,如下所示

       1: [oracle@DB-Server admin]$ sqlplus / as sysdba
       2:  
       3: SQL*Plus: Release 10.2.0.4.0 - Production on Thu Nov 21 13:55:13 2013
       4:  
       5: Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
       6:  
       7:  
       8: Connected to:
       9: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
      10: With the Partitioning, OLAP, Data Mining and Real Application Testing options
      11:  
      12: SQL> shutdown immediate;


    在另外一个会话中,查看告警日志的输出结果,如下所示:告警日志信息在输出Active processes prevent shutdown operation后,就再无提示信息。

       1: [oracle@DB-Server bdump]$ tail -f 20 alert_epps.log 
       2:  
       3: Thu Nov 21 13:55:23 2013
       4: Starting background process EMN0
       5: Shutting down instance: further logons disabled
       6: EMN0 started with pid=59, OS id=19244
       7: Thu Nov 21 13:55:24 2013
       8: Errors in file /u01/app/oracle/admin/epps/udump/epps_ora_19242.trc:
       9: ORA-04098: trigger 'ADMIN.PIND_ON_SHUT' is invalid and failed re-validation
      10: Thu Nov 21 13:55:24 2013
      11: Shutting down instance (immediate)
      12: License high water mark = 10
      13: All dispatchers and shared servers shutdown
      14: Thu Nov 21 14:00:29 2013
      15: SHUTDOWN: Active processes prevent shutdown operation


    关于SHUTDWON IMMEDIATE关闭数据库方式:

    立即关闭方式(IMMEDIATE) 
         立即关闭方式能够在尽可能短的时间内关闭数据库,以立即方式关闭数据库时,ORACLE将执行以下一些操作: 
             *阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事物。 
             *任何未提交的事物均被回退。 
             *ORACLE不再等待用户主动断开连接,而是直接关闭、卸载数据库,并终止实例。


    方法1:

    此时可以通过下面命令Kill掉系统中(LOCAL=NO)的ORACLE进程

    [oracle@DB-Server ~]$ ps -ef|grep ora|grep -v grep|grep -v ora_|grep LOCAL=NO|awk '{print $2}' 
    [oracle@DB-Server ~]$ ps -ef|grep ora|grep -v grep|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill

    此时可以顺利关闭数据库。

    方法2:

    使用CTRL+C取消操作,然后使用shutdown abort命令关闭数据库。当然生产环境还是慎用shutdown abort命令,使用它往往是在没有办法的情况下。因为 
    shutdown abort 执行后,所有正在运行的SQL语句都将立即中止。所有未提交的事务将不回滚。Oracle也不等待目前连接到数据库的用户退出系统。下一次启动数据库时需要实例恢复,因此,下一次启动可能比平时需要更多的时间。

    方法3:网上比较通用的方法

    1 :首先停应用服务。 
    2 :其次停止监听服务(listener) 
    3 :间隔一段时间后,运行自己写的脚本去检查一下还有没有用户进程,如有, KILL. 
    4 :shutdown immediate;

    当然,有时候实际情况往往有些出入,例如步骤1,DBA没有应用服务器的权限。无法停止应用服务。当然也不妨碍后面步骤的执行。

    ---理论+实际问题

    问题引出:测试环境,进行oralce的shutdown immediate,等待时间很长,长的无法等待

    ORACLE shutdown 过程:

    1、shutdown normal(正常关闭方式):阻止任何用户建立新的连接;等待当前所有正在连接的用户主动断开连接;当所有的用户都断开连接后,将立即关闭数据库

    2、shutdown transactional(实务关闭方式):阻止用户连接新的连接和开始新事务;等待所有活动事务提交后,再断开用户连接;当所有的活动实务提交完毕、所有的用户都断开连接后,将关闭数据库

    3、shutdown immediate(立即关闭方式):阻止用户连接新连接和开始新事务;将未提交的活动事务回退;关闭数据库

    4、shutdown abort(终止关闭方式):阻止用户建立新连接和开始新事务;取消未提交的活动事务,而不是回退;立即终止正在执行的任何SQL语句;立即关闭数据库

    无疑,shutdown abort是最开速关闭数据库的方式,但是很可能会使数据库处于不一致状态,严重可能损坏数据库,导致数据库起不来,特别是生产环境。虽然现在是测试环境,但是也不建议这样做。推荐使用shutdown immediate方式关闭数据库。

    快速关闭数据库的因素:

    1、连接的客户端进程数量

    2、未提交的事务占用的UNDO BLOCK数量

    3、长时间运行的会话

    4、SMON进程清理临时段的速度

    2、查看预警日志文件(alert_sid.log)的位置 

    SQL> show parameter dump 
    NAME TYPE VALUE 
    ------------------------------------ ----------- ------------------------------ 
    background_core_dump string partial 
    background_dump_dest string /u01/oracle/admin/bdump 
    core_dump_dest string /u01/oracle/admin/cdump 
    max_dump_file_size string 10240 
    shadow_core_dump string partial 
    user_dump_dest string /u01/oracle/admin/udump 

    查看alert日志如下: /u01/oracle/admin/bdump/alert_biusdb.log  以下信息是样例

    Shutting down instance (immediate)
    Sat Aug 24 15:25:40 2013
    Shutting down instance: further logons disabled
    License high water mark = 683
    Sat Aug 24 15:30:39 2013
    Active call for process 26760 user 'orarep' program'oracle@pmsdb2'
    Active call for process 20349 user 'orarep' program'oracle@pmsdb2'
    Active call for process 1813 user 'orarep' program'oracle@pmsdb2'
    Active call for process 10694 user 'orarep' program'oracle@pmsdb2'
    Active call for process 26394 user 'orarep' program'oracle@pmsdb2'
    System State dumped to trace file /oraprep/oracle/admin/repdb/udump/repdb_ora_16122.trc
    Sat Aug 24 15:31:02 2013
    SHUTDOWN: waiting for active calls to complete.
    Sat Aug 24 15:31:02 2013
    Instance shutdown cancelled
    Sat Aug 24 15:35:56 EAT 2013
    Shutting down instance (immediate)
    Sat Aug 24 15:35:56 EAT 2013
    Shutting down instance: further logons disabled
    License high water mark = 683

    随机,手动kill掉这些数据库连接进程:

    eg:

    orarep@pmsdb2[/oraprep/oracle/admin/repdb/bdump]$kill -9 10694
    orarep@pmsdb2[/oraprep/oracle/admin/repdb/bdump]$kill -9 23362
    orarep@pmsdb2[/oraprep/oracle/admin/repdb/bdump]$kill -9 9944

    另外如果进程之多可以使用:

    ps aux |grep "LOCAL=NO" |awk '{printf "%s ", $2}' |xargs kill -9

    ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill

    命令

    随机再次关闭数据库:

    SQL> shutdown immediate

    Database closed.

    Database dismounted.

    总结:

    这是由于进程lock资源导致 的问题,因此需要先释放资源,完成数据库的关闭。

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/ss-33/p/13584225.html
Copyright © 2011-2022 走看看