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