当前位置: 代码迷 >> 综合 >> 中小型数据库 RMAN CATALOG 备份恢复方案(二)
  详细解决方案

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

热度:35   发布时间:2023-12-14 23:48:37.0

      中小型数据库呈现的是数据库并发少,数据库容量小,版本功能受限以及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  


 

相关参考
    中小型数据库 RMAN CATALOG 备份恢复方案(一)

    RMAN 数据库克隆文件位置转换方法

    基于RMAN的异机数据库克隆(rman duplicate)

    基于 RMAN 的同机数据库克隆

    基于用户管理的同机数据库克隆

    基于RMAN从活动数据库异机克隆(rman duplicate from active DB)

    RMAN duplicate from active 时遭遇 ORA-17627 ORA-12154

    Oracle 冷备份

    Oracle 热备份

    Oracle 备份恢复概念

    Oracle 实例恢复

    Oracle 基于用户管理恢复的处理

    SYSTEM 表空间管理及备份恢复

    SYSAUX表空间管理及恢复

    Oracle 基于备份控制文件的恢复(unsing backup controlfile)

    RMAN 概述及其体系结构

    RMAN 配置、监控与管理

    RMAN 备份详解

    RMAN 还原与恢复

    RMAN catalog 的创建和使用

    基于catalog 创建RMAN存储脚本

    基于catalog 的RMAN 备份与恢复

    RMAN 备份路径困惑

    自定义 RMAN 显示的日期时间格式

    只读表空间的备份与恢复

    Oracle 基于用户管理的不完全恢复

    理解 using backup controlfile

    使用RMAN实现异机备份恢复(WIN平台)

    使用RMAN迁移文件系统数据库到ASM

    基于Linux下 Oracle 备份策略(RMAN)

    Linux 下RMAN备份shell脚本

    使用RMAN迁移数据库到异机

    RMAN 提示符下执行SQL语句

    Oracle 基于 RMAN 的不完全恢复(incomplete recovery by RMAN)

    rman 还原归档日志(restore archivelog)

  相关解决方案