elitechen 2020-02-17
1.1备份策略 周日执行0级的增量备份 周一执行2级的增量备份 周二执行2级的增量备份 周三执行1级的增量备份 周四执行2级的增量备份 周五执行2级的增量备份 周六执行2级的增量备份 周日进行一次零级备份,周一、周二、进行二级备份;周三进行一级备份;周四、周五、周六进行二级备份。在执行备份的时候,我们考 虑将数据文件的全备和归档日志备份分开执行,避免造成一些不必要的麻烦。在进行全备的时候,由于RAC的两个节点是共享的所有数据文件,控制文件,所以我 们只连接其中的一个节点rac1来进行备份。在进行归档日志的备份的时候,由于归档日志并非共享,而是在每个节点本地存储的,所以我们需要分别连接到两个节 点进行归档日志的备份。为节省存储空间,将对备份后归档日志做定期删除。 2.数据库备份脚本 2.1 零级备份脚步(即全备) 0级脚本如下: cat >> /home/oracle/fullbackup/backup_lv0.sql < run{ allocate channel c1 type disk maxpiecesize=3500m; allocate channel c2 type disk maxpiecesize=3500m; backup incremental level 0 database include current controlfile format ‘+DATA/frxdb/backupset/frxdb_%T_%s_%p.lv0‘ plus archivelog delete all input format ‘+DATA/frxdb/backupset/arch_%T_%s_%p.arc‘; release channel c1; release channel c2; } EOF 2.2 一级脚本如下: cat >> /home/oracle/fullbackup/backup_lv1.sql < run { allocate channel c1 type disk maxpiecesize=3500m; backup incremental level 1 database include current controlfile format ‘+DATA/frxdb/backupset/frxdb_%T_%s_%p.lv1‘; release channel c1; } EOF 2.3 二级脚本如下: cat >> /home/oracle/fullbackup/backup_lv2.sql < run{ allocate channel c1 type disk maxpiecesize=3500m; backup incremental level 2 database include current controlfile format ‘+DATA/frxdb/backupset/frxdb_%T_%s_%p.lv2‘; release channel c1; } EOF 3 自动备份 3.1 自动备份脚本 ######################################################################## ## rac__backup.sh ## ## created by ZHONGYI TECH ## ## 2014-6-23 ## ######################################################################### #!/bin/sh export LANG=en_US BACKUP_DATE=`date +%d` RMAN_LOG_FILE=${0).out TODAY=`date` CUSER=`id|cut -d "(" -f2|cut -d ")" -f1` echo "-----------------$TODAY-------------------">$RMAN_LOG_FILE ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/db_1 export ORACLE_HOME RMAN=$ORACLE_HOME/bin/rman export RMAN ORACLE_SID=frxdb export ORACLE_SID ORACLE_USER=oracle export ORACLE_USER echo "ORACLE_SID: $ORACLE_SID">>$RMAN_LOG_FILE echo "ORACLE_HOME:$ORACLE_HOME">>$RMAN_LOG_FILE echo "ORACLE_USER:$ORACLE_USER">>$RMAN_LOG_FILE echo "==========================================">>$RMAN_LOG_FILE echo "BACKUP DATABASE BEGIN......">>$RMAN_LOG_FILE echo " ">>$RMAN_LOG_FILE chmod 666 $RMAN_LOG_FILE WEEK_DAILY=`date +%a` case "$WEEK_DAILY" in "Mon") BAK_LEVEL=2 ;; "Tue") BAK_LEVEL=2 ;; "Wed") BAK_LEVEL=1 ;; "Thu") BAK_LEVEL=2 ;; "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">>$RMAN_LOG_FILE RUN_STR=" BAK_LEVEL=$BAK_LEVEL export BAK_LEVEL ORACLE_HOME=$ORACLE_HOME export ORACLE_HOME ORACLE_SID=$ORACLE_SID export ORACLE_SID $RMAN nocatalog TARGET sys/ msglog $RMAN_LOG_FILE append < run { allocate channel c1 type disk connect ‘sys/‘; allocate channel c2 type disk connect ‘sys/‘; backup incremental level= $BAK_LEVEL Database format=‘+DATA/frxdb/backupset/frxdb_lev"$BAK_LEVEL"_%U_%T‘ tag=‘frxdb_lev"$BAK_LEVEL"‘ ; sql ‘alter system archive log current‘; backup archivelog all tag=‘arc_bak‘ format=‘+DATA/frxdb/backupset/arch_%U_%T‘ not backed up 1 times delete input; backup current controlfile tag=‘bak_ctlfile‘ format=‘+DATA/frxdb/backupset/ctl_file_%U_%T‘; backup spfile tag=‘spfile‘ format=‘+DATA/frxdb/backupset/frxdb_spfile_%U_%T‘; release channel c1; release channel c2; } allocate channel for maintenance device type disk connect ‘sys/‘; allocate channel for maintenance device type disk connect ‘sys/‘; report obsolete; delete noprompt obsolete; crosscheck backup; delete noprompt expired backup; Release channel; list backup summary; EOF " # Initiate the command string if [ "$CUSER" = "root" ] then echo "Root Command String: $RUN_STR" >> $RMAN_LOG_FILE su - $ORACLE_USER -c "$RUN_STR" >> $RMAN_LOG_FILE RSTAT=$? else echo "User Command String: $RUN_STR" >> $RMAN_LOG_FILE /bin/sh -c "$RUN_STR" >> $RMAN_LOG_FILE RSTAT=$? fi # --------------------------------------------------------------------------- # Log the completion of this script. # --------------------------------------------------------------------------- if [ "$RSTAT" = "0" ] then LOGMSG="backup finished successfully" else LOGMSG="backup ended in error" fi echo >> $RMAN_LOG_FILE echo Script $0 >> $RMAN_LOG_FILE echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE echo >> $RMAN_LOG_FILE echo $LOGMSG | mailx -v -s "oracle backup info" < $RMAN_LOG_FILE exit $RSTAT 3.2加入备份计划任务 用cron创建定时执行任务 ,要使用cron必须启动crond服务,最好还设置cron为开机启动(非本主题内容) 执行crontab –e 添加以下语句 00 03 * * * sh /home/oracle/fullbackup/rac_backup.sh 计划任务实现每天凌晨3点实施备份工作。 4 恢复策略 针对一周内任意一天出现数据库故障需要恢复可遵循如下恢复策略: 周一恢复:使用周日全备份 周二恢复:周日全备+周一增备 周三恢复:周日全备+周一、二增备 周四恢复:周日全备+周三增备 周五恢复:周日+周三、四备 周六恢复:周日+周三、周四、周五增备 周日恢复:周日+周三、四、五、六增备 更低粒度恢复选择使用闪回功能(数据误删除、误操作等)基于时间点、scn等做数据恢复。 本处将结束简单的恢复操作,即没有归档丢失,同时存在完整可用的备份下进行的恢复操作。在恢复之前,需要将数据库关闭,通过rman启动实例并准备恢复。 $ srvctl stop database -d frxdb 因为备份放在共享磁盘上,所以可在单个节点进行恢复,在任一节点: rman target / rman >startup mount rman>restore database; rman>recover database; 如归档连续,操作将成功,可直接执行以下命令打开数据库: rman>sql ‘alter database open’; 注:恢复完成后立即执行备份操作。