Linux 平台下 RMAN 全备 和 增量备份 shell 脚本
?
?
?
一.?一些準備知識
?
Oracle?分歸檔和非歸檔模式。?這兩者的區別就是對redo?log的處理。歸檔模式下,當一個redo?log?寫滿之后,就會把這個redo?log里的內容寫入歸檔文件,等寫完之后,這個redo?log?就可以繼續使用,如果是非歸檔模式下,redo?log?就直接覆蓋了。?恢復一般都需要歸檔文件,這里面記錄了對數據庫的操作,所以生產庫一般都運行在歸檔模式下。?關于歸檔模式和非歸檔模式的切換參考Blog:
Oracle?歸檔與非歸檔的切換
http://blog.csdn.net/tianlesoftware/archive/2009/10/19/4693470.aspx
?
RMAN?備份的存放位置也有2種選擇,一種是直接備份到磁盤,另一種就是備份到磁帶。?現在的大公司,一般都使用Symnatec?Veritas?NetBackup?軟件來進行備份。?這款軟件擴展了RMAN的功能和優點,所有用起來比較方便。?08年剛工作的時候就遇到了一個安裝NetBackup的實戰機會,可惜那時剛接觸Oracle,連Oracle?都不了解,更不提NetBackup了,?轉眼2年過去了,在也沒有遇到這樣的機會,不知道什么時候才能玩玩NetBackup。?遺憾啊。?
?
使用RMAN?備份也分catalog?和nocatalog,就是是否使用恢復目錄,如果不使用恢復目錄,那么就是用control?file作為catalog,每一次備份都要往控制文件里面寫好多備份信息,控制文件里面會有越來越多的備份信息。因此,當使用rman?nocatalog方式備份時,備份controlfile是非常重要的。?如果使用catalog模式,就需要句需要創建catalog目錄。?當庫比較多時,使用catalog也是比較方便的。?具體參考:
? RMAN?Catalog?和?Nocatalog?的區別
http://blog.csdn.net/tianlesoftware/archive/2010/06/02/5641763.aspx
?
RMAN的備份也分兩種,一種是全備,另一種增量備份。?全備適用與數據庫比較小的情況,如果庫大的話就需要使用增量備份了,因為這樣能減少備份的時間。?Window?下的備份腳本,參考Blog:
Windows下RMAN備份腳本
http://blog.csdn.net/tianlesoftware/archive/2010/01/13/5181414.aspx
?
關于控制文件對于RMAN的重要性,可以參考下面blog中的第四節:
RMAN?系列(一)----?RMAN?體系結構概述
http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.aspx
?
修改控制文件的保存時間,從默認的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級積累增量備份的基礎備份,這個是在設計備份策略的時候要注意的問題。?
?
?
?
?
?
二.?全備腳本
?
以?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 {} /;
說明,這里的路徑寫你自己的就可以了。
?
感謝jonkingwar?,你說的地方已經修改,至于#EOF ,估計是和平臺有關系。 我在調試的時候運行有錯誤,把這行注釋掉就可以運行了。 所以如果相同錯誤的,可以考慮這種方法。沒有更好。
?
?
?
?
?
?
?
?
?
?
?
?
------------------------------------------------------------------------------?
?
Blog:?http://blog.csdn.net/tianlesoftware?
網上資源:?http://tianlesoftware.download.csdn.net?
相關視頻:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx?
DBA1?群:62697716(滿);?DBA2?群:62697977
DBA3?群:63306533;?????聊天?群:40132017
轉載于:https://www.cnblogs.com/hibernate315/archive/2010/07/16/2399231.html
總結
以上是生活随笔為你收集整理的Linux 平台下 RMAN 全备 和 增量备份 shell 脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AS3 CookBook学习整理(十七)
- 下一篇: linux 其他常用命令