前滚和回滚撤销

来源:互联网 发布:淘宝美工修图技巧 编辑:程序博客网 时间:2024/04/29 05:49
重做日志流中始终存在足够的信息,不仅可以重构发生崩溃前进行的所有操作,而且


可以重构回滚崩溃时正在进行的事务所需的撤销信息。
例如:
用户jon启动了一个事务,jon更新某个表的一行,其服务器则将旧值复制至一个撤销


段。在数据库缓冲区缓存中完成这些更新之前,服务器进程将变更写入日志缓冲区。
用户roop也启动一个事务,两个用户都未提交事务,也没有在磁盘上写下任何数据。


如果此时实例崩溃,那么不存在与任一个事务相关的记录。因此,两个事务都不会被
恢复。但这并不是一个问题。因为没有提交,所以不应当恢复这两个事务。
随后,用户jon提交了自己的事务。这个提交操作会触发LGWR进程将日志缓冲区中的
内容刷新到联机重做日志文件,也就是说,此时重做日志文件内存在jon和roop的事


务对表和撤销段的更改以及针对jon的事务的提交记录。只有在LGWR进程结束


后,"commit complete"消息才会被返回给jon的用户进程。但是,数据文件中仍然不


会写入任何数据。如果此时实例失败,那么前滚阶段会重新构造这两个事务,不过处


理完所有重做后仍然不会得到针对roop的更新操作的提交记录,这将通知smon进程回


滚roop所作的变更,同时保留jon所作的变更。
    如果DBWn进程在实例崩溃前将某些数据块写入磁盘,那么将会出现什么情况呢?
jon可能频繁的重新查询与其相关的数据,而roop对数据进行了未提交的更改,并且


不再查看这些数据。因此,DBWn进程将确定在磁盘上有限写入roop所做的变更,然后


再写入jon所作的变更。DBWn进程总是会在磁盘上先写入不活跃的数据块,然后再写


入活跃的数据块。此时,数据文件中存储了roop没提交的事务,但是丢失了jon的已


提交事务。
不过即使此时实例崩溃,前滚仍然可以解决这个问题。重做流中始终存在重新构建已


提交变更所需的足够信息。因为提交操作在DBWn进程完成写入之前不会结束。不过,


因为LGWR进程将所有数据块的所有变更都写至了日志文件,因此日志文件中也将存在


重新构建撤销段所需的足够信息,从而能够回滚roop未提交的事务。
     因此,综上:因LGWR进程总是先于DBWn进程进行写操作,并且在提交的同时进


行实时的写操作。因此在重做流中始终存在足够的信息,从而能够重新构建任何已提


交的未被写入数据文件的变更以及回滚任何已被写入数据文件的未提交变更。
只要没有物理损坏,重做和回滚这种实例恢复机制就可以使Oracle数据库绝对不被损


坏。
(注:执行shutdown abort命令不会损坏数据库..)
原创粉丝点击