哪些对象支持增量备份

      If you specify INCREMENTAL, then in the backupSpec clause you must set one of the following parameters: DATAFILE, DATAFILECOPY, TABLESPACE, or DATABASE. RMAN does not support incremental backups of control files, archived redo logs, or backup sets. (这里的backupsets并不是说你的对象被增量备份成backset,而是backset本身不能被增量备份)

即增量备份只支持DATAFILE, DATAFILECOPY, TABLESPACE, or DATABASE,而不支持control files, archived redo logs, or backup sets。

这里并不是语法上你不能写成例如:backup incremental level=1 archivelog all;语法上是可以的,能够执行,甚至Level是几都无所谓,没有0级也没关系。但只是没有增量备份的效果。一旦你这么做,它还是原样给你全部备份下来。


0级增量备份和全备份关联和区别。

关联:

      An RMAN backup in which only modified blocks are backed up. Incremental backups are classified by level. A level 0 incremental backup performs the same function as a full backup in that they both back up all blocks that have ever been used.

如果备份对象是database,它们会备份所有的数据文件,是全库的备份(不包括归档日志文件),哪怕表空间是read-only的。

这里要说一点:如果是1级备份,就会有可能跳过read-only的表空间对应数据文件,而不是你现在是read-only就会跳过。经试验验证,Oracle还是会检测你是否对数据文件有所改动,如果到下一个1级备份之前切成read-write,做了改动,又切回read-only。此时1级备份,Oracle是不会忽略那个改变过但此刻处于read-only的数据文件。除非你一直是read-only,没有改变,下次1级备份时才会忽略这个文件。)

区别:

      The difference is that a full backup does not affect blocks backed up by subsequent incremental backups, whereas an incremental backup does affect blocks backed up by subsequent incremental backups.

全备份不能被用作1级增量备份的基础

另外还有说0级增量备份只备份了used block,而全备份备份了used and unused block,我自己没有查到比较权威资料,也没有在官方文档中翻到,可能是我粗心了。

下面贴一些实验简要过程:

先是创建了一个测试用的表空间

SQL> create tablespace test datafile 'E:\test.dbf' size 5M;

表空间已创建。

SQL> alter tablespace test read only;

表空间已更改。

进行0级备份

RMAN> BACKUP INCREMENTAL LEVEL=0 DATABASE;

··

·略·

··

··

然后立即做1级备份

RMAN> BACKUP INCREMENTAL LEVEL  1 database ;

启动 backup 19-12-13

使用通道 ORA_DISK_1

正在略过数据文件 5;已经备份 1

通道 ORA_DISK_1:正在启动增量级别 1 数据文件备份集

通道 ORA_DISK_1:正在指定备份集内的数据文件

输入数据文件:文件号=00001 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\SYSTEM01.DBF

输入数据文件:文件号=00002 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\SYSAUX01.DBF

输入数据文件:文件号=00003 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\UNDOTBS01.DBF

输入数据文件:文件号=00004 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\USERS01.DBF

通道 ORA_DISK_1:正在启动段 1 19-12-13

·

·

·

通道 ORA_DISK_1:备份集已完成, 经过时间:00:00:03

完成 backup 19-12-13

此时对表空间进行修改

SQL> alter tablespace test read write;

表空间已更改。

SQL> create table TT

 2  (name varchar2(2));

表已创建。

SQL> alter tablespace test read only;

表空间已更改。

再次尝试1级备份

RMAN> BACKUP INCREMENTAL LEVEL  1 database ;

启动 backup 19-12-13

正在启动全部恢复目录的 resync

完成全部 resync

使用通道 ORA_DISK_1

通道 ORA_DISK_1:正在启动增量级别 1 数据文件备份集

通道 ORA_DISK_1:正在指定备份集内的数据文件

输入数据文件:文件号=00001 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\SYSTEM01.DBF

输入数据文件:文件号=00002 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\SYSAUX01.DBF

输入数据文件:文件号=00003 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\UNDOTBS01.DBF

输入数据文件:文件号=00004 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\USERS01.DBF

输入数据文件:文件号=00005名称=E:\TEST.DBF

通道 ORA_DISK_1:正在启动段 1 19-12-13

通道 ORA_DISK_1:已完成段 1 19-12-13

·

·

·

通道 ORA_DISK_1:备份集已完成, 经过时间:00:00:04

完成 backup 19-12-13

这次1级备份中TEST表空间没有被忽略,可知Oracle检测了只读表空间的变化。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下是增量备份归档日志,注意先后顺序:

RMAN> backup incremental level=1 archivelog all;

启动 backup 19-12-13

当前日志已存档

使用通道 ORA_DISK_1

通道 ORA_DISK_1:正在启动归档日志备份集

