当前位置:操作系统 > Unix/Linux >>

中小型数据库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    

 


CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,