IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Oracle学习笔记——关闭数据库

    果冻想发表于 2015-06-02 15:33:36
    love 0

    有始有终

    在《Oracle学习笔记——数据库启动原理》这篇文章中,总结了关于Oracle启动过程中涉及的一些知识点,以及Oracle启动的一些基本的原理知识。说完了启动,那么这篇文章就要说到关闭了。数据库有关就有闭了,而这个关闭数据库的操作,在工作中却经常遇到,所以对于如何关闭Oracle数据库,我就总结了这篇文章。

    工作中为什么要关闭数据库呢?有的时候,进行上线任务,需要将当前生产数据库切换到容灾库,切换完成以后,关闭生产数据库,进行一系列的上线操作,上线完成以后,启动生产数据库,并从容灾库切换回来。这就是实际工作中遇到的场景,需要对数据库进行启、停操作。

    关闭“三步走”

    有了《Oracle学习笔记——数据库启动原理》这篇文章的铺垫,大家都知道了数据库的启动分为三步;同理,对于数据库的关闭,也分为三步,而这三步正好与启动的三步是一一对应的关系:

    1. 关闭数据库; (对应打开数据库)
    2. 卸载数据库; (对应加载数据库)
    3. 关闭实例。 (对应启动实例)

    在关闭数据库阶段,Oracle首先把SGA中的数据写到数据文件和重做日志中。然后,Oracle关闭所有的数据文件和重做日志文件。此时,不是管理员的你不再可以访问数据库了。

    在成功关闭数据库以后,就需要卸载数据库,这一步只是将数据库与实例接触绑定关系,实例并没有被关闭,接下来就需要关闭实例。

    关闭实例也就是关闭所有的Oracle相关后台进程,以及释放启动实例时申请的内存。这一步成功完成以后,也就意味着数据库成功的被关闭了。

    以上是关闭数据库的具体的三个步骤,但是从命令行操作的角度来说,对于Oracle数据库的关闭方式有以下四种:

    • NORMAL方式
    • IMMEDIATE方式
    • TRANSACTIONAL方式
    • ABORT方式

    下面就对这四种关闭数据库的方式进行详解。

    NORMAL方式

    这是一种最糟糕,使用最少(至少我几乎不用)的一种关闭数据库的方式。为什么糟糕?由于这种方式实在是太慢了,导致使用者有的时候是无法忍受的,使用这种方法关闭数据库时会进行以下的操作:

    • 允许新的连接请求;
      关闭数据库时,当你敲出命令,按下回车;在你按下回车到数据库真正关闭这段时间内,如果还有用户连接数据库,Oracle是允许你连接的。这就好比,我的店要打烊了,但是我还允许顾客进来购物,这就有可能你的店永远不能打烊;
    • 由于允许新的连接请求,这就决定了不能轻易的断开用户的连接请求;需要等到所有用户自动退出以后,Oracle才会被关闭。如果你不阻止顾客的光临,你的小店可能需要7*24*365服务了。

    如果有用户就是不关闭连接。使用这种方式时,你永远也无法关闭数据库。输入以下命令,就是以NORMAL方式关闭Oracle数据库:

    SHUTDOWN NORMAL;
    
    -- 你也可以直接SHUTDOWN
    SHUTDOWN;

    IMMEDIATE方式

    这种关闭数据库的方式在工作中是使用频率最高的一种方式,使用这种方法关闭数据库时会进行以下的操作:

    • 新的连接请求都不会被允许;
      关闭数据库时,当你敲出命令,按下回车,数据库不会再一瞬间就会被关闭的;在你按下回车到数据库真正关闭这段时间内,如果还有用户连接数据库,此时是不会连接成功的;
    • 未提交的事务将会被回滚;
      当按下回车,发出关闭数据库的指令时,以前一直保持连接的用户,可能存在着一些未提交的事务,而在IMMEDIATE方式下,这些未提交的事务都会进行回滚,所以不会发生数据的不一致性;
    • 直接干掉所有连接的用户;
      当按下回车,发出关闭数据库的指令时,而在IMMEDIATE方式下,Oracle没有耐心去等待所有保持连接的用户主动退出,而是会单方面直接切断用户的连接。

    使用这种方式关闭数据库的好处是——安全,所有未提交的事务都回滚了,当再次启动数据库时不需要进行实例恢复。输入以下命令,就是以IMMEDIATE方式关闭Oracle数据库:

    SHUTDOWN IMMEDIATE;

    TRANSACTIONAL方式

    这种方式虽然很慢,但是很人性化,为什么说它人性化呢,你看看它做的事情就知道了:

    • 不允许新的用户连接数据库;
    • 不允许建立新的事务;
    • 所有的事务完成以后才关闭数据库;(你的数据有保障)
    • 一个会话执行完手里的事务后将被强行断开与数据库的连接。

    这种方式很安全,你的数据肯定是不会被丢失的;但是很慢,你要等到所有的事务完成以后,才会关掉。

    ABORT方式

    这是最粗鲁、最野蛮的关闭方式。当你需要使用这种方式时,顺便祈祷一下数据库不要出现问题,使用这种方式,看看都会进行以下的操作:

    • 不允许新的连接和新的事务;
    • 客户端的SQL语句立刻被终止;
    • 未提交的事务不被回滚(哦,你的数据!!!不一致性)
    • Oracle终止所有连接;

    看到了么?都是强制手段,Oracle单方面撕毁所有“合同”;一般使用这种方式关闭数据库时,应该是出现什么问题了。

    当我们使用以下命令重启数据库时,就意味着,背后在使用ABORT方式关闭数据库:

     STARTUP FORCE;

    打个比方

    关闭Oracle数据库就好比超市晚上打烊。

    • 对于NORMAL方式来说,超市永远都不会拒绝客人,来一位就接待一位,来两位就接待两位;同时也永远不会赶客人,不会出现“我们要下班了,你们立刻出去,我们不做生意了”这种情况;顾客是上帝,只有所有的顾客都满意的离开超市以后,才会打烊;
    • 对于IMMEDIATE方式来说,到了打烊的点了,立马不接待新的顾客;而超市现有的没结账的顾客,需要将选购的物品再放回货架,然后将这些顾客通通赶出去,然后说一句:我们打烊了,明天再来吧。
    • 对于TRANSACTIONAL方式来说,到了打烊的点了,新的顾客就不会被接待了,而超市现有没结账的顾客还可以继续选购自己的货物,直到你付账离开;当所有的顾客都离开以后,超市就可以打烊了;
    • 对于ABORT方式来说,到了打烊的点,新的顾客就不会被接待了,而超市现有没结账的顾客会要求立刻结账,不允许再选购物品了,然后就关门大吉。

    这就是关闭Oracle数据库的几种方式,你清楚了吗?

    2015年5月22日 于呼和浩特。



沪ICP备19023445号-2号
友情链接