`

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

 
阅读更多

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

. 什么时候需要实例恢复

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

三个地方于controlfile内:

1SYSTEMCHECKPOINTSCN

2DatafilecheckpointSCN

3StopSCN

一个在datafileheader内:

StartSCN

1.1 Clean shutdown

cleanshutdown时,checkpoint会进行,并且此时datafilestopscn和控制文件里的startscn会相同等到open数据库时,Oracle检查datafileheader中的startscn和存于controlfile中的datafilescn是否相同,如果相同,接着检查startscnstopscn是否相同,如果仍然相同,数据库就会正常开启,否则就需要recovery

等到数据库开启后,储存在controlfile中的stopscn就会恢复为NULL,此时表示datafileopen在正常模式下了。

1.2 非正常shutdown

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

注意一点:

1)启动数据库时,如果发现STOPSCN=NULL表示需要进行crashrecovery

2)启动数据库时,如果发现有datafileheaderSTARTSCN不等于储存于CONTROLFILEDATAFILESCN表示需要进行Mediarecovery

1.3 crashrecovery 顺序问题

必须先进行rollforward(redologfile中从目前的startSCN开始,重做后面的已提交之交易) 再从rollbacksegmentrollback未完成(deadtransaction)交易。检验controlfile中的SCN会等于datafileheaderSCN

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

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表空间和数据文件的关系,否则拒绝申请

分享到:
评论

相关推荐

    oracle删除和重建实例

    重建 Oracle 实例是删除实例后的下一步骤。重建实例需要使用 dbca 工具或手动创建实例。下面是重建 Oracle 实例的步骤: 1. 进入实例重装页面:使用 dbca 工具或手动创建实例,进入实例重装页面。 2. 填写实例信息...

    Oracle实例死掉的情况下如何恢复

    通过对单实例和多实例不同场景下的处理方法的介绍,我们可以看出,在Oracle实例出现异常停止时,通过正确的诊断步骤和技术手段,能够有效地解决问题并尽快恢复数据库服务。无论是单实例还是多实例环境,关键在于准确...

    Oracle实例恢复

    Oracle实例恢复是一个重要的数据库管理任务,特别是在系统重装或硬件故障之后。Oracle数据库实例是由内存结构和后台进程组成,它们共同工作以管理数据库的运行。当系统经历重大变更,如操作系统重装,原有的实例配置...

    模拟Oracle实例崩溃后的恢复

    以下是对模拟Oracle实例崩溃后的恢复步骤的详细解释: 1. **设置数据库为归档模式**: 在Oracle中,归档模式是进行完整数据库恢复的关键,因为它记录所有事务的更改。通过SQL命令`archive log list`可以检查当前...

    oracle修改实例名

    标题《oracle修改实例名》与描述《修改oracle数据库的实例名,修改oracle数据库的实例名》暗示本文主要讲述的是在Oracle数据库中如何修改数据库实例名称的操作。实例名(也称作SID,即系统标识符)是数据库安装后在...

    手动创建oracle实例

    在手动创建Oracle实例时,需要通过SQL*Plus或其他工具来创建控制文件,并在初始化参数文件中指定其位置。 ### 四、创建数据文件和重做日志文件 数据文件存储实际的数据,而重做日志文件则记录了对数据的更改操作。...

    linux下oracle手动建实例

    - 初始化参数文件(pfile)是一个文本文件,包含了Oracle实例运行时需要的所有参数设置。 - 示例中创建了`initbgroup.ora`: ```bash sga_target=287309824 job_queue_processes=10 compatible=11.2.0 audit_...

    linux下oracle创建实例总结

    完成以上步骤后,即可成功创建一个新的 Oracle 数据库实例。这涉及到环境变量的配置、必要目录的创建、密码文件的建立以及初始化参数文件的详细设置。通过这些步骤,能够确保 Oracle 实例的安全运行和高效管理。

    oracle实例删除

    ### Oracle RAC 集群实例删除详解 #### 一、引言 Oracle RAC (Real Application Clusters) 是一种高可用性和可扩展性的数据库解决方案,它允许多个Oracle数据库实例同时访问同一个数据库。在Oracle RAC环境中进行...

    操作系统重装后oracle数据库的恢复

    重做操作系统后oracle数据库的恢复 文件夹中文件说明: ora.reg oracle主要注册项的恢复参考文件 oraodbc.reg odbc驱动项的恢复参考文件 oraole1~4.reg ole 驱动项的恢复参考文件 恢复中重要操作说明: 1、恢复前提...

    oracle实例名,服务名等概念区别与联系

    Oracle 实例名、服务名等概念区别与联系 Oracle 数据库中的实例名、服务名等概念经常会让初学者感到困惑。以下是对这些概念的详细解释。 数据库名 数据库名是数据库的标识,相当于人的身份证号码。它用参数 DB_...

    Oracle数据库恢复实例.pdf

    在这种情况下,Oracle会在下次启动时自动执行实例恢复,包括向前滚动以恢复未记录的数据、回滚未提交的事务、释放资源以及解决分布式事务的悬而未决状态。这一过程旨在将数据库恢复到故障前的事务一致状态。 不一致...

    oracle精品实例,练习总结

    实例可能包括如何创建备份策略,以及在数据丢失时如何恢复。 8. **安全性**:Oracle支持用户权限管理,如GRANT和REVOKE命令,以及角色的概念。实例将展示如何创建和管理用户,设定访问权限,以及如何使用审计功能来...

    Oracle19c rac备份数据通过rman恢复到单实例

    在进行Oracle 19c RAC(Real Application Clusters)数据库的数据备份与恢复操作时,可能会遇到需要将RAC集群环境下的备份数据恢复到单实例环境中的场景。这种情况下,RMAN(Recovery Manager)作为Oracle提供的强大...

    ORACLE实例与数据库详解.doc

    Oracle数据库系统是由两个核心组成部分构成:Oracle实例(Instance)和数据库(Database)。理解它们之间的关系对于有效管理和维护Oracle环境至关重要。 1. **Oracle实例**:实例是操作系统中的进程集合,这些进程...

    Linux上建第二个ORACLE实例分析

    2. **环境变量设定**:创建新实例前,需要设置`ORACLE_SID`环境变量,这个变量代表实例的SID。例如,如果你的新实例名为`test`,则运行`export ORACLE_SID=test`。 3. **使用DBCA创建实例**:Oracle Database ...

    oracle实例的启动停止

    oracle实例的启动停止,oracle实例的启动停止oracle实例的启动停止oracle实例的启动停止

Global site tag (gtag.js) - Google Analytics