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 byZHONGYI 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/system@rac1 msglog $RMAN_LOG_FILE append <
run
{
allocate channel c1 type disk connect 'sys/system@rac1';
allocate channel c2 type disk connect 'sys/system@rac2';
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/system@rac1';
allocate channel for maintenance device type disk connect 'sys/system@rac2';
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" shiyuan@1pay1.com
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’;
注:恢复完成后立即执行备份操作。