💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨
💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️
💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖
距离上一次写博客都是上一次了,那么今天作为rman正统传承的第三篇章,又和大家见面了。rman是物理备份工具,那么 通过rman脚本+crontab实现定时备份 这才是最重要的,所以今天今天的文章就讲讲怎么实现rman脚本+crontab实现定时全库备份。
删过库跑过路的小伙伴都知道有备份是多么的重要😄,全库备份将作为最后的恢复手段。不是执行一个rman备份命令就完事了,rman备份需要备份哪些内容,rman输出的备份片名称应该怎么命名这些都是非常有讲究的,不能执行了一个全库备份命令,生成的备份片没有命名,而是rman自己内部命名的,这让一个刚上手的小伙伴会感觉的很蒙蔽,不知道应该从那个备份片开始恢复。所以今天就带着这些疑问开始今天的内容吧。
然而,RMAN所涉及的内容之广、之深,使得难以在单篇文章中全面涵盖。所以我将理论、命令、备份策略、异机恢复、坏块处理等分成八篇文章去讲,即使分为八篇也有不少内容没有涵盖到,所以这八篇文章都是精华,看完这八篇就可以解决95%以上的RMAN相关工作内容了。八篇文章的内容分别如下:
- 第一篇:rman物理备份工具的基础理论概述
- 第二篇:rman工具实用指南:常用命令详解与实践
- 第三篇:rman标准化全库备份策略:完整备份or增量备份(当前篇)
- 第四篇:rman全库异机恢复:从RAC环境到单机测试环境的转移
- 第五篇:rman全库异机恢复:从单机环境到RAC测试环境的转移
- 第六篇:rman时间点异机恢复:从单机环境到单机测试环境的转移
- 第七篇:Oracle数据库物理坏块处理:rman修复坏块实践与案例分析
- 第八篇:逻辑备份工具expdp(exp)/impdp(imp)和物理备份工具rman的区别和各自的使用场景总汇
目录
1、rman的备份分类
1.1 rman完整备份:
案例一:对Oracle实例进行rman全库备份。保留4份rman完整备份,14天的归档备份
1.2 rman增量备份(基本、差异、累计增量备份的总称):
案例一:对Oracle实例进行rman增量备份。保留4份rman基本增量备份,14份rman差异增量备份,14天的归档备份
2、总结一下rman完整备份or增量备份该怎么用
rman备份应该哪些内容:
- 备份内容一:参数文件。参数作为Oracle启动时第一步就干的事情,备份他有多重要那么就不言而喻了。
- 备份内容二:控制文件。控制文件作为Oracle启动后的第二步就是需要打开控制文件,验证里面的内容,备份他有多重要那么就不言而喻了。
- 备份内容三:数据文件、undo文件、temp文件。打开控制文件后,第三步就是打开数据文件、undo文件、temp文件,只有文件和控制文件的scn一致数据库才会启动到open状态,备份他有多重要那么就不言而喻了。
- 备份内容四:归档日志。所谓归档日志就是redo日志切换后生成的,记录了数据库中所有的操作,包括DML、DDL等等。对于rman全库备份来说,全库数据量这么大只能好几天才备份一次,那么从上一次到下一次全库备份之间的数据就是缺失的,所以需要备份归档日志来进行追数据,备份他有多重要那么就不言而喻了(其实可以通过差异增量备份替代归档日志备份,但是差异增量备份是不能用logminer进行分析,而备份的归档日志可以通过logminer进行分析)
上面我说了四个重要,所以rman备份少了那一个都不行滴!
1、rman的备份分类
rman完整备份:
一个或多个数据文件的完整副本,包括从备份开始的所有级的数据块。
rman增量备份(基本、差异、累计增量备份的总称):
从基本备份以来被修改过或增加过的数据块。增量备份分为0级增量基本备份、1级差异增量备份、1级累积增量备份,增量备份支持归档和非归档模式,并且只能使用rman才可以实现增量备份。
- 基本增量(backup incremental level=0 database):基本备份的增量级别为0,执行增量备份操作时,首先需要的是增量基本备份(incremental base backup),以后所有的增量备份都基于这个基本备份。如果没有生成基本备份就尝试执行增量备份操作,RMAN 会自动执行基本备份操作。所以基本增量备份也可以理解为全库备份。
- 差异增量(backup incremental level=1 database):差异备份的增量级别为1,对于差异增量备份来说,第一次是基本备份以来所有变化的数据块,之后RMAN会备份自上次同级或者低级差异增量备份以来所发生变化的数据块,差异备份是RMAN生成的增量备份的默认类型。差异增量是根据上一次备份后,备份有变化的数据。这种备份把全库数据分为一小段一小段的,节省了空间,但在恢复时会很麻烦需要逐个恢复。所以不建议使用
- 累积增量(backup incremental level =1 cumulative database):累计备份的增量级别为1 cumulative,对于累计增量备份来说,累计增量是根据上一次备份后,备份最开始到生产的所有数据,占用了空间,在恢复时只需恢复一个即可。累计增量适用于数据量小的数据库,如果数据量很大也不建议使用差异增量备份,在backup 命令中使用cumulative关键字。
1.1 rman完整备份:
一个或多个数据文件的完整副本,包括从备份开始的所有级的数据块。
全库备份脚本:包括数据文件(数据文件、undo文件、temp文件)、控制文件、参数文件
备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本export BAKDATE=`date +%Y%m%d`
export ORACLE_SID=实例
export ORACLE_HOME=Oracle数据库的home路径$ORACLE_HOME/bin/rman target / log=/路径/rman_full_实例_backup$BAKDATE.log << EOF #按照日志生成不同的备份日志,便于排查在备份过程的问题run
{
CONFIGURE RETENTION POLICY TO NONE; #none可以把使备份保持策略失效,此时REPORT OBSOLETE和DELETE OBSOLETE将不把任何备份文件视为废弃。测试过备份策略保留4份(CONFIGURE RETENTION POLICY TO REDUNDANCY 4;),备份策略中包括了全备、参数文件、控制文件、归档文件的备份,但在实际第4次运行时发现,删除了第一个和第二次的参数文件和控制文件,非常的奇怪,所以不采用备份策略(CONFIGURE RETENTION POLICY TO NONE;),采用linux的rm -rf实现删除备份,服务器上没有的备份介质,通过crosscheck backup;和delete noprompt expired backup;删除rman的备份相关信息crosscheck backup;
delete noprompt expired backup; #删除过期的备份集。因为采用linux的rm -rf实现删除备份,服务器上没有的备份介质,所以通过crosscheck backup;和delete noprompt expired backup;删除rman的备份相关信息
crosscheck copy;
delete noprompt expired copy; #删除过期的备份。同上
crosscheck archivelog all;
delete noprompt expired archivelog all; #删除过期的归档备份。同上
}run { #rman工具内部命令
allocate channel d1 type disk; #分配通道d1,类型为磁盘
allocate channel d2 type disk; #分配通道d2,类型为磁盘(生产上结合io的处理并发的能力,按需分配通道,2个通道同时进行)
setlimit channel d1 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。
setlimit channel d2 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。(为优化参数,2个通道同时进行,也就是以400M/s存到缓存向磁盘写入。生产上结合io的处理并发的能力)sql 'alter system archive log current'; #会对数据库中所有实例执行日志切换,进行归档backupAS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。压缩后的备份集为实际数据量的30%左右tag 实例_full #tag是将备份集命名 format '/路径/实例_full_%s_%p_%T' #备份文件的保存路径,默认保存在闪回路径下。 (database); #database表示全库备份(全备)
release channel d1; #释放通道d1
release channel d2; #释放通道d2allocate channel d3 type disk;
backup
tag 实例_ctl
format '/路径/实例_ctl_%s_%p_%T' current controlfile; #备份当前控制文件,并指定保存路径
release channel d3; allocate channel d4 type disk;
backup
tag 实例_spfile
format '/路径/实例_spfile_%s_%p_%T' spfile; #备份当前参数文件,并指定保存路径
release channel d4;
}
exit
EOFfind /backup/full \( -name "实例_full_*" -o -name "orcl_ctl_*" -o -name "orcl_spfile_*" \) -mtime +14 -exec rm -rf {} \; #-mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。rman 进行crosscheck就会把所有的备份片访问一遍,那么如果写-atime(被访问过的文件)就不是实际之前的文件了,从而导致删除失效。因为计划任务是每周一和每周五执行,所以find查出14天之前的进行rm删除,也就是保留14天内的4份。备注:目前采用find这种方式最保险,因为测试过备份策略的方式有问题,参考上面“CONFIGURE RETENTION POLICY TO NONE;”的备注。
归档备份脚本:备份归档日志
备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本export BAKDATE=`date +%Y%m%d`
export ORACLE_SID=实例
export ORACLE_HOME=Oracle数据库的home路径$ORACLE_HOME/bin/rman target / log=/路径/rman_arch_实例_backup$BAKDATE.log << EOF #按照日志生成不同的备份日志,便于排查在备份过程的问题run
{
crosscheck archivelog all; #验证实例所有的归档,根据的是archive log list
delete noprompt expired archivelog all; #删除rman里面显示过期的归档记录。上面的操作是物理删除,但rman的记录还在
delete noprompt force archivelog until time "sysdate-2"; #删除2天前的归档,就是从当前日期开始保留2天内的。加上force参数,解决:RMAN-08138: WARNING: archived log not deleted - must create more backups。原因为CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 10 TIMES TO 'SBT_TAPE';删除的归档日志不符合删除日志之前所需的用户指定的归档日志删除策略数量的备份
}run
{
allocate channel d5 type disk;
backup
AS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。
tag 实例_arch
format '/路径/实例_arch_%s_%p_%T' archivelog all; #备份当前归档,并指定保存路径
release channel d5; #释放通道d5。用于备份归档。如果单独写一个归档备份脚本,即脚本有CONFIGURE RETENTION POLICY TO REDUNDANCY 2,经过测试也不会保留2份归档备份集,而是一直进行备份。如果将备份语句写到全备里面,经过测试可以实现只保留2份归档备份
}
exit
EOFfind /backup/full -name "实例_arch_*" -mtime +14 -exec rm -rf {} \; #-mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。rman 进行crosscheck就会把所有的备份片访问一遍,那么如果写-atime(被访问过的文件)就不是实际之前的文件了,从而导致删除失效。本地归档日志保留2天内的,并且每天进行一次定时任务的归档全备,根据全备的策略(每周一和每周五进行全备,保留4份全备),需要保留14次的归档全备定时任务。本地归档日志保留2天内是因为需要保证dg库万一断了,那么本地还有2天的归档,那么还可以通过FAL进程将本地归档传输过去。而保留14次的归档全备定时任务就是保留了14次的归档全备,每次归档全备中都有2天的归档,这样其实每次归档全备都有重复的归档日志,这样没有办法,因为又要保证本地有2天内的归档,又要保证14天前的全备有归档可以恢复,可以最大程度减少数据的丢失,确保异常时可以使用上一次的全备+覆盖之内的归档进行完全恢复。所以find查出14天之前的进行rm删除,也就是保留14天内的14份。
案例一:对Oracle实例进行rman全库备份。保留4份rman完整备份,14天的归档备份
一、数据备份的路径规划:/backup(通过存储挂到本机目录下,权限oracle用户)
oracle用户:
[oracle@lf ~]$ mkdir /backup
[oracle@lf ~]$ cd /backup
[oracle@lf backup]$ mkdir full
[oracle@lf backup]$ mkdir script
[oracle@lf backup]# mkdir logs
[root@lf /]# chown oracle:oinstall /backup/
###子目录:full(rman全备的数据)、script(备份脚本)、logs(备份日志)
二、归档的保存目录
sql> archive log list;
三、使用nocatalog保存实例的备份信息,增加时长
sql> alter system set control_file_record_keep_time=31 scope=both sid='*';
###当使用rman nocatalog方式备份时,备份controlfile是非常重要的。建议将参数文件中的control_file_record_keep_time值加大(缺省为7天) ,参数在$oracle_home/dbs/initsid.ora中。超过这个期限就会删除备份信息,这样对数据库还原恢复有影响,调整为31天
四、调整rman策略
RMAN> show all; ---详细的介绍参考“rman理论(跨版本迁移、block tracking、DRA)、catalog”文档下面是重要的几个策略,策略的后面有“# default”表示为默认的策略没有被修改过
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default #备份保存策略。按照全备脚本修改
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default #备份时是否自动备份控制文件。按照默认的关闭即可,因为全备脚本有单独备份控制文件和参数文件
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default #归档删除策略。按照默认的不配置,因为归档备份脚本有配置策略
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/oracle/app/oracle/product/11.2.0/db_1/dbs/snapcf_rmanbackup.f'; # default #配置RMAN 备份时的快照控制文件的位置。快照控制文件(snapshot control file)是 RMAN 在进行备份时创建的一个临时性的控制文件副本,用于记录备份操作的元数据信息。每次进行备份时,RMAN 都会生成一个新的快照控制文件,并在备份完成后自动删除。因此不需要担心每次备份都会生成新的snapcf_rmanbackup.f文件,因为这个文件只是一个临时的副本,其目的是为了确保备份的一致性和完整性。RMAN 会自动管理这个过程,包括创建和清理快照控制文件,只需关注备份策略和相关的配置即可。单机环境使用FS文件系统,如果是rac环境必须使用ASM存储快照控制文件的位置:CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+磁盘组/实例名/snapcf_实例名.f'; ,rac环境不配置到ASM环境的话就会导致在全备时报错ORA-19606: Cannot copy or restore to snapshot control file
五、脚本一:全库备份,每周一和每周五进行全备,保留4份全备。包括数据文件(数据文件、undo文件、temp文件)、控制文件、参数文件
[oracle@lf backup]$ cd script/
[oracle@lf script]$ vi rman_full_orcl_backup.sh备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本export BAKDATE=`date +%Y%m%d`
export ORACLE_SID=orcl1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1$ORACLE_HOME/bin/rman target / log=/backup/logs/rman_full_orcl_backup$BAKDATE.log << EOF #按照日志生成不同的备份日志,便于排查在备份过程的问题run
{
CONFIGURE RETENTION POLICY TO NONE; #none可以把使备份保持策略失效,此时REPORT OBSOLETE和DELETE OBSOLETE将不把任何备份文件视为废弃。测试过备份策略保留4份(CONFIGURE RETENTION POLICY TO REDUNDANCY 4;),备份策略中包括了全备、参数文件、控制文件、归档文件的备份,但在实际第4次运行时发现,删除了第一个和第二次的参数文件和控制文件,非常的奇怪,所以不采用备份策略(CONFIGURE RETENTION POLICY TO NONE;),采用linux的rm -rf实现删除备份,服务器上没有的备份介质,通过crosscheck backup;和delete noprompt expired backup;删除rman的备份相关信息crosscheck backup;
delete noprompt expired backup; #删除过期的备份集。因为采用linux的rm -rf实现删除备份,服务器上没有的备份介质,所以通过crosscheck backup;和delete noprompt expired backup;删除rman的备份相关信息
crosscheck copy;
delete noprompt expired copy; #删除过期的备份。同上
crosscheck archivelog all;
delete noprompt expired archivelog all; #删除过期的归档备份。同上
}run { #rman工具内部命令
allocate channel d1 type disk; #分配通道d1,类型为磁盘
allocate channel d2 type disk; #分配通道d2,类型为磁盘(生产上结合io的处理并发的能力,按需分配通道,2个通道同时进行)
setlimit channel d1 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。
setlimit channel d2 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。(为优化参数,2个通道同时进行,也就是以400M/s存到缓存向磁盘写入。生产上结合io的处理并发的能力)sql 'alter system archive log current'; #会对数据库中所有实例执行日志切换,进行归档backupAS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。压缩后的备份集为实际数据量的30%左右tag orcl_full #tag是将备份集命名 format '/backup/full/orcl_full_%s_%p_%T' #备份文件的保存路径,默认保存在闪回路径下。 (database); #database表示全库备份(全备)
release channel d1; #释放通道d1
release channel d2; #释放通道d2allocate channel d3 type disk;
backup
tag orcl_ctl
format '/backup/full/orcl_ctl_%s_%p_%T' current controlfile; #备份当前控制文件,并指定保存路径
release channel d3; allocate channel d4 type disk;
backup
tag orcl_spfile
format '/backup/full/orcl_spfile_%s_%p_%T' spfile; #备份当前参数文件,并指定保存路径
release channel d4;
}
exit
EOFfind /backup/full \( -name "orcl_full_*" -o -name "orcl_ctl_*" -o -name "orcl_spfile_*" \) -mtime +14 -exec rm -rf {} \; #-mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。rman 进行crosscheck就会把所有的备份片访问一遍,那么如果写-atime(被访问过的文件)就不是实际之前的文件了,从而导致删除失效。因为计划任务是每周一和每周五执行,所以find查出14天之前的进行rm删除,也就是保留14天内的4份。备注:目前采用find这种方式最保险,因为测试过备份策略的方式有问题,参考上面“CONFIGURE RETENTION POLICY TO NONE;”的备注。
六、脚本二:归档备份,每天进行一次归档全备和保留,根据全备的策略,需要保留14天归档备份
归档备份需要单独放一个脚本,如果将归档备份放在全备中,全备一般数据较大那么就是每星期备份1到2次,以每星期一和星期五全备和包含归档备份为例,如果是rac环境,星期四发生ASM整个都坏了包括在ASM的归档日志,那么只能用星期一的全备和归档进行恢复,丢失了星期二、星期三、星期四的数据。
本地归档日志保留2天内的,并且每天进行一次定时任务的归档全备,根据全备的策略(每周一和每周五进行全备,保留4份全备),需要保留14次的归档全备定时任务。本地归档日志保留2天内是因为需要保证dg库万一断了,那么本地还有2天的归档,那么还可以通过FAL进程将本地归档传输过去。而保留14次的归档全备定时任务就是保留了14次的归档全备,每次归档全备中都有2天的归档,这样其实每次归档全备都有重复的归档日志,这样没有办法,因为又要保证本地有2天内的归档,又要保证14天前的全备有归档可以恢复,可以最大程度减少数据的丢失,确保异常时可以使用上一次的全备+覆盖之内的归档进行完全恢复。
[oracle@lf backup]$ cd script/
[oracle@lf script]$ vi rman_arch_orcl_backup.sh备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本export BAKDATE=`date +%Y%m%d`
export ORACLE_SID=orcl1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1$ORACLE_HOME/bin/rman target / log=/backup/logs/rman_arch_orcl_backup$BAKDATE.log << EOF #按照日志生成不同的备份日志,便于排查在备份过程的问题run
{
crosscheck archivelog all; #验证实例所有的归档,根据的是archive log list
delete noprompt expired archivelog all; #删除rman里面显示过期的归档记录。上面的操作是物理删除,但rman的记录还在
delete noprompt force archivelog until time "sysdate-2"; #删除2天前的归档,就是从当前日期开始保留2天内的。加上force参数,解决:RMAN-08138: WARNING: archived log not deleted - must create more backups。原因为CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 10 TIMES TO 'SBT_TAPE';删除的归档日志不符合删除日志之前所需的用户指定的归档日志删除策略数量的备份
}run
{
allocate channel d5 type disk;
backup
AS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。
tag orcl_arch
format '/backup/full/orcl_arch_%s_%p_%T' archivelog all; #备份当前归档,并指定保存路径
release channel d5; #释放通道d5。用于备份归档。如果单独写一个归档备份脚本,即脚本有CONFIGURE RETENTION POLICY TO REDUNDANCY 2,经过测试也不会保留2份归档备份集,而是一直进行备份。如果将备份语句写到全备里面,经过测试可以实现只保留2份归档备份
}
exit
EOFfind /backup/full -name "orcl_arch_*" -mtime +14 -exec rm -rf {} \; #-mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。rman 进行crosscheck就会把所有的备份片访问一遍,那么如果写-atime(被访问过的文件)就不是实际之前的文件了,从而导致删除失效。本地归档日志保留2天内的,并且每天进行一次定时任务的归档全备,根据全备的策略(每周一和每周五进行全备,保留4份全备),需要保留14次的归档全备定时任务。本地归档日志保留2天内是因为需要保证dg库万一断了,那么本地还有2天的归档,那么还可以通过FAL进程将本地归档传输过去。而保留14次的归档全备定时任务就是保留了14次的归档全备,每次归档全备中都有2天的归档,这样其实每次归档全备都有重复的归档日志,这样没有办法,因为又要保证本地有2天内的归档,又要保证14天前的全备有归档可以恢复,可以最大程度减少数据的丢失,确保异常时可以使用上一次的全备+覆盖之内的归档进行完全恢复。所以find查出14天之前的进行rm删除,也就是保留14天内的14份。
七、在oracle用户下执行rman全备和归档备份的计划任务
[oracle@lf script]# chmod 775 /backup/script/*.sh --确保root用户有执行权限
[oracle@lf script]# crontab -e
备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本#rman_full
00 23 * * 1,5 sh /backup/script/rman_full_orcl_backup.sh #每周一和周五执行一次全备,保留4份#rman_arch
00 02 * * * sh /backup/script/rman_arch_orcl_backup.sh #每天凌晨进行归档全备,保留14天
八、oracle用户下测试脚本可用性,并查看日志
[oracle@lf script]# sh /backup/script/rman_full_orcl_backup.sh
[oracle@lf script]# sh /backup/script/rman_arch_orcl_backup.sh[oracle@lf logs]$ tail -200f /backup/logs/rman_arch_orcl_backup20231106.log
[oracle@lf logs]$ tail -200f /backup/logs/rman_full_orcl_backup20231106.log
1.2 rman增量备份(基本、差异、累计增量备份的总称):
RMAN的块跟踪(增量的时候必须开,在RAC环境中,change tracking file需要放在共享存储上):
Block change tracking 记录自从上一次备份以来数据块的变化,并把这些信息记录在跟踪文件中。RMAN使用这个文件判断增量备份中需要备份的变更数据。这极大的促进了备份性能,RMAN可以不再扫描整个文件以查找变更数据。为此Oracle引入了一个新的后台进程,CTWR,其全称为Change Tracking Writer,用于记录变化的块并将变化写入相应的日志文件中。
开启|关闭rman block tracking块跟踪。增量的时候必须开。在使用RMAN增量备份的情况下,启动block change tracking,在做增量备份时会缩短RMAN备份的时间, 因为不用扫描整个data file。 但是block tracking也会带来其他的一些开销。所以要根据实际情况决定是否启用block change tracking
开启: SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/home/oracle/block.trc'; SQL> select status,filename from v$block_change_tracking; 禁用: SQL>alter database disable block change tracking;
增量备份(基本、差异、累计增量备份的总称):
从基本备份以来被修改过或增加过的数据块。增量备份分为0级增量基本备份、1级差异增量备份、1级累积增量备份,增量备份支持归档和非归档模式,并且只能使用rman才可以实现增量备份。
- 基本增量(backup incremental level=0 database):基本备份的增量级别为0,执行增量备份操作时,首先需要的是增量基本备份(incremental base backup),以后所有的增量备份都基于这个基本备份。如果没有生成基本备份就尝试执行增量备份操作,RMAN 会自动执行基本备份操作。所以基本增量备份也可以理解为全库备份。
- 差异增量(backup incremental level=1 database):差异备份的增量级别为1,对于差异增量备份来说,第一次是基本备份以来所有变化的数据块,之后RMAN会备份自上次同级或者低级差异增量备份以来所发生变化的数据块,差异备份是RMAN生成的增量备份的默认类型。差异增量是根据上一次备份后,备份有变化的数据。这种备份把全库数据分为一小段一小段的,节省了空间,但在恢复时会很麻烦需要逐个恢复。所以不建议使用
- 累积增量(backup incremental level =1 cumulative database):累计备份的增量级别为1 cumulative,对于累计增量备份来说,累计增量是根据上一次备份后,备份最开始到生产的所有数据,占用了空间,在恢复时只需恢复一个即可。累计增量适用于数据量小的数据库,如果数据量很大也不建议使用差异增量备份,在backup 命令中使用cumulative关键字。
基本增量备份脚本:包括数据文件(数据文件、undo文件、temp文件)、控制文件、参数文件。以下只是基本增量备份和全库备份脚本不一样的部分,其他部分的备份内容可以去参考上面的全库备份脚本哦
backupincremental level 0 #如果没有生成基本备份就尝试执行增量备份操作,RMAN会自动执行基本备份操作。差异增量备份第一次备份必须需要incremental level 0先生成基本备份,然后差异备份incremental level 1根据基本备份只备份有变化的数据。但是在生产中不可能先写一条incremental level 0再写一条incremental level 1,所以直接写incremental level 1在第一次RMAN会自动执行基本备份AS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。压缩后的备份集为实际数据量的30%左右tag orcl_full_level0 #tag是将备份集命名 format '/路径/orcl_full_level0_%s_%p_%T' #备份文件的保存路径,默认保存在闪回路径下。 (database); #database表示全库备份(全备)
差异增量备份脚本:包括数据文件(数据文件、undo文件、temp文件)、控制文件、参数文件。以下只是差异增量备份和全库备份脚本不一样的部分,其他部分的备份内容可以去参考上面的全库备份脚本哦
backupincremental level 1 #如果没有生成基本备份就尝试执行增量备份操作,RMAN会自动执行基本备份操作。差异增量备份第一次备份必须需要incremental level 0先生成基本备份,然后差异备份incremental level 1根据基本备份只备份有变化的数据。但是在生产中不可能先写一条incremental level 0再写一条incremental level 1,所以直接写incremental level 1在第一次RMAN会自动执行基本备份AS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。压缩后的备份集为实际数据量的30%左右tag orcl_full_level1 #tag是将备份集命名 format '/backup/full/orcl_full_level1_%s_%p_%T' #备份文件的保存路径,默认保存在闪回路径下。 (database); #database表示全库备份(全备)
案例一:对Oracle实例进行rman增量备份。保留4份rman基本增量备份,14份rman差异增量备份,14天的归档备份
一、开启RMAN的块跟踪(增量的时候必须开,在RAC环境中,change tracking file需要放在共享存储上):
SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/home/oracle/block.trc';
SQL> select status,filename from v$block_change_tracking;
二、数据备份的路径规划:/backup(通过存储挂到本机目录下,权限oracle用户)
oracle用户:
[oracle@lf ~]$ mkdir /backup
[oracle@lf ~]$ cd /backup
[oracle@lf backup]$ mkdir full
[oracle@lf backup]$ mkdir script
[oracle@lf backup]# mkdir logs
[root@lf /]# chown oracle:oinstall /backup/
###子目录:full(rman全备的数据)、script(备份脚本)、logs(备份日志)
三、归档的保存目录
sql> archive log list;
四、使用nocatalog保存实例的备份信息,增加时长
sql> alter system set control_file_record_keep_time=31 scope=both sid='*';
###当使用rman nocatalog方式备份时,备份controlfile是非常重要的。建议将参数文件中的control_file_record_keep_time值加大(缺省为7天) ,参数在$oracle_home/dbs/initsid.ora中。超过这个期限就会删除备份信息,这样对数据库还原恢复有影响,调整为31天
五、调整rman策略
RMAN> show all; ---详细的介绍参考“rman理论(跨版本迁移、block tracking、DRA)、catalog”文档下面是重要的几个策略,策略的后面有“# default”表示为默认的策略没有被修改过
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default #备份保存策略。按照全备脚本修改
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default #备份时是否自动备份控制文件。按照默认的关闭即可,因为全备脚本有单独备份控制文件和参数文件
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default #归档删除策略。按照默认的不配置,因为归档备份脚本有配置策略
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/oracle/app/oracle/product/11.2.0/db_1/dbs/snapcf_rmanbackup.f'; # default #配置RMAN 备份时的快照控制文件的位置。快照控制文件(snapshot control file)是 RMAN 在进行备份时创建的一个临时性的控制文件副本,用于记录备份操作的元数据信息。每次进行备份时,RMAN 都会生成一个新的快照控制文件,并在备份完成后自动删除。因此不需要担心每次备份都会生成新的snapcf_rmanbackup.f文件,因为这个文件只是一个临时的副本,其目的是为了确保备份的一致性和完整性。RMAN 会自动管理这个过程,包括创建和清理快照控制文件,只需关注备份策略和相关的配置即可。单机环境使用FS文件系统,如果是rac环境必须使用ASM存储快照控制文件的位置:CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+磁盘组/实例名/snapcf_实例名.f'; ,rac环境不配置到ASM环境的话就会导致在全备时报错ORA-19606: Cannot copy or restore to snapshot control file
六、脚本一:基本增量备份,每周一和每周五进行基本增量备份,保留4份。包括数据文件(数据文件、undo文件、temp文件)、控制文件、参数文件
[oracle@lf backup]$ cd script/
[oracle@lf script]$ vi rman_full_orcl_backup_level0.sh
备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本export BAKDATE=`date +%Y%m%d`
export ORACLE_SID=orcl1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1$ORACLE_HOME/bin/rman target / log=/backup/logs/rman_full_orcl_backup_level0_$BAKDATE.log << EOF #按照日志生成不同的备份日志,便于排查在备份过程的问题run
{
CONFIGURE RETENTION POLICY TO NONE; #none可以把使备份保持策略失效,此时REPORT OBSOLETE和DELETE OBSOLETE将不把任何备份文件视为废弃。测试过备份策略保留4份(CONFIGURE RETENTION POLICY TO REDUNDANCY 4;),备份策略中包括了全备、参数文件、控制文件、归档文件的备份,但在实际第4次运行时发现,删除了第一个和第二次的参数文件和控制文件,非常的奇怪,所以不采用备份策略(CONFIGURE RETENTION POLICY TO NONE;),采用linux的rm -rf实现删除备份,服务器上没有的备份介质,通过crosscheck backup;和delete noprompt expired backup;删除rman的备份相关信息crosscheck backup;
delete noprompt expired backup; #删除过期的备份集。因为采用linux的rm -rf实现删除备份,服务器上没有的备份介质,所以通过crosscheck backup;和delete noprompt expired backup;删除rman的备份相关信息
crosscheck copy;
delete noprompt expired copy; #删除过期的备份。同上
crosscheck archivelog all;
delete noprompt expired archivelog all; #删除过期的归档备份。同上
}run { #rman工具内部命令
allocate channel d1 type disk; #分配通道d1,类型为磁盘
allocate channel d2 type disk; #分配通道d2,类型为磁盘(生产上结合io的处理并发的能力,按需分配通道,2个通道同时进行)
setlimit channel d1 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。
setlimit channel d2 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。(为优化参数,2个通道同时进行,也就是以400M/s存到缓存向磁盘写入。生产上结合io的处理并发的能力)sql 'alter system archive log current'; #会对数据库中所有实例执行日志切换,进行归档backupincremental level 0 #如果没有生成基本备份就尝试执行增量备份操作,RMAN会自动执行基本备份操作。差异增量备份第一次备份必须需要incremental level 0先生成基本备份,然后差异备份incremental level 1根据基本备份只备份有变化的数据。但是在生产中不可能先写一条incremental level 0再写一条incremental level 1,所以直接写incremental level 1在第一次RMAN会自动执行基本备份AS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。压缩后的备份集为实际数据量的30%左右tag tag orcl_full_level0 #tag是将备份集命名 format '/backup/full/orcl_full_level0_%s_%p_%T' #备份文件的保存路径,默认保存在闪回路径下。 (database); #database表示全库备份(全备)
release channel d1; #释放通道d1
release channel d2; #释放通道d2allocate channel d3 type disk;
backup
tag orcl_ctl
format '/backup/full/orcl_ctl_%s_%p_%T' current controlfile; #备份当前控制文件,并指定保存路径
release channel d3; allocate channel d4 type disk;
backup
tag orcl_spfile
format '/backup/full/orcl_spfile_%s_%p_%T' spfile; #备份当前参数文件,并指定保存路径
release channel d4;
}
exit
EOFfind /backup/full \( -name "orcl_full_level0_*" -o -name "orcl_ctl_*" -o -name "orcl_spfile_*" \) -mtime +14 -exec rm -rf {} \; #-mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。rman 进行crosscheck就会把所有的备份片访问一遍,那么如果写-atime(被访问过的文件)就不是实际之前的文件了,从而导致删除失效。因为计划任务是每周一和每周五执行,所以find查出14天之前的进行rm删除,也就是保留14天内的4份。备注:目前采用find这种方式最保险,因为测试过备份策略的方式有问题,参考上面“CONFIGURE RETENTION POLICY TO NONE;”的备注。
七、脚本二:差异增量备份。每天进行一次差异增量备份,根据基本增量备份的策略,需要保留14天差异增量备份(差异增量在一定程度上可以替代归档备份了)
根据基本增量备份的策略(每周一和每周五进行基本增量备份,保留4份基本增量备份),需要保留14次的差异增量备份定时任务,确保异常时可以使用上一次的基本增量备份+覆盖之内的差异增量备份进行完全恢复。所以find查出14天之前的进行rm删除,也就是保留14天内的14份
[oracle@lf backup]$ cd script/
[oracle@lf script]$ vi rman_full_orcl_backup_level1.sh
备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本export BAKDATE=`date +%Y%m%d`
export ORACLE_SID=orcl1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1$ORACLE_HOME/bin/rman target / log=/backup/logs/rman_full_orcl_backup_level1_$BAKDATE.log << EOF #按照日志生成不同的备份日志,便于排查在备份过程的问题
run
{ #rman工具内部命令
allocate channel d1 type disk; #分配通道d1,类型为磁盘
allocate channel d2 type disk; #分配通道d2,类型为磁盘(生产上结合io的处理并发的能力,按需分配通道,2个通道同时进行)
setlimit channel d1 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。
setlimit channel d2 kbytes 204800000 maxopenfiles 32 readrate 200; #限制通道d1的一个备份集最大为204800000kb(200G),最大打开文件数为32个,每秒向缓存读200M。(为优化参数,2个通道同时进行,也就是以400M/s存到缓存向磁盘写入。生产上结合io的处理并发的能力)sql 'alter system archive log current'; #会对数据库中所有实例执行日志切换,进行归档backup
incremental level 1 #如果没有生成基本备份就尝试执行增量备份操作,RMAN会自动执行基本备份操作。差异增量备份第一次备份必须需要incremental level 0先生成基本备份,然后差异备份incremental level 1根据基本备份只备份有变化的数据。但是在生产中不可能先写一条incremental level 0再写一条incremental level 1,所以直接写incremental level 1在第一次RMAN会自动执行基本备份AS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。压缩后的备份集为实际数据量的30%左右tag tag orcl_full_level1 #tag是将备份集命名 format '/backup/full/orcl_full_level1_%s_%p_%T' #备份文件的保存路径,默认保存在闪回路径下。 (database); #database表示全库备份(全备)
release channel d1; #释放通道d1
release channel d2; #释放通道d2
###基本增量备份参数文件和控制文件了,所以在差异增量备份中就不需要再次进行备份了。
}
exit
EOFfind /backup/full -name "orcl_full_level1_*" -mtime +14 -exec rm -rf {} \; #-mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。rman 进行crosscheck就会把所有的备份片访问一遍,那么如果写-atime(被访问过的文件)就不是实际之前的文件了,从而导致删除失效。
八、脚本三:归档备份,每天进行一次归档全备和保留,需要保留14天归档备份
因为有差异增量了,所以备份归档就是为了以后进行日志挖掘使用,因为每天备份的差异增量在一定程度上可以替代归档备份了
[oracle@lf backup]$ cd script/
[oracle@lf script]$ vi rman_arch_orcl_backup.sh
备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本export BAKDATE=`date +%Y%m%d`
export ORACLE_SID=orcl1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1$ORACLE_HOME/bin/rman target / log=/backup/logs/rman_arch_orcl_backup$BAKDATE.log << EOF #按照日志生成不同的备份日志,便于排查在备份过程的问题run
{
crosscheck archivelog all; #验证实例所有的归档,根据的是archive log list
delete noprompt expired archivelog all; #删除rman里面显示过期的归档记录。上面的操作是物理删除,但rman的记录还在
delete noprompt force archivelog until time "sysdate-2"; #删除2天前的归档,就是从当前日期开始保留2天内的。加上force参数,解决:RMAN-08138: WARNING: archived log not deleted - must create more backups。原因为CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 10 TIMES TO 'SBT_TAPE';删除的归档日志不符合删除日志之前所需的用户指定的归档日志删除策略数量的备份
}run
{
allocate channel d5 type disk;
backup
AS COMPRESSED BACKUPSET #压缩备份压缩是为了节省空间,但压缩时cpu会飙升,性能换空间。
tag orcl_arch
format '/backup/full/orcl_arch_%s_%p_%T' archivelog all; #备份当前归档,并指定保存路径
release channel d5; #释放通道d5。用于备份归档。如果单独写一个归档备份脚本,即脚本有CONFIGURE RETENTION POLICY TO REDUNDANCY 2,经过测试也不会保留2份归档备份集,而是一直进行备份。如果将备份语句写到全备里面,经过测试可以实现只保留2份归档备份
}
exit
EOFfind /backup/full -name "orcl_arch_*" -mtime +14 -exec rm -rf {} \; #-mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。rman 进行crosscheck就会把所有的备份片访问一遍,那么如果写-atime(被访问过的文件)就不是实际之前的文件了,从而导致删除失效。
九、在oracle用户下执行rman全备和归档备份的计划任务
[oracle@lf script]# chmod 775 /backup/script/*.sh --确保root用户有执行权限
[oracle@lf script]# crontab -e
备注:如果在系统的oracle用户下执行就必须带有ORACLE_SID和ORACLE_HOME等变量,因为定时任务执行时是不执行变量的,所以需要在脚本中定义,如果是在系统的root用户下执行,那么可以在定时任务加“-”用于执行变量(-:切换用户并允许环境变量.bash_profile),或者在定时任务不加“-”,还是将变量放在脚本中定义。系统oracle用户下定义定时任务:* * * * * 脚本系统root用户下定义定时任务:* * * * * su - oracle -c脚本#rman_full_level0
00 23 * * 1,5 sh /backup/script/rman_full_orcl_backup_level0.sh #每周一和周五执行一次基本增量备份,保留4份#rman_full_level1
00 02 * * * sh /backup/script/rman_full_orcl_backup_level1.sh #每天凌晨进行差异增量备份,保留14天#rman_arch
00 03 * * * sh /backup/script/rman_arch_orcl_backup.sh #每天凌晨进行归档全备,保留14天
十、oracle用户下测试脚本可用性,并查看日志
[oracle@lf script]# sh /backup/script/rman_full_orcl_backup_level0.sh
[oracle@lf script]# sh /backup/script/rman_full_orcl_backup_level1.sh
[oracle@lf script]# sh /backup/script/rman_arch_orcl_backup.sh [oracle@11g logs]$ tail -200f /backup/logs/rman_arch_orcl_backup20240122.log
[oracle@11g logs]$ tail -200f /backup/logs/rman_full_orcl_backup_level0_20240122.log
[oracle@11g logs]$ tail -200f /backup/logs/rman_full_orcl_backup_level1_20240122.log
2、总结一下rman完整备份or增量备份该怎么用
那应该是用rman完整备份还是增量备份呢?我的 建议使用rman完整备份+归档备份即可 ,而不建议使用rman基本增量备份+rman差异增量备份+归档备份,因为在上面理论部分也说了( 对于差异增量备份来说,第一次是基本备份以来所有变化的数据块,之后RMAN会备份自上次同级或者低级差异增量备份以来所发生变化的数据块,差异备份是RMAN生成的增量备份的默认类型。差异增量是根据上一次备份后,备份有变化的数据。这种备份把全库数据分为一小段一小段的,节省了空间,但在恢复时会很麻烦需要逐个恢复。所以不建议使用 ),差异增量在一定程度上可以替代归档备份了,但是不能因为执行了差异增量而不备份归档了,因为备份归档就是为了以后进行日志挖掘使用,所以归档也是必须要备份,既然差异增量备份的内容可以通过归档备份的内容进行恢复,那么差异增量备份有点多此一举呢,所以我的 建议使用rman完整备份+归档备份即可 。
兄弟们,今天关于备份的内容已经全部介绍完事了,那么备份的知识我们已经掌握得差不多了,从下篇开始将开始探讨数据恢复的相关内容啦!see you