在执行脚本之前,先修改几个参数值:
修改控制文件的保存时间,从默认的7天改成14天
SQL> show parameter control
SQL> alter system set control_file_record_keep_time=14 scope=both;
开启控制文件的自动备份,开启之后在数据库备份或者数据文件(比如添加数据文件)有修改的时候都会自动备份控制文件和spfile文件。
configure controlfile autobackup on;
当数据库兼容性设置为大于等于10.0.0时,尽管在没有0级备份情况做1级的增量备份实际上是一个全备,但是这个全备也是1级的,不能用作1级积累增量备份的基础备份,这个是在设计备份策略的时候要注意的问题。
在存放catalog的实例上创建catalog 目录:
1.创建Catalog所需要的表空间
SQL>create tablespace ts_catalog datafile '/u01/app/oracle/oradata/orcl/catalog_ts.dbf' size 1024M;
2.创建RMAN用户并授权
SQL>create user catalog identified by catalog default tablespace ts_atalog;
SQL>grant recovery_catalog_owner to catalog;
查看角色所拥有的权限:
select * from dba_sys_privs where grantee='RECOVERY_CATALOG_OWNER';
3.创建恢复目录
$ rman target / catalog catalog/catalog@catalog1;
Recovery Manager: Release 10.2.0.1.0 - Production on Thu Jul 15 12:03:16 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1248423599)
connected to recovery catalog database
RMAN> create catalog tablespace ts_catalog;
recovery catalog created
如果此处报错:
ORACLE error from recovery catalog database: ORA-00955: name is already used by an existing object
可以用命令删除catalog,再创建:
RMAN> drop catalog;
recovery catalog owner is CATALOG
enter DROP CATALOG command again to confirm catalog removal
RMAN> drop catalog
recovery catalog dropped
RMAN> register database;
database registered in recovery catalog
starting full resync of recovery catalog
full resync complete
RMAN>
差异增量备份有3个级别:
0级:相当于全备,不同的是0级可用于增量备份,全备不行。
1级:备份自上次0级备份以来的数据。
2级:备份自上次备份以来的数据。
脚本的增量备份策略: 周日0级备份,周四1级备份,其他2级备份。
Shell 脚本:
#+--------------------------------------------------------------+
#|(C) 2011 LEISHIFEI All Right Reserved.
#+--------------------------------------------------------------+
#|File :incremental_hot_database_backup.sh
#|Source :$Source$
#|Description :Rman nocatalog full backup for Oracle 10g
#| linux or aix.
#+--------------------------------------------------------------+
#|Authors :leishifei
#+--------------------------------------------------------------+
#|Date :$Date$
#|Version :$Revision$
#+--------------------------------------------------------------+
#!/bin/ksh
export LANG=en_US
BACKUP_DATE=`date +%d`
RMAN_LOG_FILE=${0}.out
TODAY=`date`
USER=`id|cut -d "(" -f2|cut -d ")" -f1`
echo "-----------------$TODAY-------------------">$RMAN_LOG_FILE
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORACLE_HOME
RMAN=$ORACLE_HOME/bin/rman
export RMAN
ORACLE_SID=orcl
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=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 "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 TARGET sys/oracle CATALOG catalog/catalog@catalog1 msglog $RMAN_LOG_FILE append <<EOF
run
{
allocate channel c1 type disk;
allocate channel c2 type disk;
backup incremental level= $BAK_LEVEL skip inaccessible filesperset 5 Database format='/u01/backup/orcl_lev"$BAK_LEVEL"_%U_%T' tag='orcl_lev"$BAK_LEVEL"' ;
sql 'alter system archive log current';
backup archivelog all tag='arc_bak' format='/u01/backup/arch_%U_%T' skip inaccessible filesperset 5 not backed up 1 times delete input;
backup current controlfile tag='bak_ctlfile' format='/u01/backup/ctl_file_%U_%T';
backup spfile tag='spfile' format='/u01/backup/ORCL_spfile_%U_%T';
release channel c2;
release channel c1;
}
report obsolete;
delete noprompt obsolete;
crosscheck backup;
delete noprompt expired backup;
list backup summary;
resync catalog;
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="ended successfully"
else
LOGMSG="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
exit $RSTAT
#+--------------------------------------------------------------+
#| The end.
#+--------------------------------------------------------------+
将该备份脚本添加到crontab,定时执行:
$ crontab -l
00 23 * * * /usr/local/admin/scripts/incremental_hotbackup.sh
这个脚本,备份集可以通过设定保存策略定期删除,但是备份的归档文件无法删除。
所以还需要定期的删除备份的归档文件,一般保存15天。
shell 脚本如下,添加到crontab 里定时执行就可以了。
#+--------------------------------------------------------------+
#|(C) 2011 LEISHIFEI All Right Reserved.
#+--------------------------------------------------------------+
#|File :del_archive_backup.sh
#|Source :$Source$
#|Description :Rman nocatalog full backup for Oracle 10g
#| linux or aix.
#+--------------------------------------------------------------+
#|Authors :leishifei
#+--------------------------------------------------------------+
#|Date :$Date$
#|Version :$Revision$
#+--------------------------------------------------------------+
#!/bin/ksh
PATH=/usr/bin:/usr/ucb:/etc:.:/usr/X/bin:/bin
export PATH
find /u02/rman_cata_backup -mtime +15 -name "arch_*" -exec rm {} /;
#+--------------------------------------------------------------+
#| The end.
#+--------------------------------------------------------------+
这里的路径需要根据自己的情况做相应修改。
将该备份脚本添加到crontab,定时执行:
$ crontab -l
00 03 * * * /usr/local/admin/scripts/del_archive_backup.sh