中小型数据库 RMAN CATALOG 备份恢复方案(二)

      中小型数据库呈现的是数据库并发少,数据库容量小,版本功能受限以及N多单实例等特点。尽管如此,数据库的损失程度也会存在零丢失的情形。企业不愿意花太多的钱又要保证数据库的可靠稳定,可是苦煞了我这些搞DB的。接上一篇文章,中小型数据库 RMAN CATALOG 备份恢复方案(一),我们继续来给出基于中小型数据库的恢复的脚本与其部署。

1、RMAN还原shell脚本

--下面的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.
##   Author: Robinson
##   Blog  : http://blog.csdn.net/robinson_0612
##====================================================================

#!/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脚本

--我们用一个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
##   Author: Robinson
##   Blog  : http://blog.csdn.net/robinson_0612
##====================================================================
#!/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

--首先将多个需要自动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  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android机动车

Android实现异步的几种方式——从简单的图片加载说起

说到异步,脑海中立马浮现的就是多线程开发,Thread、Handler啥的一一涌上心头…

17950
来自专栏王硕

原 PostgreSQL下如何修改用户权限的介绍以及hook机制对超级用户的权限修改

1.5K100
来自专栏逸鹏说道

几个比较有意思的JS脚本

1.获取内网和公网真实IP地址(引用地址) 代码太长,见原文链接 2.获得flash版本(在线地址) ? <!DOCTYPE html> <html> <hea...

30870
来自专栏比原链

Derek解读Bytom源码-P2P网络 地址簿

Gitee地址:https://gitee.com/BytomBlockchain/bytom

9410
来自专栏农夫安全

Bwapp漏洞平台答案全解-A2(第一篇)

0x01 A2 - Broken Auth & Session Mgmt *************失效的身份认证和会话管理************* 2.1...

837120
来自专栏码匠的流水账

聊聊hikari连接池的maxLifetime属性及evict操作

用来标记连接池中的连接不可用,这样在borrow连接的时候,如果是标记evict的,则会继续获取连接

33420
来自专栏乐沙弥的世界

Linux script 命令记录(数据库)操作步骤

    对DBA而言,经常碰到升级数据库或是apply patch,以及有些时候需要运行大量的脚本。对于这些操作我们希望现在在屏幕同时又输出的文件以备后续查询过...

16540
来自专栏JetpropelledSnake

SNMP学习笔记之SNMP报文以及不同版本(SNMPv1、v2c、v3)的区别

本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1、v2c、v3)进行区别!

45110
来自专栏Android源码框架分析

Android Handler与Looper原理浅析

本文分析下Android的消息处理机制,主要是针对Handler、Looper、MessageQueue组成的异步消息处理模型,先主观想一下这个模型需要的材料:

24040
来自专栏张善友的专栏

HTTP Basic Authentication验证WCF Data Service

WCF Data Service是OData协议,也是RESTFul Service的一种,上篇文章已经介绍了HTTP Basic Authentication...

21780

扫码关注云+社区

领取腾讯云代金券