rman备份script

1、shell编写的备份脚本,可以无脑备份

包含6个文件(例如fyl为我的ORACLE_SID)

1)、fyl.env

#!/bin/bash
#
#备份FYL数据库环境变量文件
#

export ORACLE_SID=FYL
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

2)、Backup.sh

#!/usr/bin/ksh
#
#fyl数据库备份脚本
#

ENVFILE=./fyl.env

#执行环境变量
if [ ! -f ${ENVFILE} ]; then
   printf "环境变量[${ENVFILE}]不存在[`date '+%Y/%m/%d %H:%M:%S'`] ... [失败] \n" 
   exit
else
 . ${ENVFILE}
fi

#变量赋值
DATE=`date '+%Y%m%d'`
TIME=`date '+%H%M%S'`
DBSID=${ORACLE_SID}
BACKDIR=/oracle/rman_${ORACLE_SID}

#选择备份类型(0级、1级、2级),变量BACKTYPE
clear
printf "开始备份[${DBSID}]数据库... \n请选择备份级别[0:0级备份 1:1级备份 2:2级备份 3:ARC备份]:\n"
while read BACKTYPE
do
     case ${BACKTYPE} in 
         'Q'|'exit'|'q')
            printf "退出备份程序,备份[${DBSID}]数据库结束[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
            exit
            ;;
           '0')
           BACKSH=./Rman_${DBSID}_0.sh
           BACKTYPE="0"
           break
           ;;
           '1')
            BACKSH=./Rman_${DBSID}_1c.sh
           BACKTYPE="1c"
           break
           ;;
           '2')
            BACKSH=./Rman_${DBSID}_2c.sh
           BACKTYPE="2c"
           break
           ;;
           '3')
            BACKSH=./Rman_${DBSID}_arc.sh
           BACKTYPE="ARC"
           break
           ;;
           *)
           printf "输入错误请重新输入,请选择备份级别[0:0级备份 1:1级备份 2:2级备份 3:ARC级备份]:\n"
           ;;
     esac
done
printf "(#提示:你输入的备份级别是[${BACKTYPE}]级备份)\n"

#选择备份目录,变量BACKDIR
printf "请输入备份目录,默认[${BACKDIR}]:\n"
while read TMP
do 
     case ${TMP} in 
        'Q'|'exit'|'q')
            printf "退出备份程序,备份[${DBSID}]数据库结束[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
            exit
            ;;
        *)
         if [ "`echo ^${TMP}`" = "^" ]; then
            TMP=/oracle/rman_${ORACLE_SID}
         fi
         if [ ! -d ${TMP} ]; then 
            printf "备份目录[${TMP}]不存在... \n"
            printf "请输入备份目录,默认[${BACKDIR}]:\n"
         else
           BACKDIR=${TMP}
           break
          fi
          ;;
     esac
done
unset TMP
printf "(#提示:你输入备份目录是[${BACKDIR}].)\n"

#选择备份业务日期,变量BACKDATE
printf "请输入业务日期,默认[${DATE}]:\n"
while read BACKDATE
do 
     case ${BACKDATE} in 
        'Q'|'exit'|'q')
            printf "退出备份程序,备份[${DBSID}]数据库结束[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
            exit
            ;;
        *)
         if [ "`echo ^${BACKDATE}`" = "^" ]; then
           BACKDATE=${DATE}
          fi
          break
          ;;
     esac
done
printf "(#提示:你输入业务日期是[${BACKDATE}].)\n"
     
#选择备份状态(日终前或日终后),变量EODSTATE
#printf "请输入备份状态,[1:(B) 2:(A)]:\n"
#while read BACKSTATE
#do 
#     case ${BACKSTATE} in 
#        'Q'|'exit'|'q')
#            printf "退出备份程序,备份[${DBSID}]数据库结束[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
#            exit
#            ;;
#         '1'|'B'|'b')
#            BACKSTATE=B
#           break
#           ;;
#          '2'|'a'|'A')
#           BACKSTATE=A
#           break
#           ;;
#           'none'|'None'|'NONE')
#           BACKSTATE=""
#           break
#           ;;
#           *)
#           printf "输入错误请重新输入,[1:(B) 2:(A)]:\n"
#           ;;
#       esac
#done
#printf "(#提示:你输入的状态时[${EODSTATE}].)\n"