通道 ORA_DISK_1:正在指定备份集内的归档日志

输入归档日志线程=1序列=134 RECID=42 STAMP=834597148

通道 ORA_DISK_1:正在启动段 1 19-12-13

通道 ORA_DISK_1:已完成段 1 19-12-13

段句柄=G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\BACKUPSET\2013_12_19\O1_MF_ANNNN_TAG20131219

T163230_9C5CRZ57_.BKP标记=TAG20131219T163230 注释=NONE

通道 ORA_DISK_1:备份集已完成, 经过时间:00:00:03

完成 backup 19-12-13

RMAN> backup incremental level=0 archivelog all;

启动 backup 19-12-13

当前日志已存档

使用通道 ORA_DISK_1

正在跳过归档日志文件 G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\ARCHIVELOG\2013_12_19\O1_MF_1_

134_9C5CRTP2_.ARC; 已经备份 1

通道 ORA_DISK_1:正在启动归档日志备份集

通道 ORA_DISK_1:正在指定备份集内的归档日志

输入归档日志线程=1序列=135 RECID=43 STAMP=834597170

通道 ORA_DISK_1:正在启动段 1 19-12-13

通道 ORA_DISK_1:已完成段 1 19-12-13

段句柄=G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\BACKUPSET\2013_12_19\O1_MF_ANNNN_TAG20131219

T163251_9C5CSN7Z_.BKP标记=TAG20131219T163251 注释=NONE

通道 ORA_DISK_1:备份集已完成, 经过时间:00:00:01

完成 backup 19-12-13

归档日志增量备份可以执行,但与level无关,不依赖0级就可以1

后来我有又查看刚刚的两个归档日志备份的大小。并且上面有句跳过归档日志文件XX,有点增量的意味。

我有做测试,先level0level1,效果一样:后面会跳过前面已经备份了的,文件较小。

我直接 backup archivelog all;做测试而不加上 incremental level什么的,效果一样。其实跟增量毫无关系,

对归档日志的备份本身就是按照增量的方式进行的。

小插曲

在做第一个0级备份的时候出现了这样的差错:

RMAN> BACKUP INCREMENTAL LEVEL=0 DATABASE;

启动 backup 19-12-13

正在启动全部恢复目录的 resync

完成全部 resync

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=134设备类型=DISK

通道 ORA_DISK_1:正在启动增量级别 0 数据文件备份集

通道 ORA_DISK_1:正在指定备份集内的数据文件

输入数据文件:文件号=00001 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\SYSTEM01.DBF

输入数据文件:文件号=00002 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\SYSAUX01.DBF

输入数据文件:文件号=00003 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\UNDOTBS01.DBF

输入数据文件:文件号=00004 名称=G:\APP\ADMINISTRATOR\ORADATA\GUJUNPU\USERS01.DBF

输入数据文件:文件号=00005 名称=E:\TEST.DBF

通道 ORA_DISK_1:正在启动段 1 19-12-13

RMAN-03009: backup命令 (ORA_DISK_1通道上, 12/19/2013 10:38:24)失败

ORA-19809:超出了恢复文件数的限制

ORA-19804:无法回收 52428800字节磁盘空间 ( 2147483648限制中)

继续执行其他作业步骤,将不重新运行失败的作业

通道 ORA_DISK_1:正在启动增量级别 0 数据文件备份集

通道 ORA_DISK_1:正在指定备份集内的数据文件

备份集内包括当前控制文件

备份集内包括当前的 SPFILE

通道 ORA_DISK_1:正在启动段 1 19-12-13

通道 ORA_DISK_1:已完成段 1 19-12-13

段句柄=G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\BACKUPSET\2013_12_19\O1_MF_NCSN0_TAG20131219

T103608_9C4Q14G4_.BKP标记=TAG20131219T103608 注释=NONE

通道 ORA_DISK_1:备份集已完成, 经过时间:00:00:01

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03009: backup 命令 (ORA_DISK_1 通道上, 12/19/2013 10:38:24 )失败

ORA-19809: 超出了恢复文件数的限制

ORA-19804: 无法回收 52428800字节磁盘空间 ( 2147483648限制中)

这个原因是我的数据库归档文件默认就是存在闪回恢复区里的(log_archive_dest_1 location=use_db_recovery_file_dest)。

而闪回恢复区受db_recovery_file_dest_size大小限制,默认2G

归档日志文件会在恢复区下见一个文件夹ARCHIVELOG,里面以日期作为文件夹再储存。而备份集是恢复区下的一个BACKUPSET

文件夹下,也是以日期作为文件夹再储存。总和大于2G,所以报错。

一般是扩大闪回恢复区,我的归档日志文件不重要,所以就像下面一样直接删了。

RMAN> delete archivelog all;

更多 0