RMAN NOCATALOG备份方案

        我管理的某个数据库最近打算使用RMAN来进行数据库备份。对RMAN有一些简单说明如下:

        1. 若要使用RMAN,数据库必须运行在归档模式下。

        2. RMAN大概有几种备份模式:全量、增量,各种备份级别的关系如下

LEVEL 0 : 相当于全备,他是基础备份,没有执行过LEVEL=0的备份将无法进行LEVEL1或更高级别的备份。

LEVEL 1 : 上次备份过的0或者1至今的变化。

LEVEL 2 : 上次备份至今的增量,无论是0或1或2。

    因此,我制定了如下备份策略

        以下是我的备份脚本

#!/usr/bin/bash
#Author: Feng
#Function: backup database with rman

#set variable
export ORACLE_SID=nmcdb
export ORACLE_HOME=/app/oracle/product/10.2.0
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

#set run variable
RMAN=$ORACLE_HOME/bin/rman
SQLPLUS=$ORACLE_HOME/bin/sqlplus
FILE1=`date +%Y%m%d`
FILE2=`date +%H%M`
LOGFILE=/ainmc/bak/rmanbak/rmanbk$FILE1-$FILE2.LOG

#backup dest
DBDEST=/ainmc/bak/rmanbak/${ORACLE_SID}
CTLFILE=/ainmc/bak/rmanbak/${ORACLE_SID}/${ORACLE_SID}_ctl_$FILE1.ctl

#increate backup set
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 $BAK_LEVEL

echo "begin running rman to backup archivelog and note the backup log" > $LOGFILE

echo "-----------------------backup start---------------------" > $LOGFILE

echo "----Today is $WEEK_DAILY incremental level=$BAK_LEVEL----" > $LOGFILE
$RMAN nocatalog TARGET sys/******@nmcdb msglog $LOGFILE append <

CROSSCHECK archivelog all;

run
{
  CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;  (保存7天内的备份)
  CONFIGURE CONTROLFILE AUTOBACKUP ON; (自动备份controlfile)
  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$DBDEST/%F'; (格式化备份的文件格式)
  ALLOCATE CHANNEL CHL1 DEVICE TYPE DISK;
  ALLOCATE CHANNEL CHL2 DEVICE TYPE DISK;
  ALLOCATE CHANNEL CHL3 DEVICE TYPE DISK;  (同时打开3个通道并行)
  sql 'alter system archive log current';
  backup incremental level=$BAK_LEVEL database format '$DBDEST/NMCDB_lvl${BAK_LEVEL}_%U_%T.bkp' FILESPERSET 10 TAG='NMCDB_lvl${BAK_L
EVEL}'; (incremental level = xx,备份方式为增量备份级别为xx;FILESPERSET 10 每10个数据文件写入一个备份片,这个要参考数据文件的大小以及操作系统所允许的最大单个文件大小,如果设置得太大会导致单个文件大小超过操作系统限制而报错;backup 可以启用压缩,命令如 backup AS COMPRESSED BACKUPSET incremental level=xxx 启用压缩功能,但是启用压缩以后,写入变得会非常慢,是不压缩的1/5不到。)
  backup spfile tag='spfile' format='$DBDEST/NMCDB_SPFILE_%U_%T.ora';
  backup archivelog all tag='arc_bak' format='$DBDEST/NMCDB_arch_%U_%T' filesperset 100 delete all input;
  RELEASE CHANNEL CHL1;
  RELEASE CHANNEL CHL2;
  RELEASE CHANNEL CHL3;
}

#delete the OBSOLETE backup pice
#ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK;
CROSSCHECK BACKUPSET; (核对备份集是否有效)
DELETE NOPROMPT OBSOLETE; (删除无效的备份集)

exit;
END_OF_COMMAND

#when the rman end, begin backup controlfile using sqlplus
$SQLPLUS "/ as sysdba" <alter database backup controlfile to '$CTLFILE';
exit;
END_OF_COMMAND

echo "-----------------------backup end---------------------" >> $LOGFILE

 

        可以使用下述方式来验证备份集

在RMAN下运行:

    restore validate controlfile;
    restore validate database;

 

 

1.jpg

请使用浏览器的分享功能分享到微信等