该脚本用于RMAN Catalog 增量备份以及自动传输备份文件到专用归档备份服务器,并且可配置发送邮件报告相关的信息是否成功
使用说明:Shell脚本部署在源端数据库服务器,希望能帮助到需要的朋友…谢谢
##================================================================================================================================
## File name: db_bak_rman_catalog.sh
## Usage: db_bak_rman_catalog.sh <$ORACLE_SID> <$Resource_User_String> <$Catalog_User_String>
## Example: sh db_bak_rman_catalog.sh orcl sys/yunq111@orcl vpc_orcl/vpc_orcl@catadb
##
## Desc:
## 1、The scripts used to backup database with level 0、1、2,But Then Scripts used that
## User modify RMAN backup script name or backup level
##
## 2、Conform Server has installed rsync command And Configure Two Server SSH Free password
## ,So that rsync won't need enter password
##
## 3、User need mkdir ftp backup path to backup in Target(Catalog) Server,But In order to
## manage,User can mkdir the same dir name with The Resource Server backup path
##
## 4、Configure resource DB server if need send email,if it is,then you need yum install mailx and configure /etc/mail.rc
##
## Backup Path: mkdir -p ${ORACLE_BASE}/backup/log/${ORACLE_SID}
## mkdir -p ${ORACLE_BASE}/backup/fulldb/${ORACLE_SID}
## mkdir -p ${ORACLE_BASE}/backup/leveldb_1/${ORACLE_SID}
## mkdir -p ${ORACLE_BASE}/backup/leveldb_2/${ORACLE_SID}
## mkdir -p ${ORACLE_BASE}/backup/archivelog/${ORACLE_SID}
## mkdir -p ${ORACLE_BASE}/backup/controlfile/${ORACLE_SID} #该选项针对于RMAN控制文件自动备份开启得备份位置
## Author: Marvin
## Blog: http://www.cndba.cn/Marvinn
##
##================================================================================================================================
#! /bin/bash
# User specific orale environment and startup programs
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
#-------------------------------
#
# Check And Set Oracle Env
#
#-------------------------------
if [ -d $ORACLE_BASE ]; then
export ORACLE_BASE=$ORACLE_BASE
else
echo "User Specific Oracle Environment Not Found ORACLE_BASE"
fi
if [ -d $ORACLE_HOME ]; then
export ORACLE_HOME=$ORACLE_HOME
else
echo "User Specific Oracle Environment Not Found ORACLE_HOME"
fi
if [ "$#" -eq "3" ];then
ORACLE_SID=${1}; export ORACLE_SID
Resource_User_String=${2}; export Resource_User_String
Catalog_User_String=${3}; export Catalog_User_String
else
echo "Usage: "
echo " `basename $0` ORACLE_SID $1 Resource_User_String $2 Catalog_User_String $3"
echo "You provided $# parameters,but 3 are required."
fi
#-------------------------------
#
# Set Other Environment Here
#
#-------------------------------
mkdir -p ${ORACLE_BASE}/backup/log/${ORACLE_SID} # Set Backuplog Path
TIMESTAMP=`date +%Y%m%d%H%M` export TIMESTAMP
LOG_DIR=${ORACLE_BASE}/backup/log/${ORACLE_SID} export LOG_DIR
SSH_LOG=${LOG_DIR}/${ORACLE_SID}_alllog_infos_${TIMESTAMP}.log
RETENTION=7
MAIL_FM=1051866518@qq.com
echo "---------------------------------------------------------" >>${SSH_LOG}
echo "Step 1. Confirm RMAN Backup Level N at `date`." >>${SSH_LOG}
echo "---------------------------------------------------------" >>${SSH_LOG}
WEEK_DAILY=`date +%a`
case "${WEEK_DAILY}" in
"Mon")
BAK_LEVEL=2
;;
"Tue")
BAK_LEVEL=2
;;
"Wed")
BAK_LEVEL=2
;;
"Thu")
BAK_LEVEL=1
;;
"Fri")
BAK_LEVEL=2
;;
"Sat")
BAK_LEVEL=2
;;
"Sun")
BAK_LEVEL=0
;;
"*")
BAK_LEVEL=error
esac
export BAK_LEVEL=${BAK_LEVEL}
echo "Today is: ${WEEK_DAILY} Incremental Level= ${BAK_LEVEL}." >>${SSH_LOG}
RMAN_LOG=${LOG_DIR}/${ORACLE_SID}_backup_level${BAK_LEVEL}_${TIMESTAMP}.log
echo "---------------------------------------------------------" >>${SSH_LOG}
echo "Step 2. Start rman to backup at `date`." >>${SSH_LOG}
echo "---------------------------------------------------------" >>${SSH_LOG}
if [ $BAK_LEVEL = "0" ]; then
rman target ${Resource_User_String} catalog ${Catalog_User_String} log=${RMAN_LOG} <<EOF
resync catalog;
run {execute script local_fulldb_orcl;}
exit;
EOF
RV=$?
elif [ $BAK_LEVEL = "1" ]; then
rman target ${Resource_User_String} catalog ${Catalog_User_String} log=${RMAN_LOG} <<EOF
resync catalog;
run {execute script local_level1_orcl;}
exit;
EOF
RV=$?
else
rman target ${Resource_User_String} catalog ${Catalog_User_String} log=${RMAN_LOG} <<EOF
resync catalog;
run {execute script local_level2_orcl;}
exit;
EOF
RV=$?
fi
cat ${RMAN_LOG}>>${SSH_LOG}
echo "" >>${SSH_LOG}
echo "=====>>>Msg1: RMAN backup end as `date`." >>${SSH_LOG}
if [ $RV -ne "0" ]; then
echo "" >>${SSH_LOG}
echo "=====>>>Msg2: RMAN backup error at `date`." >>${SSH_LOG}
# Set Mail And Send To Tell You
MAIL_TEXT="Failed RMAN backup for $ORACLE_SID on `hostname` at `date`."
echo ${MAIL_TEXT} | mail -s "$ORACLE_SID RMAN backup " -a ${RMAN_LOG} -a ${SSH_LOG} ${MAIL_FM}
exit
else
echo "" >>${SSH_LOG}
echo "=====>>>Msg2: No errors Founds during RMAN backup peroid at `date`." >>${SSH_LOG}
# Here Can Set If The RMAN Backup LOG Can Delete
# rm -rf ${RMAN_LOG} 2>/dev/null
# Successful completed finally Send mail
fi
echo "---------------------------------------------------------" >>${SSH_LOG}
echo "Step 3: Start ftp backupset to backup server at `date`." >>${SSH_LOG}
echo "---------------------------------------------------------" >>${SSH_LOG}
#===========================================================================================================================
#Usage:
# RESOURCE_fulldb_BAK_DIR=B
# B: Resource Database RMAN fullldb backup scripts backup format path
# RESOURCE_LEVEL1_BAK_DIR=C
# C: Resource Database RMAN INC backup Level 1 script backup format path
# RESOURCE_LEVEL2_BAK_DIR=D
# D: Resource Database RMAN INC backup Level 2 script backup format path
# RESOURCE_ARCH_BAK_DIR=F
# F: Resource Database RMAN Archivelog backup script backup format path
#
# TARGET_RYSNC_HOST_IP=H
# H: Remote RSYNC backup Server host IP
# TARGET_fulldb_BAK_DIR=B
# B: According to resource ORACLE_SID,Oracle user Manual mkdir remote Server RMAN fullldb backup Storage path
# TARGET_LEVEL1_BAK_DIR=C
# C: According to resource ORACLE_SID,Oracle user Manual mkdir remote Server RMAN INC backup Level 1 Storage path
# TARGET_LEVEL2_BAK_DIR=D
# D: According to resource ORACLE_SID,Oracle user Manual mkdir remote Server RMAN INC backup Level 2 Storage path
# TARGET_ARCH_BAK_DIR=F
# F: According to resource ORACLE_SID,Oracle user Manual mkdir remote Server RMAN Archivelog backup Storage path
#============================================================================================================================
RESOURCE_fulldb_BAK_DIR=${ORACLE_BASE}/backup/fulldb/${ORACLE_SID}
RESOURCE_LEVEL1_BAK_DIR=${ORACLE_BASE}/backup/leveldb_1/${ORACLE_SID}
RESOURCE_LEVEL2_BAK_DIR=${ORACLE_BASE}/backup/leveldb_2/${ORACLE_SID}
RESOURCE_ARCH_BAK_DIR=${ORACLE_BASE}/backup/archivelog/${ORACLE_SID}
TARGET_RYSNC_HOST_IP=172.16.10.110 #Remote RSYNC backup Server host IP
TARGET_fulldb_BAK_DIR=/u01/backup/fulldb/
TARGET_ARCH_BAK_DIR=/u01/backup/archivelog/
TARGET_LEVEL1_BAK_DIR=/u01/backup/leveldb_1/
TARGET_LEVEL2_BAK_DIR=/u01/backup/leveldb_2/
#------------------------------------------------------------------------------------------------
#Rsync Usage:
# Target Backup server need mkdir the same with oracle user,just like install oracle,Then
# Configure Resource Server and Target Backup server Mutual SSH trust,confirm two servers
# can free password access
#-----------------------------------------------------------------------------------------------
RSYN_LOG=${LOG_DIR}/rsync_${TIMESTAMP}.log
# Rsync is used to ftp backup set to bak server.
if [ $BAK_LEVEL = "0" ]; then
rsync -avzSH --progress --rsh=ssh ${RESOURCE_fulldb_BAK_DIR} oracle@${TARGET_RYSNC_HOST_IP}:${TARGET_fulldb_BAK_DIR} > ${RSYN_LOG} 2>&1
RV=$?
rsync -avzSH --progress --rsh=ssh ${RESOURCE_ARCH_BAK_DIR} oracle@${TARGET_RYSNC_HOST_IP}:${TARGET_ARCH_BAK_DIR} > ${RSYN_LOG} 2>&1
RV1=$?
elif [ $BAK_LEVEL = "1" ]; then
rsync -avzSH --progress --rsh=ssh ${RESOURCE_LEVEL1_BAK_DIR} oracle@${TARGET_RYSNC_HOST_IP}:${TARGET_LEVEL1_BAK_DIR} > ${RSYN_LOG} 2>&1
RV=$?
else
rsync -avzSH --progress --rsh=ssh ${RESOURCE_LEVEL2_BAK_DIR} oracle@${TARGET_RYSNC_HOST_IP}:${TARGET_LEVEL2_BAK_DIR} > ${RSYN_LOG} 2>&1
RV=$?
fi
cat ${RSYN_LOG}>>${SSH_LOG}
if [ $BAK_LEVEL = "0" ]; then
if [ $RV -ne "0" -a $RV1 -ne "0" ]; then
echo "" >>${SSH_LOG}
echo "=====>Msg3: FTP fulldb and Archivelog backupset error at `date`." >>${SSH_LOG}
# Set Mail And Send To Tell You
MAIL_TEXT="Failed fulldb and Archivelog ftp to backup Server for $ORACLE_SID on `hostname` at `date`."
echo ${MAIL_TEXT} | mail -s "$ORACLE_SID RMAN backup Ftp " -a ${RMAN_LOG} -a ${RSYN_LOG} -a ${SSH_LOG} ${MAIL_FM}
exit
elif [ $RV -eg "0" -a $RV1 -ne "0" ]; then
echo "" >>${SSH_LOG}
echo "=====>Msg3: FTP fulldb backupset No errors at `date`." >>${SSH_LOG}
echo "=====>Msg3: FTP Archivelog backupset error at `date`." >>${SSH_LOG}
# Set Mail And Send To Tell You
MAIL_TEXT1="Sucessful completed fullldb backup FTP to backup Server for $ORACLE_SID on `hostname` at `date`."
MAIL_TEXT2="Failed Archivelog ftp to backup Server for $ORACLE_SID on `hostname` at `date`."
echo -e "`cat ${MAIL_TEXT1}`/n`${MAIL_TEXT2}`"| mail -s "$ORACLE_SID RMAN backup Ftp " -a ${RMAN_LOG} -a ${RSYN_LOG} -a ${SSH_LOG} ${MAIL_FM}
exit
elif [ $RV -ne "0" -a $RV1 -eg "0" ]; then
echo "" >>${SSH_LOG}
echo "=====>Msg3: FTP Archivelog backupset No errors at `date`." >>${SSH_LOG}
echo "=====>Msg3: FTP fulldb backupset error at `date`." >>${SSH_LOG}
# Set Mail And Send To Tell You
MAIL_TEXT1="Sucessful completed Archivelog FTP to backup Server for $ORACLE_SID on `hostname` at `date`."
MAIL_TEXT2="Failed fulldb bakcup ftp to backup Server for $ORACLE_SID on `hostname` at `date`."
echo -e "`cat ${MAIL_TEXT1}`/n`${MAIL_TEXT2}`"| mail -s "$ORACLE_SID RMAN backup Ftp " -a ${RMAN_LOG} -a ${RSYN_LOG} -a ${SSH_LOG} ${MAIL_FM}
exit
else
echo "" >>${SSH_LOG}
echo -e "=====>Msg3: No error found during FTP fulldb and Archivelog backupse peroid." >>${SSH_LOG}
# Successful completed finally Send mail
fi
elif [ $BAK_LEVEL = "1" ]; then
if [ $RV -ne "0" ]; then
echo "" >>${SSH_LOG}
echo "=====>Msg3: FTP DB $ORACLE_SID INC Level 1 backupset error at `date`." >>${SSH_LOG}
# Set Mail And Send To Tell You
MAIL_TEXT="FTP DB $ORACLE_SID INC Level 1 backupset error on `hostname` at `date`"
echo ${MAIL_TEXT} | mail -s "$ORACLE_SID RMAN backup Level 1 Ftp " -a ${RMAN_LOG} -a ${RSYN_LOG} -a ${SSH_LOG} ${MAIL_FM}
exit
else
echo "" >>${SSH_LOG}
echo -e "=====>Msg3: No error found during DB $ORACLE_SID Ftp INC Backup Level 1 backupse peroid." >>${SSH_LOG}
# Successful completed finally Send mail
fi
else
if [ $RV -ne "0" ]; then
echo "" >>${SSH_LOG}
echo "=====>Msg3: FTP DB $ORACLE_SID INC Level 2 backupset error at `date`." >>${SSH_LOG}
# Set Mail And Send To Tell You
MAIL_TEXT="FTP DB $ORACLE_SID INC Level 2 backupset error on `hostname` at `date`"
echo ${MAIL_TEXT} | mail -s "$ORACLE_SID RMAN backup Level 2 Ftp " -a ${RMAN_LOG} -a ${RSYN_LOG} -a ${SSH_LOG} ${MAIL_FM}
exit
else
echo "" >>${SSH_LOG}
echo -e "=====>Msg3: No error found during DB $ORACLE_SID Ftp INC Backup Level 2 backupse peroid." >>${SSH_LOG}
# Successful completed finally Send mail
fi
fi
echo "---------------------------------------------------------" >>${SSH_LOG}
echo "Step 4: RMAN backup and ftp backupset finished at `date`." >>${SSH_LOG}
echo "---------------------------------------------------------" >>${SSH_LOG}
MAIL_SUB="No errors during DB $ORACLE_SID RMAN backup and ftp backupset Successful finished at `hostname` `date`."
echo ${MAIL_SUB} | mail -s "$ORACLE_SID RMAN backup and Ftp backupset" -a ${RMAN_LOG} -a ${RSYN_LOG} -a ${SSH_LOG} ${MAIL_FM}
# -----------------------------------------------------
# Removing files older than $RETENTION parameter
# -----------------------------------------------------
find ${LOG_DIR} -name "*.*" -mtime +$RETENTION -exec rm {} /;
exit
版权声明:本文为博主原创文章,未经博主允许不得转载。



