rman增量备份的原理

在里边还提到了rman增量备份的原理和10g新特性db block change tracking的原理。

----------------------------------
rman的增量备份的基本原理
其实原理很简单,主要就是弄明白怎么样在做增量备份时确定某个数据块需要备份,哪个不需要
rman在做1级备份的时候怎么来确定0级备份之后都有哪些数据块做了修改呢?看下面一段
Each data block in a datafile contains a system change number (SCN), which is the
SCN at which the most recent change was made to the block. During an incremental
backup, RMAN reads the SCN of each data block in the input file and compares it to
the checkpoint SCN of the parent incremental backup. If the SCN in the input data
block is greater than or equal to the checkpoint SCN of the parent, then RMAN copies
the block.
原来block里边也有一个change scn
也就是说在做level 1级备份的时候,需要扫描所有的数据块并且用块中记录修改的SCN跟level 0备份时的SCN做比较(备份记录中的Ckp SCN),来确定这个块是否需要备份。
所以扫描整个数据文件是不可避免的 !

这是传统的rman做增量备份

在10g中rman做增量备份不再需要扫描整个数据文件了
10g引入的新特性 block change tracking:
Block change tracking进程记录自从上一次备份以来数据块的变化,并把这些信息记录在跟踪文件中。RMAN使用这个文件判断增量备份中需要备份的变更数据。这极大的促进了备份性能,RMAN可以不再扫描整个文件以查找变更数据。
RMAN's change tracking feature for incremental backups improves incremental
backup performance by recording changed blocks in each datafile in a change tracking
file. If change tracking is enabled, RMAN uses the change tracking file to identify
changed blocks for incremental backup, thus avoiding the need to scan every block in
the datafile.
估计是使用的位图文件做的记录!

这一段我在itpub上也写过

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

但是当时还有一段演示,没在文章里写出来,今天发现了当时的老贴,就把当时的测试弄过来了

让我们来对它们的速度做一下测试,
不使用block change tracking,看看备份需要的时间


首先关闭block change tracking

SQL> select status from v$block_change_tracking;

STATUS
----------
DISABLED

然后让我们来做个0级增量备份,和一个1级备份,注意它们使用的时间
RMAN> backup incremental level 0 format='d:orabackup%d_%s.dbf'
2> database;

启动 backup 于 17-7月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动增量级别 0 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSTEM01.DBF
输入数据文件 fno=00003 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSAUX01.DBF
输入数据文件 fno=00005 name=D:ORACLEPRODUCT10.1.0ORADATAORCLEXAMPLE01.DBF
输入数据文件 fno=00002 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUNDOTBS01.DBF
输入数据文件 fno=00004 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUSERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_15.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:26
通道 ORA_DISK_1: 启动增量级别 0 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_16.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:05
完成 backup 于 17-7月 –05


RMAN> backup incremental level 1 format='d:orabackup%d_%s_1level.dbf'
2> database;

启动 backup 于 17-7月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动增量级别 1 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSTEM01.DBF
输入数据文件 fno=00003 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSAUX01.DBF
输入数据文件 fno=00005 name=D:ORACLEPRODUCT10.1.0ORADATAORCLEXAMPLE01.DBF
输入数据文件 fno=00002 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUNDOTBS01.DBF
输入数据文件 fno=00004 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUSERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_17_1LEVEL.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:35
通道 ORA_DISK_1: 启动增量级别 1 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_18_1LEVEL.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:06
完成 backup 于 17-7月 –05

level 0备份后其实我根本就没有对数据库做什么更改,level 1备份居然也使用了35秒
说明增量备份即使数据库没有什么更改也需要scan整个数据文件。

--==================================

然后让我们把block change tracking启用后测试一下level 1需要的时间。

SQL>alter database enable block change tracking using
2 file 'D:oracleproduct10.1.0flash_recovery_areaORCLFLASHBACK BLOCK_CHANGE_TRACE.LOG';
我使用的是安装的时候默认的数据库,这个记录文件大概为十几M.除了用位图,别的方式应该没办法这么多快好省的记录数据块的变化了

SQL> alter database enable block change tracking;

数据库已更改


先删除原来的备份
RMAN> delete backupset 14;
RMAN> delete backupset 12;


让我们做备份测试一下,注意看它们完成所用的时间
RMAN> backup incremental level 0 format='d:orabackup%d_%s_test_level0.dbf'
2> database;

启动 backup 于 17-7月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动增量级别 0 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSTEM01.DBF
输入数据文件 fno=00003 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSAUX01.DBF
输入数据文件 fno=00005 name=D:ORACLEPRODUCT10.1.0ORADATAORCLEXAMPLE01.DBF
输入数据文件 fno=00002 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUNDOTBS01.DBF
输入数据文件 fno=00004 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUSERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_19_TEST_LEVEL0.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:26
通道 ORA_DISK_1: 启动增量级别 0 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_20_TEST_LEVEL0.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:05
完成 backup 于 17-7月 –05

再做level 1
RMAN> backup incremental level 1 format='d:orabackup%d_%s_test_level1.dbf'
2> database;

启动 backup 于 17-7月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动增量级别 1 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSTEM01.DBF
输入数据文件 fno=00003 name=D:ORACLEPRODUCT10.1.0ORADATAORCLSYSAUX01.DBF
输入数据文件 fno=00005 name=D:ORACLEPRODUCT10.1.0ORADATAORCLEXAMPLE01.DBF
输入数据文件 fno=00002 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUNDOTBS01.DBF
输入数据文件 fno=00004 name=D:ORACLEPRODUCT10.1.0ORADATAORCLUSERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_21_TEST_LEVEL1.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:07
通道 ORA_DISK_1: 启动增量级别 1 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 17-7月 -05
通道 ORA_DISK_1: 已完成段 1 于 17-7月 -05
段 handle=D:ORABACKUPORCL_22_TEST_LEVEL1.DBF comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:05
完成 backup 于 17-7月 –05

显然level 1备份用了7秒就完成了,比起没有启用block change tracking快了几倍
原因是指需要扫描track的文件就知道有哪些块更改了

猜你喜欢

转载自andyniu.iteye.com/blog/1844413