技术分享
差异增量备份和累积增量备份的差别
2020-07-17
差异增量备份和累积增量备份的差别
差异增量备份,会备份自上次同级或低级差异增量备份以来所有发生变化的数据块
累积增量备份,会备份自上次0级备份以来发生变化的数据块。
也就是他们的差异主要在于起点不同。因为累积备份是直接从0级开始的,它的数据量较大,占用空间多,如果要恢复,花费的时间相对较少。
先做一个0级备份
RMAN> backup incremental level=0 database;
……
handle=/u01/app/oracle/flash_recovery_area/VM62/backupset/2013_05_12/o1_mf_nnnd0_TAG20130512T215814_8rz7zpf2_.bkp
再做一个差异增量备份
RMAN>backup incremental level=1 database ;
……..
handle=/u01/app/oracle/flash_recovery_area/VM62/backupset/2013_05_12/o1_mf_nnnd1_TAG20130512T220030_8rz83ywz_.bkp
再做一个累积增量备份
RMAN>backup incremental level=1 cumulativedatabase ;
…
/u01/app/oracle/flash_recovery_area/VM62/backupset/2013_05_12/o1_mf_nnnd1_TAG20130512T220343_8rz8b00x_.bkp
再分别做一次,这次格式化文件名称。
backupincremental level=1 database format '/u01/app/oracle/flash_recovery_area/VM62/backupset/2013_05_12/lv1._%u_%s_%p';
backupincremental level=1 cumulative database format '/u01/app/oracle/flash_recovery_area/VM62/backupset/2013_05_12/lv1c._%u_%s_%p';
进入操作系统目录查看
[oracle@rhel62 2013_05_12]$ pwd
/u01/app/oracle/flash_recovery_area/VM62/backupset/2013_05_12
[oracle@rhel62 2013_05_12]$ ll
total 2823468
-rw-r-----. 1 oracle oinstall 671744 May 12 22:12 lv1._1fo9fs4t_47_1
-rw-r-----. 1 oracle oinstall 3006464 May 12 22:13 lv1c._1ho9fs75_49_1
-rw-r-----. 1 oracle oinstall 2882027520May 12 21:59 o1_mf_nnnd0_TAG20130512T215814_8rz7zpf2_.bkp
-rw-r-----. 1 oracle oinstall 2744320 May 12 22:01o1_mf_nnnd1_TAG20130512T220030_8rz83ywz_.bkp
-rw-r-----. 1 oracle oinstall 2777088 May 12 22:04o1_mf_nnnd1_TAG20130512T220343_8rz8b00x_.bkp
A、0级备份的文件最大(o1_mf_nnnd0_TAG20130512T215814_8rz7zpf2_.bkp)。
B、第一次增量备份时,2种一级备份的大小几乎一样(列表上最后2个文件),他们一个是以0级为起点,一个是以前一个备份为起点(此时也恰恰是0级)
C、第二次增量备份时,cumulative增量备份的文件明显大于差异增量备份。因为cumulative增量备份是累积的,第二次备份时它仍然以0级备份为起点。而差异备份以前一个备份为起点,备份的数量明显少很多。
Cumulative增量备份的第二次完成后,进行恢复只需要0级和最后一次备份。
而差异备份则需要使用前一个0级备份以及往后的每次备份进行恢复。
视对数据安全性的要求,数据库备份可以采用逻辑备份、用户管理备份、RMAN备份或STANDBY热备份。
逻辑备份:、逻辑备份是用oracle提供的备份命令exp通过命令行方式进行备份。适用于非7*24系统,且数据库处于非归档模式。它的特点是备份和恢复都比较简单,可以通过脚本自动执行备份、恢复,不需要有专业的数据库维护人员;缺点是不能恢复到当前时间点,只能恢复到上次备份时间点,会有部分数据的丢失;
用户管理备份:指用OS命令备份数据库物理文件的过程。备份过程相对简单,但恢复复杂且不易成功。每次备份时间较长,只能做完全备份不能做增量备份。适用于较小且可以丢失部分数据的数据库。
RMAN备份:RMAN备份有两种方式,一种为利用控制文件存储RMAN备份信息。这种方式不需要新建RMAN备份库,备份信息存储在生产库的控制文件中,但如果生产库的控制文件损坏,由于备份信息存储在控制文件中,RMAN的备份将无效,数据库无法恢复。
另
一种方式为新建catalog备份库存储RMAN备份信息,即RMAN备份库和生产库分别为两个单独的数据库。正常情况下,生产库以归档方式运行,RMAN备份库通过脚本自动执行对生产库的备份。在对生产库进行备份的同时也需要对RMAN备份库定期做逻辑备份,因为RMAN备份库中存储生产库的备份信息,RMAN备份库的损坏意味着生产库备份信息的丢失。如果生产数据库宕机,必须通过RMAN备份库进行恢复,只要归档日志不丢失,可以恢复到当前时间点。
缺点是维护比较复杂,不仅要备份生产库,还要对备份库进行备份,需要专业数据库维护人员。
STANDBY备份:STANDBY备份时数据库分为生产库和STANDBY备份库两个单独的数据库。正常情况下,生产库以归档方式运行,形成归档日志,定时自动传送到备份库,备份库根据传过来的归档日志,实现自动恢复,保持两个数据库之间的同步。一旦生产库宕机,STANDBY备份库完成归档日志的恢复后,能马上接管服务,减少宕机时间;
缺点是维护比较复杂,需要专业数据库维护人员。
累计增量备份和差异增量备份
在rman增量备份中,有差异增量和累积增量的概念
1、概念
差异增量:是备份上级及同级备份以来所有变化的数据块,差异增量是默认增量备份方式
累积增量:是备份上级备份以来所有变化的块
因为累积增量是备份上级备份以来所有变化的数据块,所以累积增量需要更多的备份时间,同时需要较小的恢复时间;而差异增量正好相反,它可以备份同级备份以来变化的数据块。所以会减少备份时间,但需要更多的恢复时间.在oracle 9中增量备份需要通过扫描整个数据库的数据块才能知道哪些数据块发生了变化,这是一个代价很大,时间很长的过程,而且由于增量备份形成多个不同的备份集,使恢复变得更加不可靠,所以增量备份在版本9中仍然不被推荐使用;在10g中,增量备份作了很大的改进,不需要再扫描所有数据块就能得知哪些数据块发生变化,从而大大提升备份效率。但这些却以牺牲磁盘i/o为代价,所以在oltp事务系统中还得衡量是否愿意以i/o为代价来保证安全及高可用性。10g还支持增量合并,增量备份可支持7级增量。
2、备份策略及恢复
以rman多级增量备份来作为备份策略例子:
增量备份都需要一个0级备份来作为基础,0级备份与全备份的区别在于0级可以用来增量恢复,而全备份则不可以。
备份策略:
eg:我们对一星期做如下备份策略 ,那么差异增量只需要使用星期天的0级,星期三的一级,星期四、五的二级就可以恢复,累积增量则需要星期天的0级、星期三的1级,星期五的二级即可进行恢复。以上是一个星期的备份策略,如果做长期的备份策略则只需要把备份的时间延长即可得到新的备份策略,具体需要看自己备份及恢复能够接受的程度而顶,见最后的备份策略典型案例。
星期 | 差异增量 | 累积增量 |
星期天 | 0级 | 0级 |
星期一 | 2级 | 2级 |
星期二 | 2级 | 2级 |
星期三 | 1级 | 1级 |
星期四 | 2级 | 2级 |
星期五 | 2级 | 2级 |
星期六 | 2级 | 2级 |
星期天 | 0级 | 0级 |
备份命令如下:
零级备份
backup incremental level 0 database;
一级差异增量
backup incremental level 1 database;
一级累计增量
backup incremental level 1 cumulative database;
备份策略典型案例:
每半年做一个数据库的全备份(包括所有的数据和只读表空间)
每一个月做一次零级备份(不包含只读表空间)
每个星期做一次一级备份
每天做一次二级备份
任何数据库的更改需要重新同步CATALOG目录并重新备份(如添加数据文件)或重新备份(如修改表空间为只读)
建议备份一段时间归档日志和定期备份归档到到磁带上
全库备份脚本
run{ |
run{ |
一级备份脚本
run{ |
如果按照以上备份策略,则每天的所需要备份的数据量只有一天的改变量。而做恢复时最多要恢复当月的一个零级备份+三个一级备份+6个二级备份+当天的归档文件。如果不能接受这样的恢复时间,可以减少零级备份之间的时间间隔。在每次备份后,原则上在该备份点之前的归档日志就可以删除掉了,但是为了进一步的安全以及日后需要(如使用LOGMNR查找所需信息),建议有条件的话,归档日志保存到能够接受的时间点,可以保存在磁带等廉价存取设备上。
增量备份与差异备份示意图
下面的图片是我在网上发现的备份策略的示意图, 感觉还是比较直观的。 收留此地。
Oracle中,增量备份时分等级的,级别从0开始,一级一级递增,不过实际上用的最多的也就是0级和1级了,0级增量备份是后面级别的增量备份的基础,0级备份实际上就是一个完全备份,与普通的完全备份唯一的不同点是0级备份可以作为其他级别增量备份的基础,而普通的完全备份是不能的。
从级别1开始,Oracle的增量备份分为差异增量备份和积累增量备份两种,其中差异增量备份备份的是自上一次同级别的差异备份或者是上一次更高级别的备份完成之后的数据库发生改变的数据块;而积累增量备份则是备份的自上一次上一级增量备份完成以来数据库发生改变的数据块。
如下为各种备份模式的相关脚本, 以作参考:
1. 零级增量备份
rman target / catalog rman/rman@catalog run{ configure controlfile autobackup on; set controlfile autobackup format for device type sbt_tape to 'control_%F'; #########分配4个备份通道,针对磁带库,将分配4个物理磁带机### allocate channel c1 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c2 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c3 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c4 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; ##########level 0完全备份,备份数据文件、控制文件、参数文件### backup incremental level 0 database format='LEV0_%d_%t_%U' diskratio=0 include current controlfile; sql 'alter system archive log current'; ##########备份当前所有归档日志,并从归档目的地删除######## backup format 'arch%t_%s_%p' diskratio=0 archivelog all delete input; ###########从磁带中删除730天以前的归档日志##### delete noprompt archivelog until time 'sysdate - 730'; release channel c1; release channel c2; release channel c3; release channel c4;}allocate channel for maintenance type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';crosscheck archivelog all;crosscheck backup;report obsolete;delete noprompt obsolete recovery window of 730 days;delete noprompt expired backup;release channel;
2.一级累计增量备份
rman target / catalog rman/rman@catalog run{ configure controlfile autobackup on; set controlfile autobackup format for device type sbt_tape to 'control_%F'; allocate channel c1 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c2 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c3 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c4 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; backup incremental level 1 Cumulative database format='LEV0_%d_%t_%U' diskratio=0 include current controlfile; sql 'alter system archive log current'; release channel c1; release channel c2; release channel c3; release channel c4;}
3. 备份归档日志
rman target / catalog rman/rman@catalog run{ configure controlfile autobackup on; set controlfile autobackup format for device type sbt_tape to 'control_%F'; allocate channel c1 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c2 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c3 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c4 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; sql 'alter system archive log current'; backup format 'arch%t_%s_%p' diskratio=0 archivelog all delete input; release channel c1; release channel c2; release channel c3; release channel c4;}
linux基于cron的rman自动增量备份脚本及设置
rman及catalog运行于linux,target数据库运行于windows,oracle版本一致,而且都是64位平台。
历史原因数据库运行于windows,但显然linux更适合于系统管理,因此此处rman暂时运行于混合环境。
备份策略
数据库用于OLTP系统,容量中等,全库接近400G,但有大约200G的数据是不变化只用于查询的,将其表空间置于read only模式,备份时可以忽略这些数据。其他200G左右的数据每天都在发生变化,如果系统需要回复,要尽可能的恢复到最新的数据。已经做了dataguard灾备。
基于以上情况制定备份策略,每周日凌晨做0级备份,周一到周六做1级备份。
备份脚本
1 #!/bin/bash
2
3 set -e
4
5 #############################################################
6 # sunday incremental level 0
7 # other day incremental level 1
8 #
9 # rman and catalog on oracle 10.2.0.4 64bits for debian amd64
10 # target on oracle 10.2.0.4 64bits for windows 2003 r2 sp2 x64
11 #############################################################
12
13 export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
14 rman_bin=$ORACLE_HOME/bin/rman
15
16 weekday=`date +%a`
17 case "${weekday}" in
18
19 "Sun")
20 inc_level=0
21 ;;
22 *)
23 inc_level=1
24 ;;
25 esac
26
27 rman_user=rman_usr
28 rman_passwd=rman_usr
29 catalog_inst_name=catalogd
30
31 target_sys_passwd=oracle
32 target_inst_name=db_test
33
34 log_file=/var/log/rman/`date +%F`_${inc_level}.log
35 bak_file='d:\rman_bak\bak_%U'
36 arc_file='d:\rman_bak\arc_%U'
37 ctl_file='d:\rman_bak\ctl_%F'
38
39 $rman_bin log ${log_file} >> /dev/null 2>&1 <<EOF
40
41 connect catalog ${rman_user}/${rman_passwd}@${catalog_inst_name};
42 connect target sys/${target_sys_passwd}@${target_inst_name};
43
44 run {
45 configure backup optimization on;
46 configure archivelog deletion policy to applied on standby;
47 configure retention policy to redundancy 3;
48 configure controlfile autobackup on;
49 configure controlfile autobackup format for device type disk to '${ctl_file}';
50
51 allocate channel ch1 device type disk;
52 backup incremental level ${inc_level} cumulative
database format '${bak_file}' skip readonly plus archivelog format '${arc_file}';
53
54 release channel ch1;
55 }
56
57 crosscheck backup;
58 delete noprompt obsolete;
59
60 delete noprompt archivelog all completed before 'sysdate - 14';
61
62 exit;
63 EOF
64
65 exit 0
rman操作日志记录于/var/log/rman目录下,需要在/var/log目录先新建rman子目录,不然rman会报错无法打开log文件。脚本很简单,就不解释了。
自动运行
打开/etc/crontab,编辑cron.daily所在的那行,将其第一个字段m(minute)改为0或其他小于60的数值,第二个字段h(hour)改为0,这样以来cron守护程序每天的0点稍后自动运行/etc/cron.daily目录下的脚本。然后将备份脚本拷贝到/etc/cron.daily目录下,注意为备份脚本添加可执行权限。
特别注意:crond或者直接说run-parts不会执行带有.sh扩展名的脚本,也就说/etc/cron.*/目录下的脚本不要带任何扩展名。
也就是周日0级备份,周1 2 4 5 6 采用2级增量备份,周3采用1级增量备份
配置控制文件备份路径
RMAN > CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/rmanbk/ccontrolfile_%F';
$ mkdir -p /u01/backup/rmanbk
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
0级备份脚本
vim rman_bk_level0.sh
------0级备份----------------
#! /bin/bash
export ORACLE_SID=orcl
export NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'
/u01/app/oracle/11.2.0/dbhome_1/bin/rman target / <<EOF
run{
allocate channel d1 type disk;
allocate channel d2 type disk;
backup incremental level 0 database format '/u01/backup/rmanbk/level0_%d_%s_%p_%u.bkp';
sql 'alter system archive log current';
backup archivelog all delete input format '/u01/backup/rmanbk/log_%d_%s_%p_u%.bkp';
}
crosscheck backup;
delete noprompt obsolete;
exit;
<<EOF
------------------
1级备份脚本
vim rman_bk_level1.sh
---------1级增量备份---------------
#! /bin/bash
export ORACLE_SID=orcl
export NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'
/u01/app/oracle/11.2.0/dbhome_1/bin/rman target / <<EOF
run{
allocate channel d1 type disk;
allocate channel d2 type disk;
backup incremental level 1 database format '/u01/backup/rmanbk/level1_%d_%s_%p_%u.bkp';
sql 'alter system archive log current';
backup archivelog all delete input format '/u01/backup/rmanbk/log_%d_%s_%p_u%.bkp';
}
crosscheck backup;
delete noprompt obsolete;
exit;
<<EOF
vim rman_bk_level2.sh
---------2级增量备份---------------
#! /bin/bash
export ORACLE_SID=orcl
export NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'
/u01/app/oracle/11.2.0/dbhome_1/bin/rman target / <<EOF
run{
allocate channel d1 type disk;
allocate channel d2 type disk;
backup incremental level 2 database format '/u01/backup/rmanbk/level2_%d_%s_%p_%u.bkp';
sql 'alter system archive log current';
backup archivelog all delete input format '/u01/backup/rmanbk/log_%d_%s_%p_u%.bkp';
}
crosscheck backup;
delete noprompt obsolete;
release d1;
exit;
<<EOF
加入到crontab中
crontab -e
-----------
#周日0级备份
00 23 * * 0 /u01/backup_shell/rman_bk_level0.sh
#周一、二、四、五、六2级增量备份
00 23 * * 1,2,4,5,6 /u01/backup_shell/rman_bk_level2.sh
#周三1级增量备份
00 23 * * 3 /u01/backup_shell/rman_bk_level1.sh
-------------
结束!

- 标签:
-
容灾备份