在ITPUB 论坛上看到一个有关实例恢复时 前滚(roll forword)和回滚(roll back)的讨论。在这里小整理一下,也理理自己的一个思路。

一. 什么时候需要实例恢复

在shutdown normal or shutdown immediate下,也就是所谓的clean shutdown,checkpoint也会自动触发,并且把SCN纪录写回。 当发生checkpoint时,会把SCN写到四个地方:

三个地方于control file内:

(1)SYSTEM CHECKPOINT SCN

(2)Datafile checkpoint SCN

(3)Stop SCN

一个在datafile header内:

Start SCN

1.1 Clean shutdown 时

当clean shutdown 时,checkpoint会进行,并且此时datafile的stop scn和控制文件里的start scn会相同。 等到open数据库时,Oracle检查datafile header中的start scn和存于control file中的datafile的scn是否相同, 如果相同,接着检查start scn和stop scn是否相同,如果仍然相同,数据库就会正常开启,否则就需要recovery。

等到数据库开启后,储存在control file中的stop scn就会恢复为NULL值,此时表示datafile是open在正常模式下了。

1.2 非正常shutdown

如果不正常SHUTDOWN (shutdown abort),则mount数据库后,会发现stop scn并不是等于其它位置的scn, 而是等于NULL,这表示Oracle在shutdown时没有进行checkpoint,下次开机必须进行crash recovery(实例恢复)。

注意一点:

(1)启动数据库时,如果发现STOP SCN = NULL,表示需要进行crash recovery;

(2)启动数据库时,如果发现有datafile header的START SCN 不等于储存于CONTROLFILE的DATAFILE SCN,表示需要进行Media recovery

1.3 crash recovery 顺序问题

必须先进行roll forward(从redo log file中从目前的start SCN开始,重做后面的已提交之交易)。 再从roll back segment 做rollback未完成(dead transaction)交易。检验controlfile中的SCN会等于datafile header的SCN

关于这块内容,具体参考:

RedoLog Checkpoint 和 SCN关系

http://blog.csdn.net/tianlesoftware/archive/2010/01/24/5251916.aspx

二.  Crash Recovery 过程

当数据库突然崩溃,而还没有来得及将buffer cache里的脏数据块刷新到数据文件里,同时在实例崩溃时正在运行着的事务被突然中断,则事务为中间状态,也就是既没有提交也没有回滚。这时数据文件里的内容不能体现实例崩溃时的状态。这样关闭的数据库是不一致的。

下次启动实例时,Oracle会由SMON进程自动进行实例恢复。实例启动时,SMON进程会去检查控制文件中所记录的、每个在线的、可读写的数据文件的END SCN号。

数据库正常运行过程中,该END SCN号始终为NULL,而当数据库正常关闭时,会进行完全检查点,并将检查点SCN号更新该字段。

而崩溃时,Oracle还来不及更新该字段,则该字段仍然为NULL。当SMON进程发现该字段为空时,就知道实例在上次没有正常关闭,于是由SMON进程就开始进行实例恢复了。

SMON进程进行实例恢复时,会从控制文件中获得检查点位置。于是,SMON进程到联机日志文件中,找到该检查点位置,然后从该检查点位置开始往下,应用所有的重做条目,从而在buffer cache里又恢复了实例崩溃那个时间点的状态。这个过程叫做前滚,前滚完毕以后,buffer cache里既有崩溃时已经提交还没有写入数据文件的脏数据块,也还有事务被突然终止,而导致的既没有提交又没有回滚的事务所弄脏的数据块。

前滚一旦完毕,SMON进程立即打开数据库。但是,这时的数据库中还含有那些中间状态的、既没有提交又没有回滚的脏块,这种脏块是不能存在于数据库中的,因为它们并没有被提交,必须被回滚。打开数据库以后,SMON进程会在后台进行回滚。

有时,数据库打开以后,SMON进程还没来得及回滚这些中间状态的数据块时,就有用户进程发出读取这些数据块的请求。这时,服务器进程在将这些块返回给用户之前,由服务器进程负责进行回滚,回滚完毕后,将数据块的内容返回给用户。

三. 为什么数据库的实例恢复是先前滚再回滚

回滚段实际上也是以回滚表空间的形式存在的,既然是表空间,那么肯定就有对应的数据文件,同时在buffer cache 中就会存在映像块,这一点和其他表空间的数据文件相同。

当发生DML操作时,既要生成REDO(针对DML操作本身的REDO Entry)也要生成UNDO(用于回滚该DML操作,记录在UNDO表空间中),但是既然UNDO信息也是使用回滚表空间来存放的,那么该DML操作对应的UNDO信息(在BUFFER CACHE生成对应中的UNDO BLOCK)就会首先生成其对应的REDO信息(UNDO BLOCK's REDO Entry)并写入Log Buffer中。

这样做的原因是因为Buffer Cache中的有关UNDO表空间的块也可能因为数据库故障而丢失,为了保障在下一次启动时能够顺利进行回滚,首先就必须使用REDO日志来恢复UNDO段(实际上是先回复Buffer Cache中的脏数据块,然后由Checkpoint写入UNDO段中),在数据库OPEN以后再使用UNDO信息来进行回滚,达到一致性的目的。

生成完UNDO BLOCK's REDO Entry后才轮到该DML语句对应的REDO Entry,最后再修改Buffer Cache中的Block,该Block同时变为脏数据块。

实际上,简单点说REDO的作用就是记录所有的数据库更改,包括UNDO表空间在内。

整理自网络

---------------------------------------------------------------------------------------------------

Blog: http://blog.csdn.net/tianlesoftware

网上资源: http://tianlesoftware.download.csdn.net

相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)

DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823

聊天 群:40132017  聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

转载于:https://www.cnblogs.com/springside-example/archive/2011/03/29/2529768.html

Oracle 实例恢复时 前滚(roll forward) 后滚(roll back) 问题相关推荐

  1. Oracle 实例恢复时 前滚(roll forward) 后滚(roll back) 问题

    在ITPUB 论坛上看到一个有关实例恢复时 前滚(roll forword)和回滚(roll back)的讨论.在这里小整理一下,也理理自己的一个思路. 一. 什么时候需要实例恢复 在shutdown ...

  2. mysql 回滚 前滚_Oracle 实例恢复时 前滚 后滚说明

    一. 什么时候需要实例恢复 在shutdown normal or shutdown immediate下,也就是所谓的clean shutdown,checkpoint也会自动触发, 一. 什么时候 ...

  3. Oracle 实例恢复--转自沙弥的世界

    --======================= -- Oracle 实例恢复 --======================= 一.Oracle实例失败 Oracle实例失败多为实例非一致性关闭 ...

  4. oracle实例恢复 redo,ORACLE不完全恢复之current或active状态redo损坏(二)

    完全恢复:是指介质恢复阶段(即执行recover命令时)必须应用所有的应该应用的重做记录:它们包括从数据文件头中的检查点RBA所指向的重做记录开始,一直到在线的当前的重做日志的最新一条 记录结束,不论 ...

  5. 实例恢复(Instance Recovery)之前滚(Rolling Forward)和回滚(Rolling Back)

    Oracle实例恢复(Instance Recovery)之前滚(Rolling Forward)和回滚(Rolling Back) 关于oracle实例恢复的一些理解,一直都有误区,今天通过查看相关 ...

  6. Oracle实例和Oracle数据库(Oracle体系结构)

    --========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...

  7. oracle 控制文件 scn,重建控制文件后, 控制文件中的数据文件检查点SCN来自哪里...

    重建控制文件后, 控制文件中的数据文件检查点SCN来自哪里 这个问题要看具体的情况,比如: 1. 数据库是shutdown immediate,也就是说数据库是一致的状态,重建控制文件后,SCN 以d ...

  8. oracle imp导入时出现skipping table

    最近有同事在使用传统的imp工具导入数据时,总是提示收到skipping table的提示,也就是表被跳过,而不是被重建.即使是将目标数据库上的表对象删除,仍然无法导入.因此记录一下,供大家参考. 1 ...

  9. linux 重启oracle实例_Oracle实战(二)-Oracle概述

    Oracle发展史 1970年 IBM的Codd博士发表A Relational Model of Data for Large Shared Data Banks 1978年 Oracle 1 汇编 ...

最新文章

  1. 李德毅院士:未来交通——自动驾驶与智能网联
  2. 链路追踪_springcloud-第九回 链路追踪Sleuth
  3. 计算机故障的分析原理,蓝屏含义、原理分析、处理方法 电脑计算机故障系统安全...
  4. Hi Azure. 从零开始打造一个语音机器人,跟你的电脑聊聊天。
  5. Java学习(三)面向对象异常
  6. python旅游推荐系统_如何用Python搭建一个简单的推荐系统?
  7. 【转】Mac本地生成SSH Key 的方法
  8. [react] 你有用过哪些React的UI库?它们的优缺点分别是什么
  9. 【转】VTK修炼之道2_VTK体系结构1
  10. idea+Springboot在控制台打印sql语句
  11. python二元函数图像在线绘制_用python绘制二元函数
  12. 常见系统故障修复(二)——修复GRUB引导故障
  13. flyway 实现 java 自动升级 SQL 脚本
  14. CAS:870041-75-0,DMAc-PP,热活化延迟荧光(TADF)材料
  15. hoolilaw解读:在美国如何应对交通罚单
  16. 闯荡Linux帝国:nginx的创业故事
  17. 域格4G模块TTS语音使用方法
  18. 无变压器的最简单开关稳压电源
  19. 宿州学院计算机录取分数线,2017宿州学院录取分数线
  20. 【汇正财经】大盘震荡收涨

热门文章

  1. springboot之jackson的两种配置方式
  2. c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2
  3. XML系列之--解析电文格式的XML(二)
  4. 刺激(codevs 1958)
  5. M2: XAML Controls(2)
  6. 一般处理程序使用Session报错(未将对象引用设置到对象实例)
  7. 数据库的内连接和外连接区别?
  8. 域名过期多长时间才能注册
  9. Spring 国际化例子
  10. mysql知识总结体会博客_可能是全网最好的MySQL重要知识点/面试题总结||CSDN博客精选...