1。实例失败:丢失了Oracle数据缓存中的数据或者内存中的数据
2。介质失败:丢失了数据库文件
上面两种模式的任一种失败情景,在恢复的时候想要保证数据库一致性,都有一些前提条件必须满足。
虽然恢复的过程有一些共同点,但前提条件的差异使得恢复的执行也有很大差异:
1。
实例恢复:恢复Oracle数据缓存中丢失的数据
2。介质恢复:恢复数据库文件丢失的数据
1。1
实例恢复和介质恢复的共同的机制
实例恢复和介质恢复都依赖重做日志。重做日志由一些重做日志线程组成。单实例环境中重做日志只有一个重做线程,多实例环境中每个实例都有一个重做线程。
一个重做日志线程指的的是一组存放在操作系统上的文件,文件里记录了该实例对数据库的所有变更--已提交的变更和未提交的变更(后者指还存在Oracle数据缓存区中的数据块变更)。因为实例也修改了回滚段中的块,所以回滚段的变更也记录在重做日志线程中。
实例恢复和介质恢复的第一步都是前滚。前滚属于数据库恢复层面的。在前滚的过程中,重做日志中记录的数据变更被重新应用到数据文件中。因为回滚段的变更也记录在重做日志中,所以前滚过程还会重新构建回滚段块。当前滚结束时,重做日志中记录的所有变更都应用到数据文件上了。
此刻,数据块不仅包含了已经提交的数据,也包含了一些未提交的数据。
实例恢复和介质恢复的第二步就是回滚。回滚属于数据库事务层的任务。回滚过程中,回滚段中记录的由前滚导致的未提交的事务所做的修改将被撤销。
1。2
实例失败和恢复,崩溃失败和恢复
实例失败指当实例突然终止时(如因为shutdown abort或主机掉电),实例数据缓存中的内容就都丢失了。
崩溃失败指数据库的所有实例都同时失败。单实例环境中实例失败等同于崩溃失败。崩溃恢复指的是将所有实例都恢复到崩溃前的一致状态。这一切都是在命令alter database open 之后自动进行的,用户无法干预。
实例失败会损害数据库的一致性因为它导致该实例的脏数据丢失。
所谓“脏数据”就是指实例数据缓存中的数据块内容比数据文件上的要新。当实例崩溃时,还没有来得及将脏数据写入到数据文件中。之所以导致存在这个脏数据丢失问题是因为Oracle的缓存管理采用的是有利于事务处理性能的算法而不是有利于防止实例崩溃的。
全部