ITPub博客

首页 > 数据库 > Oracle > 【ASK_ORACLE】你知道怎么又快同时又干净地关闭Oracle数据库吗?

【ASK_ORACLE】你知道怎么又快同时又干净地关闭Oracle数据库吗?

原创 Oracle 作者:Attack_on_Jager 时间:2021-09-02 16:41:38 0 删除 编辑

实验环境

搭建平台:VMware Workstation

OS:RHEL 6.10

Grid&DB:Oracle 11.2.0.4


问题描述

1. 说到最快的关闭Oracle数据库的方法,相信大家肯定会想到“shutdown abort”,但是,以这种形式关闭数据库会使数据库处于不一致的状态(没有回滚),在这种情况下的备份在下次启动时需要恢复,所以达不到又快又干净的关闭方法的要求,所以pass。

2.  说到最干净的并且无需等待用户进程退出的关闭Oracle数据库的方法,相信大家肯定会想到“shutdown immediate”,但是这种方法并不是最快的,所以也pass。

那怎么做到最快最干净的关闭呢?我们不妨换个思路,综合一下这两种方法?有人可能说这不是搞笑吗,被我们骗进来了!其实不是,请大家继续往下看。


解决办法

1)通过下面的SQL查询判定干净的关闭数据库需要多少回滚(以字节计算)

select sum(used_ublk) * <block size of the undo / rollback segment tablespace> from v$transaction;


2)执行“shutdown abort”

这个方法将在数据库关闭时不进行事务回滚,可以最快的中断所有进程,比如客户端和后台,这种关闭方式可以理解为“服务器突然断电”。

执行shutdown immediate时,SMON进程会尝试中断所有客户端进程(SIGKILL),但是很多情况下SMON无法及时完成( 因为有些版本的bug也会导致 shutdown immediate命令无法停库,比如Oracle 11.1.0.7的dmon进程),所以要等待很久才能关闭,这是使用 shutdown abort的原因。

注:

可通过第一步的输出并结合你对需要停止的库的经验来判断并决定干净的关闭数据库的大致时间(shutdown immediate), 如果你不能等待shutdown immediate完成(不想干净关闭),剩下的步骤就可以不做,因为在下次启动时,SMON会回滚事务(可能会很慢)。 生产库非常不建议不干净的关闭!


3)执行“startup restrict”


4)通过下面的SQL查看回滚(块的个数)

select sum(distinct(ktuxesiz)) from x$ktuxe where ktuxecfl = 'DEAD';


5)当回滚完成 (有可能启动后立刻就完成了),再执行" shutdown immediate"可干净关闭数据库


知识延伸

1. 什么是一致性备份和非一致性备份?

使用RMAN的backup命令可以 进行数据库一致性和非一致性备份。

1)一致性备份Consistent Backups
当数据库为一致的状态可以进行一致性备份。我们知道,当数据库使用“shutdown immediate”、shutdown  normal”或者 “ shutdown transactional”命令关闭时,数据库为一致性状态。一致性关闭保证了所有redo的信息都被应用到了数据文件。如果在此时数据库在mount状态进行备份,可以直接从restore数据库并在打开open数据库时不需要再进行介质恢复。

2)非一致性备份Inconsistent Backups
任何不是一致性的备份都叫做非一致性备份。数据库不一致时的备份,比如在数据库正在运行,或者实例失败,或者“shutdown abort”后的备份。当数据库从一个非一致性备份restore数据库,Oracle在打开前必须执行介质恢复,从重做日志中应用变更。

注:
1. RMAN不允许在非归档模式下执行非一致性备份。
2. 只要数据库在归档模式下运行,就可以备份任何归档日志文件和数据文件, 非一致性备份是备份恢复策略的基础。非一致性备份提供了高可用性,因为它无需关闭数据库来进行备份,也完全保护了数据库。


2. shutdown超时怎么办?

关闭数据库将等待用户断开或者事务在限定的时间内完成。如果关闭操作由于有事件阻塞进而不能在一小时内完成,关闭命令将中止并显示下面的信息:ORA-01013: user requested cancel of current operation(这个信息也会在取消关闭进程时显示,比如执行CTRL-C),因为当ORA-01013发生,此时的实例是处在一个什么样的状态,我们不得而知。所以,必须重新执行SHUTDOWN命令来继续关闭进程。如果随后的shutdown命令仍旧失败,就需要执行“shutdown abort”使实例强行关闭,在这之后就可以重启实例了。


最后, 强烈 建议在数据库正常关闭的过程中,一定不要中断实例的关闭!需要等关闭进程完成了,再重启实例。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69992972/viewspace-2790117/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
在某银行任职DBA,拥有多年数据库运维经验,擅长Oracle,MySQL。尤其擅长Oracle的SQL优化,数据库性能调优,数据库备份、恢复与迁移。拥有的认证:OCM 12c,OCM 11g,MySQL OCP,RHCE,阿里云ACP,巨杉SCDP,软考系统集成工程师认证,Oracle Iaas OCA,OBCA,TDSQL认证,TBase认证

注册时间:2021-01-11

  • 博文量
    102
  • 访问量
    260141