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"