oracle rman nocatalog全备及增备脚本

来源:这里教程网 时间:2026-03-03 15:48:54 作者:

nocatalog 模式下的全备及增备 参数配置 设置备份信息保存时间,到规定时间就自动清除一千的备份信息。 SQL> show parameter control SQL> alter system set control_file_record_keep_time=31 scope=both; SQL> select name,value,issys_modifiable from v$parameter where name='control_file_record_keep_time'; NAME                           VALUE      ISSYS_MOD ------------------------------ ---------- --------- control_file_record_keep_time  14         IMMEDIATE 设置rman备份保存策略 RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 15 DAYS; mkdir -p /home/oracle/scripts cd /home/oracle/scripts 备份脚本:(参考文档1,博客 https://blog.csdn.net/tianlesoftware/article/details/5740630,感谢) (参考文档2,陈老师的生产环境脚本,感谢)(参考文档3,李老师的生产环境脚本,感谢) 此脚本只需要修改,ORACLE_SID参数,ORACLE_HOME参数,BACKUPDIR参数,即可 此脚本为全备脚本,增量备份脚本只需要两步: 

    将下文中# Differential incremental backup Script. 部分的注释去掉

    将 BACKUP database 语句中的  INCREMENTAL LEVEL=0 和 TAG hot_db_bk_level0 参数更换为 $BACKUP_TYPE 和 $BACKUP_TAG 即可

增量备份策略为周日全备,周一至周六为一级 若想设置为012级,可自行修改为 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 脚本内容如下: vi rman_backup.sh ############################################################################# ##    hot_database_backup.sh     ## ##   created by hongrun.jiang    ## ##           2020-6-5            ## ############################################################################# #!/bin/sh  ORACLE_SID= ORACLE_HOME= BACKUPDIR= # ---------------------------------------------------------------------------  # Put output in <this file name>.log. Change as desired.  # Note: output directory requires write permission.  # ---------------------------------------------------------------------------  RMAN_LOG_FILE=/home/oracle/scripts/rman_backup.log # ---------------------------------------------------------------------------  # You may want to delete the output file so that backup information does  # not accumulate.  If not, delete the following lines.  # ---------------------------------------------------------------------------  if [ -f "$RMAN_LOG_FILE" ]  then  rm -f "$RMAN_LOG_FILE"  fi  # ---------------------------------------------------------------------------  # Initialize the log file.  # ---------------------------------------------------------------------------  echo >> $RMAN_LOG_FILE  chmod 666 $RMAN_LOG_FILE  # ---------------------------------------------------------------------------  # Determine the user which is executing this script.  # ---------------------------------------------------------------------------  CUSER=`id |cut -d"(" -f2 | cut -d ")" -f1`  ORACLE_USER=$CUSER  # ---------------------------------------------------------------------------  # Set the Oracle Recovery Manager name.  # ---------------------------------------------------------------------------  RMAN=$ORACLE_HOME/bin/rman  # ---------------------------------------------------------------------------  # Log the start of this script.  # ---------------------------------------------------------------------------  echo >> $RMAN_LOG_FILE  echo Script $0 >> $RMAN_LOG_FILE  echo >> $RMAN_LOG_FILE echo ==== started on `date` ==== >> $RMAN_LOG_FILE  # ---------------------------------------------------------------------------  # Print out the value of the variables set by this script.  # ---------------------------------------------------------------------------  echo >> $RMAN_LOG_FILE  echo   "RMAN: $RMAN" >> $RMAN_LOG_FILE  echo   "ORACLE_USER: $ORACLE_USER" >> $RMAN_LOG_FILE  echo   "ORACLE_SID: $ORACLE_SID" >> $RMAN_LOG_FILE  echo   "ORACLE_HOME: $ORACLE_HOME" >> $RMAN_LOG_FILE  echo >> $RMAN_LOG_FILE  # ---------------------------------------------------------------------------  # Differential incremental backup Script. # ---------------------------------------------------------------------------  #Weekday=`date +%u` # #if [ $Weekday = 7 ] #then #        echo "Full backup requested" >> $RMAN_LOG_FILE #        BACKUP_TYPE="INCREMENTAL LEVEL=0" #        BACKUP_TAG="hot_db_bk_level0" # #elif [ $Weekday != 7 ] #then #        echo "Differential incremental backup requested" >> $RMAN_LOG_FILE #        BACKUP_TYPE="INCREMENTAL LEVEL=1" #        BACKUP_TAG="hot_db_bk_level1" #fi # #echo >> $RMAN_LOG_FILE  # ---------------------------------------------------------------------------  # Call Recovery Manager to initiate the backup.  # ---------------------------------------------------------------------------  CMD_STR="  ORACLE_SID=$ORACLE_SID  ORACLE_HOME=$ORACLE_HOME  $RMAN nocatalog target / msglog $RMAN_LOG_FILE append << EOF RUN {  allocate channel c1 device type disk; allocate channel c2 device type disk; allocate channel c3 device type disk; allocate channel c4 device type disk; BACKUP  as compressed backupset  INCREMENTAL LEVEL=0 TAG hot_db_bk_level0 skip inaccessible  filesperset 5  FORMAT '$BACKUPDIR/bk_%d_%U_%T'  database;  sql 'alter system archive log current'; BACKUP  skip inaccessible  TAG='arch_bk'  filesperset 20 FORMAT '$BACKUPDIR/arch_%d_%U_%T'  ARCHIVELOG ALL  NOT BACKED UP 2 TIMES; # DELETE INPUT;  backup tag='controlfile_bk' format='$BACKUPDIR/controlfile_%d_%U_%T.ctl' current controlfile; backup tag='spfile_bk' format='$BACKUPDIR/spfile_%d_%U_%T.ora' spfile; release channel c1; release channel c2; release channel c3; release channel c4; } allocate channel for maintenance device type disk; crosscheck archivelog all; #delete noprompt expired archivelog all; delete noprompt archivelog all completed before 'sysdate -2'; crosscheck backup;  delete noprompt expired backup; report obsolete;  delete noprompt obsolete;  list backup summary;  release channel; EOF " # ---------------------------------------------------------------------------  # Initiate the command string. # ---------------------------------------------------------------------------  if [ "$CUSER" = "root" ]  then      echo "Root Command String: $CMD_STR" >> $RMAN_LOG_FILE          su - $ORACLE_USER -c "$CMD_STR" >> $RMAN_LOG_FILE      RSTAT=$?  else      echo "User Command String: $CMD_STR" >> $RMAN_LOG_FILE          /bin/sh -c "$CMD_STR" >> $RMAN_LOG_FILE      RSTAT=$?  fi  # ---------------------------------------------------------------------------  # Log the completion of this script.  # ---------------------------------------------------------------------------  DBIP=`/sbin/ifconfig bond0|grep "inet addr" | awk -F[:" "]+ '{print $4}'` if [ "$RSTAT" = "0" ]  then      LOGMSG="ended successfully"  #python /home/oracle/script/monitor/sms.py '***********' 'RMAN' "CRITICAL - $DBIP `date -d "-0 day" +%Y%m%d` RMAN ended successfully!" else      LOGMSG="ended in error"  python /home/oracle/script/monitor/sms.py '***********' 'RMAN' "CRITICAL - $DBIP `date -d "-0 day" +%Y%m%d` RMAN ended error!" fi  echo >> $RMAN_LOG_FILE  echo Script $0 >> $RMAN_LOG_FILE  echo >> $RMAN_LOG_FILE  echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE  echo >> $RMAN_LOG_FILE  exit $RSTAT  删除归档脚本

vi del_backup.sh

#!/bin/ksh

PATH=/usr/bin:/usr/ucb:/etc:.:/usr/X/bin:/bin

export PATH

export BACKUPDIR=

find $BACKUPDIR -mtime +15 -name "arch_*" -exec rm {} \;

定时任务

crontab -e

0 0 * * * /bin/sh /home/oracle/scripts/rman_backup.sh

0 0 * * * /bin/sh /home/oracle/scripts/del_backup.sh

相关推荐