中小型数据库RMAN CATALOG备份恢复方案(二)
中小型数据库RMAN CATALOG备份恢复方案(二)
1、RMAN还原shell脚本
[python] --下面的shell脚本用于实现数据库的自动还原,还原成功后,数据库被关闭。因为我们在Prod数据库无异常的情形下,不需要bak 的备用库open --shell脚本做还原时调用了catalog中的全局脚本global_restore --在脚本最尾部,我们将DB还原是否成功的状态输出到日志文件db_restore_rman.log,这样做的好处是我们可以将多个DB的还原状态集中,便于查看 $ more db_restore_rman_catalog.sh ##==================================================================== ## File name: db_restore_rman_catalog.sh ## Usage: db_restore_rman_catalog.sh <$ORACLE_SID> ## Desc: ## The script uses to restore database with level 0 backupset. ##==================================================================== #!/bin/bash # -------------------- # Define variable # -------------------- if [ -f ~/.bash_profile ]; then . ~/.bash_profile fi # -------------------------- # Check SID # -------------------------- if [ -z "${1}" ];then echo "Usage: " echo " `basename $0` ORACLE_SID" exit 1 fi ORACLE_SID=${1}; export ORACLE_SID LOG_DIR=/u02/database/${ORACLE_SID}/backup; export RMAN_DIR TIMESTAMP=`date +%Y%m%d%H%M` export TIMESTAMP RMAN_LOG=${LOG_DIR}/${ORACLE_SID}_restore_${TIMESTAMP}.log; export RMAN_LOG SSH_LOG=${LOG_DIR}/${ORACLE_SID}_restore_full_${TIMESTAMP}.log; export SSH_LOG RETENTION=5 echo "----------------------------------------------------------------" >>${SSH_LOG} echo "Start rman to backup at `date`." >>${SSH_LOG} echo "----------------------------------------------------------------" >>${SSH_LOG} $ORACLE_HOME/bin/rman target / catalog rman_user/xxx@catadb log=${RMAN_LOG} <<EOF startup nomount; run{execute global script global_restore;} exit; EOF RV=$? cat ${RMAN_LOG}>>${SSH_LOG} echo "" >>${SSH_LOG} echo "----------------------------------------------------------------" >>${SSH_LOG} echo "MSG1: RMAN restore end at `date`." >>${SSH_LOG} echo "----------------------------------------------------------------" >>${SSH_LOG} if [ $RV -ne "0" ]; then echo "----------------------------------------------------------------" >>${SSH_LOG} echo "MSG2: RMAN restore error at `date`." >>${SSH_LOG} echo "----------------------------------------------------------------" >>${SSH_LOG} RMAN_STAT='FAILED' mail -s "Failed RMAN restore for $ORACLE_SID on `hostname`." dba@12306.com <${SSH_LOG} else echo "----------------------------------------------------------------" >>${SSH_LOG} echo "MSG2: No error found for RMAN restore at `date`." >>${SSH_LOG} echo "----------------------------------------------------------------" >>${SSH_LOG} RMAN_STAT='SUCCEED' rm -rf ${RMAN_LOG} 2>/dev/null fi echo "`date '+%F %X'` -- $0 $1 $RMAN_STAT ">> /u01/comm_scripts/db_restore_rman.log exit
2、检测还原状态shell脚本
[python] --我们用一个shell脚本来检测多个DB当天最终的还原状态成功与否,并将当前的所有记录输出到ck_restore.log日志 --脚本尾部发送邮件列出当天所有进行restore之后的所有状态,是一个多个DB restore 的summary report. $ more ck_restore.sh ##==================================================================== ## File name: ck_restore.sh ## Usage: ck_restore.sh ## Desc: ## The script uses to check RMAN restore log for current day ## and send mail to DBA ##==================================================================== #!/bin/bash if [ -f ~/.bash_profile ]; then . ~/.bash_profile fi REV_DIR=/u01/comm_scripts dt=`date '+%F'` cat /dev/null >${REV_DIR}/ck_restore.log cat ${REV_DIR}/db_restore_rman.log | grep "${dt}" >>${REV_DIR}/ck_restore.log total=`cat ${REV_DIR}/ck_restore.log |wc -l` suc=`grep SUCCEED ${REV_DIR}/ck_restore.log |wc -l` fail=`grep FAILED ${REV_DIR}/ck_restore.log |wc -l` echo "">>ck_restore.log echo -e "The total DB of current recovery is $total in `hostname` \n">>${REV_DIR}/ck_restore.log echo -e "The number of succee is : ${suc} \n">>${REV_DIR}/ck_restore.log echo -e "The number of fail is : ${fail} \n">>${REV_DIR}/ck_restore.log mail -s "RMAN restore summary for `hostname` at `date +'%a %b %d %Y'`" dba@12306.com <${REV_DIR}/ck_restore.log
3、部署还原shell脚本到crontab
[python] --首先将多个需要自动restore的DB封装到一个单独的文件,如下: --最后调用ck_restore.sh 脚步检测所有DB restore状态并发送RMAN summary report邮件 $ more full_resotre_by_rman.sh #!/bin/bash /u01/comm_scripts/db_restore_rman_catalog.sh BC1200 /u01/comm_scripts/db_restore_rman_catalog.sh AF2630 /u01/comm_scripts/ck_restore.sh --部署到crontab --注,无论是备份还是恢复脚本,我们都是通过Bak server的crontab来部署以减轻Prod的压力 #Rman restore database 0 3 * * 1-6 /u01/comm_scripts/full_resotre_by_rman.sh