第四章Oracle恢复内部原理(热备份)

来源:互联网 发布:php关联添加元素 编辑:程序博客网 时间:2024/04/27 20:35

 热备份指在数据文件正在使用的时候对其进行复制。复制的过程中,DBWR也在进行,因此备份可能得到一些“不一致”的备份:

  1. 一些数据块可能比其他块的时间要早
  2. 一些数据块的SCN可能比数据文件头部的SCN还要早
  3. 一些块可能包含了一个重做记录的部分更新,其他的部分可能在这个数据文件上或者其他数据文件上
  4. 一些数据块可能会被损坏,因为块的头部和尾部是在不同的时间复制的。

 

上面的这种复制方式得到的备份集在还原后和介质恢复的时候是没有用的。介质恢复时会从数据文件上的开始热备SCN(见4.1中第二步)直至恢复过程结束(完整或不完整的恢复)。这样数据文件从事务上讲是一致的。

 

热备份一共有三个步骤:

  1. 执行命令:ALTER TABLESPACE ... BEGIN BACKUP.
  2. 调用操作系统的复制工具复制该表空间下所有数据文件。
  3. 执行命令:ALTER TABLESPACE ... END BACKUP

 

 

4.1  BEGIN BACKUP

BEGIN BACKUP命令实际对表空间的所有数据文件进行下列操作(不需要按顺序):

1.              在每个数据文件头部设置了热备份模糊标志位,表明该数据文件处于热备份状态。带有这种标记的数据文件头表明这个备份是热备份。标志的目的是冻结这个数据文件头部的检查点(停留在begin backup命令发出那一刻的SCN)。这个值作用在于当备份被还原时,介质恢复能从足够早的SCN开始重新应用重做日志。因为我们不能保证数据文件头首先被复制,因此热备份期间要将数据文件头的检查点冻结支持热备份结束。这个标准也冻结了数据文件的检查点(以及在控制文件中的记录的检查点),以免被线程检查点更新。7.2版本后数据文件头新增了一个备份检查点以接收原本属于被冻结的检查点该接收的更新。

2.              做了一个数据文件检查点操作,捕获了开始热备时候的检查点信息,包括开始热备的SCN。当数据文件被检查点时,所有实例都要刷新跟该数据文件有关的脏数据。如果此时需要实例恢复,检查点将等待恢复完成再继续。在开始备份的时候对数据文件进行检查点操作保证了在热备份期间,只有在发出热备份命令之后的时间里修改的块可能会被写到数据文件上。

3.              [跟平台有关,可选]:热备份后开始数据块的前镜像记录。记录过程中,所有实例将每个要修改块的完整的块而不是修改向量记录到重做日志中。这是为了防止恢复中遇到零碎的块(不一致的块),这多发生在数据块的大小比操作系统的块要大的时候,更新数据块导致前一部分和后一部分分别在不同的时间被复制。在热备份后恢复进程可以利用重做日志中的记录的完整前镜像构建数据块。

4.              设置数据文件头部的检查点跟开始热备份时刻的检查点一致,并冻结它直至发出“END BACKUP”命令。

5.              清除了数据文件的联机模糊位标志。在热备份期间该状态位一直是被清除的,直至发出“END BACKUP”命令。

 

4.2  复制文件

                复制是由操作系统的工具来完成。管理员必须保证复制操作发生在“BENGIN BACKUP”和“END BACKUP”之间或者文件没有使用的时候。

 

4.3  END BACKUP

                当发出END BACKUP命令时,各热备的表空间的数据文件将发生下列操作:

1.       还原了数据文件的联机模糊标志位。

2.       在重做日志中写入一笔该数据文件结束热备份的重做记录。这笔重做记录只会在介质恢复中有用,记录了热备份开始时刻的SCN(该SCN跟数据文件头部被冻结的检查点的SCN一致)。这笔记录也标志着热备份期间的重做日志的结束。介质恢复时读到这个热备份结束标记,就知道热备份期间产生的重做日志都被应用到了数据文件上。然后介质恢复就清除热备份模糊标志位。这个标志位能防止不完全恢复错误的选择在BEGIN BACKUP和END BACKUP时间点之间停止。如果一个不完全恢复在这样的点停止了,可能会导致数据文件不一致,因为备份时的复制过程可能已经包含了这个时间点之后的变更。在8.1将会见到,当数据文件的热备份标志位还在时,以重置日志的方式打开数据库将会失败。

3.       清除热备份模糊标志位。

4.       停止数据块前镜像记录。

5.       推进数据文件的检查点到当前数据库检查点。这弥补了热备份期间线程检查点推进了数据库检查点却无法推进数据文件头检查点(因为被冻结了)。

 

4.4  “崩溃”的热备份

                当有数据文件处于热备份状态时,正常关闭启动了热备份的实例或者最后一个实例都不被允许,还有将热备的数据文件正常脱机或临时脱机也不行。这是为了保证结束热备份的标志记录能正常产生。也告诉了管理员他们忘了发出“END BACKUP”命令。

                当热备份期间实例崩溃了或者以abort方式关闭时,所有热备份中文件的热备份模糊标志位还处于被设置状态,文件头检查点还处于被冻结状态,仍旧是热备份开始时刻的检查点。即使数据文件的数据块跟数据检查点一致,文件头看起来像刚还原的备份需要介质恢复,且跟开始热备份的检查点一致,崩溃恢复还是会失败,报需要介质恢复,因为它发现数据文件处于热备份崩溃的状态中。而这个文件起始不需要介质恢复,但是需要修正一下文件头部取消“崩溃”热备份状态。

                介质恢复可以恢复和打开有数据文件处于“崩溃”热备份状态的数据库。7.2版有个更好的选择,就是用命令ALTER DATABASE DATAFILE... END BACKUP将数据文件结束热备份状态,数据文件可以从视图V$BACKUP中查看。见9.6)。之所以能这样做。紧接着这个命令后,崩溃恢复就可以打开数据库。注意ALTER TABLESPACE ... END BACKUP命令在数据库没有打开的时候是不能用的。因为数据库只有在打开的时候才能通过数据字典找到表空间对应的数据文件。

 



继第五章 Oracle恢复内部原理(实例恢复)



**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name:    guoyJoe

QQ:        252803295

Email:    oracledba_cn@hotmail.com

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

ITPUB:   http://www.itpub.net/space-uid-28460966.html

OCM:    http://education.oracle.com/education/otn/YGuo.HTM
_____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

答案在:http://blog.csdn.net/guoyjoe/article/details/8624392

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036