#处理备份目录重复问题(当天备份多次)
if [ -d ${BACKDIR}/${BACKDATE}_${BACKTYPE} ]; then
   printf "备份目录[ ${BACKDIR}/${BACKDATE}_${BACKTYPE} ] 已经存在,是否覆盖原目录?[Y or N]:\n" 
   while read TMP   
   do 
       case ${TMP} in
         'Q'|'exit'|'q')
            printf "退出备份程序,备份[${DBSID}]数据库结束,有相同备份目录,请先处理[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
            exit
            ;;
          'Y'|'y'|'YES')
           mv ${BACKDIR}/${BACKDATE}_${BACKTYPE}  ${BACKDIR}/${BACKDATE}_${BACKTYPE}_"`date '+%H%M'`"
           if [ $? = 0 ]; then
              printf "已经把目录[${BACKDIR}/${BACKDATE}_${BACKTYPE}]重命名[${BACKDIR}/${BACKDATE}_${BACKTYPE}_"`date '+%H%M'`"]"
           else
              printf "重命名[${BACKDIR}/${BACKDATE}_${BACKTYPE}]失败,退出备份...\n"
              exit
           fi
           break
           ;;
           *)
           printf "输入错误请重新输入,[Y or N]:\n"
           ;;
      esac
   done
fi
unset TMP
mkdir ${BACKDIR}/${BACKDATE}_${BACKTYPE}

#开始执行相应级别备份脚本
printf "\n开始[${DBSID}]数据库[${BACKTYPE}]级备份[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
sh ${BACKSH} ${BACKDIR}/${BACKDATE}_${BACKTYPE} ${BACKDATE} ${DBSID}

printf "备份完成,备份目录[${BACKDIR}/${BACKDATE}_${BACKTYPE}] ...大小为[`du -k ${BACKDIR}/${BACKDATE}_${BACKTYPE} | awk '{printf $1}'` Kbytes]\n"   
3)、Rman_fyl_0.sh

#判断是否正确从BackupFYL.sh传递过来的变量
if [ $# != 3 ]; then
   print "参数(备份目录、业务日期、数据库SID)没有传递过来"
   exit
else
  echo "RMAN备份目录是[ $1 ],业务日期是[ $2 ],数据库SID是[ $3 ]"
fi

FULLBACKDIR=$1
YEAR=` expr substr $2 1 4 `
YEAR_MONTH=` expr substr $2 1 6 `
MONTH=` expr substr $2 5 2 `
DAY=` expr substr $2 7 2 `
BACKDATE=$2
DBSID=$3
LOGDIR=${HOME}/logs/${DBSID}_RMAN_LOG/${YEAR}/${YEAR_MONTH}


# 创建RMAN日志目录
if [ ! -d ${LOGDIR} ]; then
   mkdir -p ${LOGDIR}
fi

#执行0级备份
rman target / log=${LOGDIR}/Rman_${DBSID}_${BACKDATE}_0.log << EOF
run{
       backup incremental level 0 database
       format '${FULLBACKDIR}/${DBSID}_%p_%s_%u.dbf';
       sql 'alter system archive log current';
       backup archivelog all skip inaccessible delete all input
       format '${FULLBACKDIR}/${DBSID}_%p_%s_%u.arc';
       backup current controlfile
       format '${FULLBACKDIR}/${DBSID}_%p_%s.ctl';
      }
delete noprompt archivelog all backed up 1 times to device type disk ;
exit;
EOF

printf "\n完成[${DBSID}]数据库0级备份[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
printf "请检查日志[${LOGDIR}/Rman_${DBSID}_${BACKDATE}_0.log],确认是否备份成功...\n"   

4)、Rman_fyl_1c.sh

只需修改0级备份脚本,level 0=level 1 及提示:

printf "\n完成[${DBSID}]数据库1级备份[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"

5)、Rman_fyl_2c.sh

只需修改0级备份脚本,level 0=level 2 及提示:

printf "\n完成[${DBSID}]数据库2级备份[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"

6)、Rman_fyl_arc.sh

备份部分

#执行arc备份
rman target / log=${LOGDIR}/Rman_${DBSID}_${BACKDATE}_arc.log << EOF
run{
       sql 'alter system archive log current';
       backup archivelog all skip inaccessible delete all input
       format '${FULLBACKDIR}/${DBSID}_%p_%s_%u.arc';
       backup current controlfile
       format '${FULLBACKDIR}/${DBSID}_%p_%s.ctl';
      }
delete noprompt archivelog all backed up 1 times to device type disk ;
exit;
EOF

printf "\n完成[{DBSID}]数据库归档备份[`date '+%Y/%m/%d %H:%M:%S'`] ...  \n"
printf "请检查日志[${LOGDIR}/Rman_${DBSID}_${BACKDATE}_arc.log],确认是否备份成功...\n"      


你可能感兴趣的:(rman备份script)