RMAN一个强大的功能是支持增量备份,增量备份只备份自特定的先前备份之后变化的数据块。通过这种方式,RMAN的备份策略可以更加灵活,增量备份的内容和时间也可以得到缩减。
每个数据块上都包含一个SCN,SCN可以标识最近一次对于Block的变更。在增量备份的过程中,RMAN读取每一个数据块的SCN之前的备份SCN相比较,从而判断出Block是否发生了变化,然后据此进行备份。但是需要注意的是,在大型数据库中,RMAN的扫描时间可能会极其漫长,所以如何采用增量备份仍然需要慎重,在Oracle 10g中,为了改变这一状况,Oracle引入了Block Change Tracking新特性来解决这一问题。
增量备份分为两类:差异增量备份和累积增量备份。
(1)差异增量备份。
差异增量备份(Differential Incremental Backups)备份上一次更高级别备份或同级备份以来所有变化的数据块,差异增量是默认增量备份方式。
图7-3列出的是Level 0和Level 1级差异增量备份的示意,可以看到每次Level 1级增量备份只备份上级(0级)或同级(1级)备份以来变化的数据块。

图1:差异增量备份
增量备份必须以一个0级备份为起点,0级备份类似一次全备份,备份所有包含数据的数据块。0级备份和全备份的区别在于,0级备份包含了增量备份的策略,是后续增量备份的基础,而全备份是不能用来进行增量恢复的
(2)累积增量备份。
累积增量备份(Cumulative Incremental Backups)备份自上次更高级别备份以来所有变化的数据块。
图7-4通过0级备份和1级累积增量备份来进行说明。可以看到1级增量备份包含了上次高一级别备份(0级)以来所有变化的数据块。

