代码改变世界

RMAN备份脚本一列分享

2014-05-26 23:26  潇湘隐者  阅读(4663)  评论(2编辑  收藏  举报

在ORACLE数据库中,RMAN备份的脚本非常多,下面介绍一例shell脚本如何通过RMAN备份,以及FTP上传RMAN备份文件以及归档日志文件的脚本。

fullback.sh 里面调用RMAN命令做数据库备份,它使用的cmdfile为/home/oracle/backup/bin/fullback.rcv,同时在/home/oracle/backup/logs目录下生成日志文件。

   1: [oracle@DB-Server bin]$ more fullback.sh
   2:  
   3: #!/bin/bash
   4:  
   5: export ORACLE_BASE=/u01/app/oracle
   6:  
   7: export ORACLE_SID=gps
   8:  
   9: ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1; export ORACLE_HOME
  10:  
  11: TMP=/tmp; export TMP
  12:  
  13: TMPDIR=$TMP; export TMPDIR
  14:  
  15: PATH=/usr/sbin:$PATH; export PATH
  16:  
  17: PATH=$ORACLE_HOME/bin:$PATH; export PATH
  18:  
  19: LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
  20:  
  21: CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
  22:  
  23: export CLASSPATH
  24:  
  25: TODAY=`date +%Y_%m_%d`
  26:  
  27: rman nocatalog target / cmdfile /home/oracle/backup/bin/fullback.rcv log /home/oracle/backup/logs/fullbackup_$TODAY.log
  28:  
  29: /home/oracle/backup/bin/ftpbackup.sh
  30:  

fullback.rcv文件非常简单, 如下所示:

   1: [oracle@DB-Server bin]$ more /home/oracle/backup/bin/fullback.rcv
   2:  
   3: run{
   4:  
   5: allocate channel c4 type disk;
   6:  
   7: backup as compressed backupset
   8:  
   9: skip inaccessible
  10:  
  11: tag fullbackupwitharchivelog
  12:  
  13: (database);
  14:  
  15: backup current controlfile;
  16:  
  17: backup spfile;
  18:  
  19: sql "alter system archive log current";
  20:  
  21: delete noprompt obsolete;
  22:  
  23: release channel c4;
  24:  
  25: }
  26:  

RMAN生成的备份文件,需要通过FTP上传到FTP服务器,一则数据库服务器没有这么多空间存储多天的备份,二则是出于容灾、数据安全需要。

下面脚本中FTP服务器,用户名密码均使用xxx替代,在实际环境中,使用具体的信息替代即可。

   1: [oracle@DB-Server bin]$ more ftpbackup.sh 
   2:  
   3: #!/bin/sh、
   4:  
   5: rm -f /home/oracle/.netrc
   6:  
   7: date_yesterday=`date -d'yesterday' +%Y_%m_%d`
   8:  
   9: date_today=`date +%Y_%m_%d`
  10:  
  11: echo "default login xxxx password xxxxxx" >> /home/oracle/.netrc
  12:  
  13: echo "macdef init" >> /home/oracle/.netrc
  14:  
  15: echo "binary" >> /home/oracle/.netrc
  16:  
  17: echo "cd archivelog" >> /home/oracle/.netrc
  18:  
  19: echo "mkdir $date_yesterday" >> /home/oracle/.netrc
  20:  
  21: echo "cd $date_yesterday" >> /home/oracle/.netrc
  22:  
  23: echo "lcd /u04/flash_recovery_area/gps/archivelog/$date_yesterday" >> /home/oracle/.netrc
  24:  
  25: echo "mput *" >> /home/oracle/.netrc
  26:  
  27: echo "cd .." >> /home/oracle/.netrc
  28:  
  29: echo "mkdir $date_today" >>/home/oracle/.netrc
  30:  
  31: echo "cd $date_today" >>/home/oracle/.netrc
  32:  
  33: echo "lcd /u04/flash_recovery_area/gps/archivelog/$date_today" >>/home/oracle/.netrc
  34:  
  35: echo "mput * ">>/home/oracle/.netrc
  36:  
  37: echo "cd .." >>/home/oracle/.netrc
  38:  
  39: echo "cd ../backupset" >> /home/oracle/.netrc
  40:  
  41: echo "mkdir $date_today" >> /home/oracle/.netrc
  42:  
  43: echo "cd $date_today" >> /home/oracle/.netrc
  44:  
  45: echo "lcd /u04/flash_recovery_area/gps/backupset/$date_today" >> /home/oracle/.netrc
  46:  
  47: echo "mput *" >> /home/oracle/.netrc
  48:  
  49: echo "cd .." >> /home/oracle/.netrc
  50:  
  51: echo "cd ../autobackup" >> /home/oracle/.netrc
  52:  
  53: echo "mkdir $date_today" >> /home/oracle/.netrc
  54:  
  55: echo "cd $date_today" >> /home/oracle/.netrc
  56:  
  57: echo "lcd /u04/flash_recovery_area/gps/autobackup/$date_today" >> /home/oracle/.netrc
  58:  
  59: echo "mput *" >> /home/oracle/.netrc
  60:  
  61: echo "quit" >> /home/oracle/.netrc
  62:  
  63: echo "" >> /home/oracle/.netrc
  64:  
  65: chmod 600 /home/oracle/.netrc
  66:  
  67: ftp -i -v xxx.xxx.xxx.xxx 8021 >>/home/oracle/backup/logs/ftp$date_today.log 2>&1
  68:  

另外,关于归档日志也需要每隔2小时上传一次到FTP服务器,2小时上传一次归档日志的shell脚本如下所示:

   1: [oracle@DB-Server bin]$ more ftp2hours.sh 
   2:  
   3: #!/bin/sh
   4:  
   5: rm -f /home/oracle/.netrc
   6:  
   7: date_yesterday=`date -d'yesterday' +%Y_%m_%d`
   8:  
   9: date_today=`date +%Y_%m_%d`
  10:  
  11: echo "default login xxxx password xxxx" >> /home/oracle/.netrc
  12:  
  13: echo "macdef init" >> /home/oracle/.netrc
  14:  
  15: echo "binary" >> /home/oracle/.netrc
  16:  
  17: echo "cd archivelog" >> /home/oracle/.netrc
  18:  
  19: echo "mkdir $date_today" >>/home/oracle/.netrc
  20:  
  21: echo "cd $date_today" >>/home/oracle/.netrc
  22:  
  23: echo "lcd /u04/flash_recovery_area/gps/archivelog/$date_today" >>/home/oracle/.netrc
  24:  
  25: echo "mput * ">>/home/oracle/.netrc
  26:  
  27: echo "quit" >> /home/oracle/.netrc
  28:  
  29: echo "" >> /home/oracle/.netrc
  30:  
  31: chmod 600 /home/oracle/.netrc
  32:  
  33: ftp -i -v xxx.xxx.xxx.xxx 8021 >>/home/oracle/backup/logs/ftp2hours.$date_today.log 2>&1
  34:  

最后需要将RMAN备份生成的日志文件,以及FTP上传备份文件以及归档日志的记录通过邮件形式发送给DBA或系统管理员,

   1: [oracle@DB-Server bin]$ more chkbackandmail.sh 
   2: #!/bin/bash
   3: rm -f /home/oracle/backup/bin/sendmail.pl
   4: date_today=`date +%Y_%m_%d`
   5: subject="Oracle Backup Alert Service on $date_today"
   6: content="Dear colleagues,
   7:  
   8:    Attached please find the logs of xxx(xxx.xxx.xxx.xxx) oracle database backup and transfer to FTP Server(xxx.xxx.xxx.xxx), please
   9:  review the file and check whether the backup succeeded or not,and double check all backups have been dumped to tape, many tha
  10: nks
  11:  
  12:  
  13:  
  14:  
  15: Best regards
  16: Oracle Alert Services
  17:  
  18: "
  19: file="/home/oracle/backup/logs/fullbackup_$date_today.log,/home/oracle/backup/logs/ftp$date_today.log"
  20: echo "#!/usr/bin/perl" >> /home/oracle/backup/bin/sendmail.pl
  21: echo "use Mail::Sender;" >> /home/oracle/backup/bin/sendmail.pl
  22: echo "\$sender = new Mail::Sender {smtp => 'xxx.xxx.xxx.xxx', from => 'xxxx@xxx.com'}; ">> /home/oracle/backup/bin/sendmai
  23: l.pl
  24: echo "\$sender->MailFile({to => 'xxx@esquel.com',">> /home/oracle/backup/bin/sendmail.pl
  25: echo "cc=>'xxx@xxx.com,xxx@xxx.com,xxx@xxx.com'," >> /home/oracle/backup/b
  26: in/sendmail.pl
  27: echo "subject => '$subject',">> /home/oracle/backup/bin/sendmail.pl
  28: echo "msg => '$content',">> /home/oracle/backup/bin/sendmail.pl
  29: echo "file => '$file'});">> /home/oracle/backup/bin/sendmail.pl
  30: perl /home/oracle/backup/bin/sendmail.pl

最后在Crontab 作业里面配置调用这些shell脚本。例如如下所示,在1:01分执行fullback.sh ,每隔两个小时(例如0:50、2:50...)执行一次ftp2hours.sh, 在每天早上8:40执行chkbackandmail.sh 发送fullback.sh 以及ftp2hour.sh的执行日志记录。

clip_image002