果冻想
认真玩技术的地方

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

有始有终

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

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

关闭“三步走”

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

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

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

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

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

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

  • NORMAL方式;
  • IMMEDIATE方式;
  • TRANSACTIONAL方式;
  • ABORT方式。

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

NORMAL方式

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

  • 允许新的连接请求;
    关闭数据库时,当你敲出命令,按下回车;在你按下回车到数据库真正关闭这段时间内,如果还有用户连接数据库,Oracle是允许你连接的。这就好比,我的店要打烊了,但是我还允许顾客进来购物,这就有可能你的店永远不能打烊;

  • 由于允许新的连接请求,这就决定了不能轻易的断开用户的连接请求;需要等到所有用户自动退出以后,Oracle才会被关闭。如果你不阻止顾客的光临,你的小店可能需要724365服务了。

如果有用户就是不关闭连接。使用这种方式时,你永远也无法关闭数据库。输入以下命令,就是以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日 于呼和浩特。

未经允许不得转载:果冻想 » Oracle学习笔记——关闭数据库
网站维护离不开您的支持,您可以赞助本站,谢谢支持
×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

赞助本站
关注微信公众号
关注微信公众号和果冻一起分享你的疑惑与心得。
分享到: 更多 (0)

玩技术,我们是认真的

联系我们关于果冻