oracle数据库的前滚和后滚,叶摇 » Blog Archive » oracle实例恢复时 前滚 后滚

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

一、什么时候进行实例的恢复

当发生checkpoint时,oracle会把SCN写到四个地方:

.system checkpoint SCN

.datafile checkpoint SCN

.stop SCN

.datafile header中的start SCN

当clen shudown 时,并且此时datafile header 中start SCN和controlfile中的datafile 部分记录的stop scn以及controlfile 里start scn会相同。等到打开数据库时,oracle会检查datafile header中的start scn和存于controlfile 中的datafile 的SCN是否相同,如果相同,接着检查此start scn和controlfile中记录的stop scn是否相等。若不相同,就要recovery。

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

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

(2) 启动数据库时,如果发现datafile header的start scn不等于储存于controlfile的datafile scn,表示要进行media recovery ;

cache recovery 顺序问题

必须先进行roll forward(从redo log file中从目前的start scn开始,重做后面的交易内容)。再从roll back segment 回滚未完交易的也就是没有提交的数据。

smon进程进行实例恢复时,会从控制文件中最近一次检查点的位置,再到联机日志中打开通改位置,开始从些恢复,应用所有的redo条目,从而把buffer cache恢复到实例崩溃的那个时间点。这样前滚完毕,buffer cache中既有崩溃时已经提交还有没有写入数据文件的脏数据块,也有整条被突然终止,而导致的既没提交又没有回滚的事务所弄脏的数据块。

前滚完成即打开数据库。找开为后,smon会在后台进行回滚。

若这时有用户读取数据,则回滚操作于用户对应的服务器进程完成。

二、为什么要前滚后滚

回滚段对应于回滚表空间,表空间中的数据文件会有在buffer cache中的映像块。

当发生DML时,既要生成redo,也要生成 undo(用于回滚DML操作本身)记录在undo表空间里。该DML操作对应UNDO信息(在buffer cache生成对应的undo block)就会首先生成其对就的REDO信息(undo block`s redo entry)并写入log buffer 中。

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

生成 完成 undo block`s redo entry后才轮到该dml语句对应的redo entry最后再修改buffer cache中的block,该block同时变成脏数据块。

redo会记录所有数据库的更改,包括undo表空间的更改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值