共計 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 行業資訊頻道,更多相關知識等著你來學習!