Linux 下RMAN备份shell脚本

RMAN备份对于Oracle数据库的备份与恢复简单易用,成本低廉。对于使用非catalog方式而言,将RMAN脚本嵌入到shell脚本,然后再通过crontab来实现中小型数据库数据库备份无疑是首选。本文提供了一个简单易用的基于linux shell下的RMAN备份脚本供参考。大家可根据自己的需要进行适当调整。

下面是脚本的具体内容

  1. ##===========================================================   
  2. ##   db_bak_rman.sh                 
##   created by Robinson            ##   2011/11/07     ##   usage: db_bak_rman.sh <$ORACLE_SID> <$BACKUP_LEVEL>   ##          BACKUP_LEVEL:    ##             F: full backup   ##             0: level 0   ##             1: level 1                              ##============================================================   #!/bin/bash   # User specific environment and startup programs     if [ -f ~/.bash_profile ];   then  . ~/.bash_profile  fi    ORACLE_SID=${1};                              export ORACLE_SID      RMAN_LEVEL=${2};                              export RMAN_LEVEL  TIMESTAMP=`date +%Y%m%d%H%M`;                 export TIMESTAMP       DATE=`date +%Y%m%d`;                          export DATE            RMAN_DIR=/u02/database/${ORACLE_SID}/backup/rman;   export RMAN_DIR        RMAN_DATA=${RMAN_DIR}/${DATE};                export RMAN_DATA       #RMAN_LOG=$RMAN_DATA/log;                     export RMAN_LOG        RMAN_LOG=/u02/database/${ORACLE_SID}/backup/rman/log  export RMAN_LOG     # Check rman level    #======================================================================   if [ "$RMAN_LEVEL" == "F" ];  then  unset INCR_LVL        BACKUP_TYPE=full  else        INCR_LVL="INCREMENTAL LEVEL ${RMAN_LEVEL}"        BACKUP_TYPE=lev${RMAN_LEVEL}   fi    RMAN_FILE=${RMAN_DATA}/${ORACLE_SID}_${BACKUP_TYPE}_${TIMESTAMP};       export RMAN_FILE  SSH_LOG=${RMAN_LOG}/${ORACLE_SID}_${BACKUP_TYPE}_${TIMESTAMP}.log;      export SSH_LOG  MAXPIECESIZE=4G;                                                export MAXPIECESIZE    #Check RMAN Backup Path   #=========================================================================     if ! test -d ${RMAN_DATA}  then  mkdir -p ${RMAN_DATA}  fi    echo "---------------------------------" >>${SSH_LOG}  echo "   " >>${SSH_LOG}  echo "Rman Begin  to Working ........." >>${SSH_LOG}  echo "Begin time at:" `date` --`date +%Y%m%d%H%M` >>${SSH_LOG}    #Startup rman to backup    #=============================================================================   $ORACLE_HOME/bin/rman log=${RMAN_FILE}.log <<EOF  connect target /  run {  CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS;  CONFIGURE BACKUP OPTIMIZATION ON;  CONFIGURE CONTROLFILE AUTOBACKUP ON;  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${RMAN_FILE}_%F';  ALLOCATE CHANNEL 'ch1' TYPE DISK maxpiecesize=${MAXPIECESIZE};  ALLOCATE CHANNEL 'ch2' TYPE DISK maxpiecesize=${MAXPIECESIZE};  set limit channel ch1 readrate=10240;  set limit channel ch1 kbytes=4096000;  set limit channel ch2 readrate=10240;  set limit channel ch2 kbytes=4096000;  CROSSCHECK ARCHIVELOG ALL;  DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;  BACKUP   #AS COMPRESSED BACKUPSET    ${INCR_LVL}  DATABASE FORMAT '${RMAN_FILE}_%U' TAG '${ORACLE_SID}_${BACKUP_TYPE}_${TIMESTAMP}';  SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';  BACKUP ARCHIVELOG ALL FORMAT '${RMAN_FILE}_arc_%U' TAG '${ORACLE_SID}_arc_${TIMESTAMP}'  DELETE  INPUT;  DELETE NOPROMPT OBSOLETE;  RELEASE CHANNEL ch1;  RELEASE CHANNEL ch2;  }  sql "alter database backup controlfile to ''${RMAN_DATA}/cntl_${BACKUP_TYPE}.bak''";  exit;  EOF  RC=$?    cat ${RMAN_FILE}.log >>${SSH_LOG}  echo "Rman Stop working @ time:"`date` `date +%Y%m%d%H%M` >>${SSH_LOG}    echo >>${SSH_LOG}  echo "------------------------" >>${SSH_LOG}  echo "------ Disk Space ------" >>${SSH_LOG}  df -h >>${SSH_LOG}    echo >>${SSH_LOG}    if [ $RC -ne "0" ]; then      echo "------ error ------" >>${SSH_LOG}  else      echo "------ no error found during RMAN backup peroid------" >>${SSH_LOG}      rm -rf ${RMAN_FILE}.log  fi    #Remove old backup than 3 days   #============================================================================   RMDIR=${RMAN_DIR}/`/bin/date +%Y%m%d -d "3 days ago"`;   export RMDIR  echo >>${SSH_LOG}  echo -e "------Remove old backup than 3 days ------\n" >>${SSH_LOG}    if test -d ${RMDIR}      then      rm -rf ${RMDIR}      RC=$?  fi    echo >>${SSH_LOG}    if [ $RC -ne "0" ]; then      echo -e "------ Remove old backup exception------ \n" >>${SSH_LOG}  else      echo -e "------ no error found during remove old backup set peroid------ \n" >>${SSH_LOG}  fi    exit    oracle@SZDB:~/robinson/scripts/dba_scripts/custom/sql> ./db_bak_rman.sh GOBO1 0  RMAN> RMAN> 23456789101112131415>   161718192021222324> RMAN> RMAN>   oracle@SZDB:~/robinson/scripts/dba_scripts/custom/sql>    oracle@SZDB:/u02/database/GOBO1/backup/rman> ls  20120928  log  oracle@SZDB:/u02/database/GOBO1/backup/rman/20120928> ls  cntl_lev0.bak                             GOBO1_lev0_201209281421_arc_4onmb9ro_1_1  GOBO1_lev0_201209281421_4knmb9jn_1_1      GOBO1_lev0_201209281421_c-733951103-20120928-00  GOBO1_lev0_201209281421_4lnmb9jn_1_1      GOBO1_lev0_201209281421_c-733951103-20120928-01  GOBO1_lev0_201209281421_arc_4nnmb9rn_1_1  

相关推荐