共计 10568 个字符,预计需要花费 27 分钟才能阅读完成。
这篇文章主要介绍了 Linux 平台下如何实现 RMAN 全备和增量备份 shell 脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
全备脚本
以 nocatalog 模式为例:
Shell 脚本:
########################################################################
## hot_database_backup.sh ##
## created by Tianlesoftware ##
## 2010-7-16 ##
#########################################################################
#!/bin/sh
# —————————————————————————
# Determine the user which is executing this script.
# —————————————————————————
CUSER=`id |cut -d ( -f2 | cut -d ) -f1`
# —————————————————————————
# Put output in this file name .out. Change as desired.
# Note: output directory requires write permission.
# —————————————————————————
RMAN_LOG_FILE=${0}.out
# —————————————————————————
# 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
# —————————————————————————
# Log the start of this script.
# —————————————————————————
echo Script $0 $RMAN_LOG_FILE
echo ==== started on `date` ==== $RMAN_LOG_FILE
echo $RMAN_LOG_FILE
# —————————————————————————
# Oracle home path.
# —————————————————————————
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORACLE_HOME
# —————————————————————————
# the Oracle SID of the target database.
# —————————————————————————
ORACLE_SID=orcl
export ORACLE_SID
# —————————————————————————
# The Oracle DBA user id (account).
# —————————————————————————
ORACLE_USER=oracle
export ORACLE_USER
# —————————————————————————
# Set the Oracle Recovery Manager name.
# —————————————————————————
RMAN=$ORACLE_HOME/bin/rman
# —————————————————————————
# Print out the value of the variables set by this script.
# —————————————————————————
echo $RMAN_LOG_FILE
echo RMAN: $RMAN $RMAN_LOG_FILE
echo ORACLE_SID: $ORACLE_SID $RMAN_LOG_FILE
echo ORACLE_USER: $ORACLE_USER $RMAN_LOG_FILE
echo ORACLE_HOME: $ORACLE_HOME $RMAN_LOG_FILE
# —————————————————————————
# Print out the value of the variables set by bphdb.
# —————————————————————————
#echo $RMAN_LOG_FILE
#echo NB_ORA_FULL: $NB_ORA_FULL $RMAN_LOG_FILE
#echo NB_ORA_INCR: $NB_ORA_INCR $RMAN_LOG_FILE
#echo NB_ORA_CINC: $NB_ORA_CINC $RMAN_LOG_FILE
#echo NB_ORA_SERV: $NB_ORA_SERV $RMAN_LOG_FILE
#echo NB_ORA_POLICY: $NB_ORA_POLICY $RMAN_LOG_FILE
# —————————————————————————
# NOTE: This script assumes that the database is properly opened. If desired,
# this would be the place to verify that.
# —————————————————————————
echo $RMAN_LOG_FILE
# —————————————————————————
# —————————————————————————
# Call Recovery Manager to initiate the backup.
# —————————————————————————
CMD_STR=
ORACLE_HOME=$ORACLE_HOME
export ORACLE_HOME
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
$RMAN nocatalog target sys/admin msglog $RMAN_LOG_FILE append EOF
RUN {
allocate channel c1 type disk;
allocate channel c2 type disk;
BACKUP FORMAT /u01/backup/orcl_%U_%T skip inaccessible filesperset 5 DATABASE TAG orcl_hot_db_bk;
sql alter system archive log current
BACKUP FORMAT /u01/backup/arch_%U_%T skip inaccessible filesperset 5 ARCHIVELOG ALL 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;
#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.
# —————————————————————————
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
/bin/mailx -s RMAN Backup SID daimm@sf-express.com $RMAN_LOG_FILE
exit $RSTAT
三. 增量备份
以 catalog 模式为例:
在存放 catalog 的实例上创建 catalog 目录:
1. 创建 Catalog 所需要的表空间
SQL create tablespace catalog_ts datafile D:/APP/ADMINISTRATOR/ORADATA/ORCL/catalog_ts1.dbf size 20M;
2. 创建 RMAN 用户并授权
SQL create user catalog identified by catalog default tablespace catalog_ts;
SQL grant recovery_catalog_owner to catalog;
查看角色所拥有的权限:
select * from dba_sys_privs where grantee= RECOVERY_CATALOG_OWNER
3. 创建恢复目录
[oracle@db1 scripts]$ 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 catalog_ts;
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 脚本:
########################################################################
## incremental_hot_database_backup.sh ##
## created by Tianlesoftware ##
## 2010-7-16 ##
#########################################################################
#!/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/admin 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
/bin/mailx -s RMAN Backup SID daimm@sf-express.com $RMAN_LOG_FILE
exit $RSTAT
将该备份脚本添加到 crontab, 然后定时执行:
[oracle@db1 u01]$ crontab -l
00 1 * * * /u01/scripts/incremental_hotbackup.sh
Unix crontab 命令详解
http://blog.csdn.net/tianlesoftware/archive/2010/02/22/5315039.aspx
在测试的时候,我们可以手工的修改,然后查看脚本的执行情况即可:
[root@db1 ~]# date –set 2010-7-16 11:11:11
——————————2010 年 8 月 23 日补充 ————————–
用这个脚本的时候发现一个问题,备份集可以通过设定保存粗略定期删除,但是备份的归档文件无法删除。
所以还需要定期的删除备份的归档文件。一般保存 15 天。shell 脚本如下。添加到 crontab 里定时执行就可以了。
del_archive_backup.sh
#!/bin/ksh
# ##################################################################
#
# delete archvivelog backup file.sh
# tianlesoftware
#
# ##################################################################
PATH=/usr/bin:/usr/ucb:/etc:.:/usr/X/bin:/bin
export PATH
find /u01/incremental_hotbackup -mtime +15 -name arch_* -exec rm {} /;
说明,这里的路径写你自己的就可以了。
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“Linux 平台下如何实现 RMAN 全备和增量备份 shell 脚本”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!