OracleRMAN备份实战
通过前面的若干示例,我们已经了解并尝试了RMAN备份的一些命令,但是在实际环境中,不可能每次备份都要求DBA一条命令一条命令来敲(DBA手指头都痉挛啦,老板看着更是肉疼,早知道就是打几个字母,雇个打字的,成本不是更低么),通过前面章节的学习我们立志一定要优化的干活,所以我们应该写好一段脚本,然后放在服务器端定时执行。DBA只需要定期看看脚本执行的结果就成了。
在真正写脚本之前,先明确一下我们的目标:
每天夜间1点执行。
数据库全备,同时备份控制文件及归档日志文件,备份文件保存至F:oraclebackup目录下,并在完成归档日志文件备份后,自动删除已备份的归档日志。
备份保留14天,过期则自动删除。
保留操作日志备查。
以Windows环境为例(Linux/U NIX 环境下与此基本类似,对于RMAN的脚本,甚至连改都不用改,就把调用RMAN脚本的命令行以及备份集保存路径改改就行了!
8.6.1 编写 RMAN 批处理文件
编写RMAN批处理文件:
RUN {
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ' F:ORACLEBACKUP%F ' ;
ALLOCATE CHANNEL C1 DEVICE TYPE DISK FORMAT ' F:ORACLEBACKUPBAK_%U ' ;
BACKUP DATABASE SKIP INACCESSIBLE
PLUS ARCHIVELOG FILESPERSET 20
DELETE ALL INPUT;
RELEASE CHANNEL C1;
}
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK;
CROSSCHECK BACKUPSET;
DELETE NOPROMPT OBSOLETE;
保存至F: oraclescriptbackupdb_fullbak_jssbook.rman 。
提示:
前几行中的CONFIGURE命令也可以放到批处理脚本之外执行,只需要执行一次即可,因为所有的CONFIGURE配置都将存入目标端数据库的控制文件,只要无人改过就一直有效。
上述的各项命令均在前面几个章节中提到过,如果有看着眼生的话,再回去翻看前面的内容。命令是都知晓,可能有几个参数会不明白其意义。
比如:BACKUP命令中的SKIP INACCESSIBLE参数,大家别着急,静心等候俺的外……外外……外外外……(大锅,看个笔记而已,您不用拎着把菜刀到处晃吧,你你你,你别过来,我说还不成嘛), en ,看到大家如此虔诚,俺就提前透露这部分内容吧。
(1)BACKUP SKIP参数。
SKIP INACCESSIBLE :表示跳过不可读的文件。我们知道一些 OFFLINE 状态的数据文件只要存在于磁盘上就仍然可能被读取,但是可能有些文件已经被删除或移到它处而不可读,加上这个参数就会跳过这些文件。
SKIP OFFLINE :表示跳过 OFFLINE 的数据文件;
SKIP READONLY :表示跳过那些所在表空间为 READ ONLY 的数据文件。
(2)FILESPERSET参数。
该参数用来设置一个备份集中最多能够包含的文件。本例中是出现在备份归档的子句中,因此用来限制每个归档备份集中最多只能包括20个归档文件,如果有超过20个归档文件需要备份的话,那么在执行备份时会创建多个归档文件的备份集。
使用BACKUP命令备份其他类型的文件(除了备份集),也支持FILESPERSET参数,作用是相同的。
(3)ALLOCATE CHANNEL FOR MAINTENANCE命令。
这个命令乍看与ALLOCATE CHANNEL非常相似,再看还是相似,其实也确实是相似(俺是说相似,没说相同),ALLOCATE CHANNEL FOR MAINTENANCE命令也是用来分配通道的,但分配的通道专用于CHANGE、DELETE、CROSSCHECK命令,并且也不需要(而且也不能)包含在RUN块中。
默认配置下CONFIGURE已经分配了一个指定 DISK 的通道,因此也可以不需要执行ALLOCATE CHANNEL FOR MAINTENANCE命令,另外Oracle也建议通过CONFIGURE分配通道,来替代使用该命令维护管理用的专用通道,这可能会增强备份脚本的复杂度。
提示:
如果你试过从网上搜索RMAN备份脚本,可能有些脚本中会出现一行“sql 'alter system archive log current';”,这句是让 ARCHIVELOG 日志归档,实际上完全没必要,我们在前面的内容中讲过,通过 PLUS ARCHIVELOG 方式备份时, RMAN 会自动对当前的 ARCHIVELOG 进行归档。
8.6.2 编写命令执行批处理
设定要备份的数据库SID为 jssbook ,将日志按照日期输出到F: oraclescriptbackuplogs 目录。
SET ORACLE_SID=jssbook
RMAN TARGET/LOG F:ORACLESCRIPTBACKUPLOGSBAK_%DATE: ~ 0,10%.LOG CMDFILE= F:ORACLESCRIPTBACKUP DB_FULLBAK_JSSBOOK.RMAN
将上述内容保存至F: oraclescriptbackupdb_fullbak_jssbook.bat 。
8.6.3 设定执行计划
利用“控制面板”中的“任务计划”中的“添加任务计划”图标添加计划,运行F: oraclescriptbackupdb_fullbak_jssbook.bat ,设定日程安排中的时间为指定中的时间。
竣工!
说是实战,实际上演练的味道依然浓厚,谁让咱这是在测试呢。上述脚本已初具雏形,当然还应该再增加一些更合理的配置,比如根据您的数据库大小,适当调整通道数量,以及加上日期的判断,根据时间进行增量备份。
对于小型数据库(不超100GB)的备份相对来说还是很简单的,甚至每次备份都是完全备份也可以接受,因此在备份策略上能够非常灵活,或者说随意。对于那些数百G甚至过T的数据库,我想就需要花些心思来考虑备份策略的问题了。
对于超大型数据库的备份,基本上就没有什么固定套路,毕竟系统环境、存储设备及应用的特点都是不同的,不过有一点我想毋庸置疑:备份的目的是为了更好的恢复,因此做好备份与恢复之间开销的平衡应该是所有备份策略的终极目标。
备份终于完了。不过别松气,这仅仅只是开始,加油