图2:累积增量备份
通过图1和图2可以看到这两者的区别,对于差异增量备份,每次备份的数据量相对要小,但是恢复是必须依次恢复每个备份集,恢复要相对复杂,恢复时间较长;对于累积增量备份,恢复时需要恢复的备份集数量相对要少,恢复速度较快。为了加快增量备份的恢复,在Oracle 10g中,Oracle还引入了增量备份合并(Incremental Merge Backup)的功能。
接下来通过一个实例来看一下增量备份的备份和恢复操作。首先配置一个备份路径:
RMAN> configure channel 1 device type disk format '/opt/oracle/obak/bkup_%U';
new RMAN configuration parameters:
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/opt/oracle/obak/bkup_%U';
new RMAN configuration parameters are successfully stored
执行一个0级备份:
RMAN> backup incremental level=0 database plus archivelog delete input;
Starting backup at 2007-05-30 13:43:31
current log archived
………
channel ORA_DISK_1: starting piece 1 at 2007-05-30 13:43:32
channel ORA_DISK_1: finished piece 1 at 2007-05-30 13:43:33
piece handle=/opt/oracle/obak/bkup_0dij1844_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
……
Starting backup at 2007-05-30 13:43:33
……
including current SPFILE in backupset
including current controlfile in backupset
input datafile fno=00001 name=/opt/oracle/oradata/eygle/system01.dbf
input datafile fno=00002 name=/opt/oracle/oradata/eygle/undotbs01.dbf
input datafile fno=00004 name=/opt/oracle/oradata/eygle/users.dbf
channel ORA_DISK_1: starting piece 1 at 2007-05-30 13:43:33
channel ORA_DISK_1: finished piece 1 at 2007-05-30 13:44:18
piece handle=/opt/oracle/obak/bkup_0eij1845_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:45
Finished backup at 2007-05-30 13:44:18
Starting backup at 2007-05-30 13:44:18
……
piece handle=/opt/oracle/obak/bkup_0fij185j_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
channel ORA_DISK_1: deleting archive log(s)
archive log filename=/opt/oracle/product/9.2.0/dbs/arch1_267.dbf recid=257 stamp=623943859
Finished backup at 2007-05-30 13:44:20
之后就可以修改数据,进行一些数据变更:
SQL> connect eygle/eygle
Connected.
SQL> create table eygle as select * from dba_objects;
Table created.
再来执行1级备份,现在Oracle将备份变化的数据块:
RMAN> backup incremental level=1 database plus archivelog delete input;
Starting backup at 2007-05-30 13:47:38
……
piece handle=/opt/oracle/obak/bkup_0gij18bq_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
channel ORA_DISK_1: deleting archive log(s)
archive log filename=/opt/oracle/product/9.2.0/dbs/arch1_268.dbf recid=258 stamp=623944058
Finished backup at 2007-05-30 13:47:39
Starting backup at 2007-05-30 13:47:39
using channel ORA_DISK_1
channel ORA_DISK_1: starting incremental level 1 datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current SPFILE in backupset
including current controlfile in backupset
input datafile fno=00001 name=/opt/oracle/oradata/eygle/system01.dbf
input datafile fno=00002 name=/opt/oracle/oradata/eygle/undotbs01.dbf
input datafile fno=00004 name=/opt/oracle/oradata/eygle/users.dbf
channel ORA_DISK_1: starting piece 1 at 2007-05-30 13:47:41
channel ORA_DISK_1: finished piece 1 at 2007-05-30 13:48:06
piece handle=/opt/oracle/obak/bkup_0hij18br_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:27
Finished backup at 2007-05-30 13:48:06
Starting backup at 2007-05-30 13:48:06
……
piece handle=/opt/oracle/obak/bkup_0iij18cm_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
channel ORA_DISK_1: deleting archive log(s)
archive log filename=/opt/oracle/product/9.2.0/dbs/arch1_269.dbf recid=259 stamp=623944086
Finished backup at 2007-05-30 13:48:07
增量备份的数据量很小,可以记录一下备份文件:
[oracle@jumper obak]$ ll
total 280072
-rw-r----- 1 oracle dba 42496 May 30 13:43 bkup_0dij1844_1_1
-rw-r----- 1 oracle dba 281763840 May 30 13:44 bkup_0eij1845_1_1
-rw-r----- 1 oracle dba 3072 May 30 13:44 bkup_0fij185j_1_1
-rw-r----- 1 oracle dba 693248 May 30 13:47 bkup_0gij18bq_1_1
-rw-r----- 1 oracle dba 3989504 May 30 13:48 bkup_0hij18br_1_1
-rw-r----- 1 oracle dba 4096 May 30 13:48 bkup_0iij18cm_1_1
如果此时数据库崩溃,就需要进行数据恢复。来看一下恢复的过程,恢复过程假定控制文件和日志文件未损失,丢失的仅为全部的数据文件:
[oracle@jumper obak]$ rman target /
Recovery Manager: Release 9.2.0.4.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
connected to target database (not started)
RMAN> startup mount;
Oracle instance started
database mounted
RMAN> restore database;
Starting restore at 2007-05-30 13:53:03
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=10 devtype=DISK
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /opt/oracle/oradata/eygle/system01.dbf
restoring datafile 00002 to /opt/oracle/oradata/eygle/undotbs01.dbf
restoring datafile 00004 to /opt/oracle/oradata/eygle/users.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/opt/oracle/obak/bkup_0eij1845_1_1 tag=TAG20070530T134333 params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 2007-05-30 13:54:02
RMAN> recover database;
Starting recover at 2007-05-30 14:17:18
using channel ORA_DISK_1
channel ORA_DISK_1: starting incremental datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00001: /opt/oracle/oradata/eygle/system01.dbf
destination for restore of datafile 00002: /opt/oracle/oradata/eygle/undotbs01.dbf
destination for restore of datafile 00004: /opt/oracle/oradata/eygle/users.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/opt/oracle/obak/bkup_0hij18br_1_1 tag=TAG20070530T134739 params=NULL
channel ORA_DISK_1: restore complete
starting media recovery
media recovery complete
Finished recover at 2007-05-30 14:17:20
RMAN> alter database open;
database opened
此时就完成了一次简单的RMAN增量备份的恢复:
SQL> connect eygle/eygle
Connected.
SQL> select count(*) from eygle;
COUNT(*)
----------
6256




