我们可以用RMAN进行数据库、表空间和数据文件的增量备份。
如果数据库运行在归档模式,在数据库OPEN状态我们可以进行增量备份;如果数据库处于非归档方式,在数据库CLOSE状态我们也可以进行增量备份。增量备份只备份上次备份以来变化过的数据块。
每个数据块都包含一个system change number (SCN),记录着该数据块的最后改变。在进行增量备份的时候,RMAN将没给数据块的SCN和父级增量备份的CHECKPOINT SCN进行比较,如果该数据块的SCN大于等于父级的CHECKPOINT SCN,RMAN将备份该数据块。
为了提高数据库增量备份的性能,我们可以指定变化跟踪文件来监控数据块的改变:
|
可以通过以下命令查询:
SQL> SELECT FILENAME,STATUS FROM V$BLOCK_CHANGE_TRACKING |
移动跟踪文件:
SQL>SELECT filename FROM V$BLOCK_CHANGE_TRACKING;SQL>SHUTDOWN IMMEDIATE;SQL>HOST COPY OLDFILE NEWFILESQL>STARTUP MOUNT;SQL>ALTER DATABASE RENAME FILE ‘OLDFILE' TO ‘NEWFILE’; SQL>ALTER DATABASE OPEN; |
如果不能关闭数据库,必须禁用跟踪文件然后移动跟踪文件:
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE 'new_location'; |
增量备份分为两种:差异增量备份和累积增量备份。缺省的增量备份是差异增量备份。
差异增量备份:备份同级或者上级(如果有同级备份,先找同级)备份(差异或者累积)以来变化的数据块。如果找不到同级或者上级(知道LEVEL0),如果ORACLE版本>=10.0.0,RMAN将COPY从数据文件创建开始所有的数据块作为LEVEL1备份;如果ORACLE版本<10.0.0,RMAN将生成LEVEL0备份。
如下图所示。
周日:RMAN备份所有被使用过的数据块。周一至周六:RMAN备份自从上次LEVEL0或者LEVEL1备份以来变化的数据块。
累积增量备份:备份上级备份以来变化的数据块。
如下图所示:
周日:RMAN备份所有被使用过的数据块。
周一至周六:RMAN备份自从上次LEVEL0备份以来变化的数据块。
我们可以看出累积增量备份备份文件要比差异增量备份文件大,因为累积增量备份重复备份了同级别备份的数据块。
制定一个恰当的备份策略是很重要的,通常我们在有50%的数据块改变的时候,进行一次LEVEL0级别的备份。可以通过以下查询来获得数据块增量备份已经备份50%以上的数据块。
SELECT FILE#, INCREMENTAL_LEVEL, COMPLETION_TIME, BLOCKS, DATAFILE_BLOCKS FROM V$BACKUP_DATAFILE WHERE INCREMENTAL_LEVEL > 0 AND BLOCKS / DATAFILE_BLOCKS > .5 ORDER BY COMPLETION_TIME; |
增量备份示例:
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;RMAN> BACKUP INCREMENTAL LEVEL 1 TABLESPACE SYSTEM DATAFILE 'ora_home/oradata/ tools01.dbf';RMAN> BACKUP INCREMENTAL LEVEL = 1 CUMULATIVE TABLESPACE users; |
增量追加备份:前滚镜像拷贝
ORACLE文档原文:Incrementally Updated Backups: Rolling Forward Image Copy Backups.
增量追加备份工作原理:首先创建一个文件镜像拷贝,然后定期把从上次镜像拷贝最大SCN以来变化的数据块追加到镜像拷贝文件中。增量追加备份可以达到快速恢复的目的,如果是每天进行增量追加的话,在进行恢复的时候,我们最多应用一天的REDO数据就可以完成恢复。
创建增量追加备份,格式如下:
BACKUP... FOR RECOVER OF COPY WITH TAG |
一个基础的增量追加备份示例:简称basic脚本:
RUN ...{ RECOVER COPY OF DATABASE WITH TAG 'incr_update'; BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update' DATABASE; } |
为了理解上述脚本,我们先看一下如果没有数据文件拷贝和增量备份运行这两个脚本的情况。
1、如果没有LEVEL0备份或者备份文件拷贝,执行BACKUP INCREMENTAL LEVEL 1…… FOR RECOVER OF COPY WITH TAG……不能产生LEVEL1增量备份文件,但是RMAN会按照指定的tag在DATAFILE对应的目录下创建一分镜像文件拷贝。
2、如果没有LEVEL0备份或者备份文件拷贝,执行RECOVER COPY OF DATABASE WITH TAG……则生成一些信息但是不产生错误。
我们看一下整个basic脚本的执行情况:
第一次运行该脚本没有数据文件拷贝和增量备份所以执行RECOVER COPY OF DATABASE WITH TAG 'incr_update'没有任何结果;执行BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update' DATABASE将产生数据文件的镜像文件拷贝。
第二次运行该脚本,由于第一次运行的时候BACKUP INCREMENTAL LEVEL 1…… FOR RECOVER OF COPY WITH TAG……命令产生一个镜像文件拷贝,但是没有LEVEL1的增量备份,所以执行RECOVER COPY OF DATABASE WITH TAG 'incr_update'还是没有任何结果;执行BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update' DATABASE将产生LEVEL1增量备份。
第三次运行该脚本,执行RECOVER COPY OF DATABASE WITH TAG 'incr_update'命令将把第二次执行该脚本产生的LEVEL1增量备份追加到镜像文件拷贝,同时又产生一个新的LEVEL1增量备份文件。
以后再执行该脚本都是把上次产生的LEVEL1的增量备份追加到镜像文件拷贝,然后再产生一个新的LEVEL1的增量备份文件。
如果需要恢复,我们首先恢复镜像文件拷贝和最后一次LEVEL1增量备份,最后应用REDO.