Windows平台下Oracle数据库备份脚本

如下脚本是我在项目工做中使用的备份脚本,脚本都是本身写的。但在使用过程当中,感受还有提供空间,我这我的有点懒,因此想用将脚本“开源”出来的方式督促本身完善这一套脚本。你们若是对此脚本有什么建议,随时能够提出来你们一块儿提升。sql

简介

此套脚本能够实现对oracle数据库实现全备份和增量备份。主要由rman_level0.cmd和rman_level1.cmd组成。
其中,rman_level0.cmd引用rman_level0.rcv做为rman命令输入,rman_level1.cmd引用rman_level1.rcv做为rman命令输入。数据库

此套脚本使用的目录结构以下:
备份目录结构
其中,segmentfault

  • archlog 存放归档日志备份
  • cntrfile 控制文件备份
  • data 数据库文件备份
  • log 备份日志
  • scripts 备份脚本相关

脚本内容

全备脚本

rman_level0.batwindows

rman target / CMDFILE 'D:\backup\rman_backup\scripts\rman_level0.rcv' LOG D:\backup\rman_backup\log\level0_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

rman_level0.rcvoracle

run {
      sql 'alter system archive log current';
      allocate channel c1 type disk;
      backup as compressed backupset
      incremental level 0
      format 'D:\backup\rman_backup\data\level0_%T_%t_s%s_p%p' database
      plus archivelog format 'D:\backup\rman_backup\archlog\archlog_%T_t%t_s%s_p%p' delete input;
      backup format 'D:\backup\rman_backup\cntrfile\controlfile_%T_s%s_p%p' current controlfile;
      release channel c1;
      crosscheck backup;
      delete noprompt obsolete;
      crosscheck archivelog all;
}
exit;

增量备份脚本

rman_level1.cmdspa

rman target / CMDFILE 'D:\backup\rman_backup\scripts\rman_level1.rcv' LOG D:\backup\rman_backup\log\level1_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

rman_level1.rcv日志

run {
      sql 'alter system archive log current';
      allocate channel c1 type disk;
      backup as compressed backupset
      incremental level 1
      format 'D:\backup\rman_backup\data\level1_%T_%t_s%s_p%p' database
      plus archivelog format 'D:\backup\rman_backup\archlog\archlog_%T_t%t_s%s_p%p' delete input;
      backup format 'D:\backup\rman_backup\cntrfile\controlfile_%T_s%s_p%p' current controlfile;
      release channel c1;
      crosscheck backup;
      delete noprompt obsolete;
      crosscheck archivelog all;
}
exit;

存在的问题及解决

rman log中日期字符串的问题

目前日期字符串是使用从date和time命令的输出中截取须要的字符,组成须要的字符串。code

第1种状况,当time在0-9时之间时,字符串输出以下:orm

C:\Users\YangJia>echo %date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%t
ime:~6,2%
20140119_ 10802

第2中状况,当time在10-23之间时,字符串输出以下:ip

C:\Users\YangJia>echo %date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%t
ime:~6,2%
20140119_230953

这个时候问题就出现了,当运行脚本时属于第一种状况,脚本会认为LOG参数在"_"以后就结束了,致使最终生成的日志文件名出现不完整的状况。
解决此问题有两个思路,一是将多出来的空格去掉,二是让cmd认为脚本并非从空格处就结束 了。
如下针对两种思路给出方法:

第一种思路:
将log文件名使用%filename%变量替换,设置%filename%变量以前,对日期格式进行判断,而后设置%filename%内容:

set logfile=level0_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
if "%time:~0,1%" == " " ^
set logfile=level0_%date:~0,4%%date:~5,2%%date:~8,2%_0%time:~1,1%%time:~3,2%%time:~6,2%.log

这部分解决有参考http://stackoverflow.com/questions/1192476/windows-batch-script-format-date-and-time

rman中删除无效备份和archivelog的考虑

rman中删除无效(expired)备份和archivelog的方式通常步骤是:
1. crosscheck backup &crosscheck archivelog all
2. delete expired backup;
3. delete expired archivelog;

若是将以上操做加入到脚本中,无效(expired)备份和archivelog会被自动清理掉,这样可能就会在不知情的状况下致使丢失recovery window中的片断,致使recovery window不完整。

若是不加入备份脚本,在有无效(expired)备份和归档日志的状况下,就会出现备份archivelog失败致使整个备份脚本运行失败,可能会致使归档日志不能自动清除将磁盘空间占满。

综合以上两种利弊,比较好的方式是:在出现丢失备份或archivelog的状况下,通知管理员处置,手工处理以后备份脚本运行恢复正常。即便真的有archivelog丢失,在管理员已知晓的状况下,能够规避对恢复窗口的影响。

相关文章
相关标签/搜索