Rman Scripts (Linux)

lhyvsxman發表於2010-08-09

---------------------------------------------------backup

#!/bin/bash
#Introduce: Linux backup Oracle by RMAN everyday.
#2010/04/15 by Lihongyi


echo 'Attention:Linux ready to backup Oracle now!'
source $HOME/.bash_profile
rman=$ORACLE_HOME/bin/rman


filepath=`date +%Y%m%d`
weekday=`date -d today +%w`

mkdir /backup/"$filepath"

if [ "$weekday" == "7" ]; then
rman target / <backup incremental level=0 database format '/backup/$filepath/%U';

delete expired backup;
quit;
EOF
elif [ "$weekday" == "2" ]||[ "$weekday" == "4" ]; then
rman target / <

Backup incremental level=1 database format '/backup/$filepath/%U';

delete expired backup;
quit;
EOF
elif [ "$weekday" == "1" ]||[ "$weekday" == "3" ] ||[ "$weekday" == "5" ] ||[ "$weekday" == "6" ]; then
rman target / <

backup incremental level=2 database format '/backup/$filepath/%U';

delete expired backup;
quit;
EOF
fi

exit 0

-----------------------------------------------------Rmanbackup

#!/bin/sh
# 編寫: 劉建 2010.01.15(版本0.8)
# 功能: 源資料庫根據事先定製的備份策略,定期執行資料備份任務。
# 呼叫方式:RmanBackup.sh 備份模式 ORACLE_SID 備份的目標資料夾 本地歸檔日誌存放有效天數 備份資料有效天數 備份程式並行度
# 注:備份模式 0: 0級全備份 1: 1級增量備份
# 例如: ./RmanBackup.sh 0 orcl /opt/ora10g/backup 3 3 2
# 執行方式:(1)以oracle使用者身份登入linux後手工執行
# (2)以oracle使用者身份自動執行的crontab任務
#
# 版本修訂說明:
# 一、版本0.9 劉建 2010.01.22
# 1、 簡化備份流程的複雜度,去除RmanConfig模組。
# 2、 忽略歸檔日誌的備份。
# 3、 加入交叉檢查、自動刪除無效備份檔案的功能。
# 4、 加入了對工作記錄log檔案所在目錄的自動建立功能,不需人工干預。
# 5、 最佳化恢復程式,避免常見的ORA-600和ORA-01152錯誤。
#
# 二、版本1.0 劉建 2010.01.27
# 1、 增加了對當前資料庫是否啟用“歸檔模式”的自動檢查,未開啟則提示該資訊並中斷本次任務。
# 2、 增加對單機存在多個資料庫例項的支援,備份與恢復指令碼都增加了{ORACLE_SID}引數。
# 3、 為更加明晰的標識存放於備份區的的備份檔案是屬於“全備份”還是“增量備份”,
# 修改了備份指令碼,使得“全備份”和“增量備份”的備份片檔名特徵不同。
# 2010.01.28 增加
# 4、 補充了對【目標資料庫伺服器】塊跟蹤日誌檔案存放路徑的自動檢測和建立工作程式碼,否則該目錄不存在時,“恢復”會提示錯誤。
# 5、 改變了對控制檔案和SPFILE自動備份的觸發方式,
# 由原先的RMAN的CONFIG定製改為每次backup database命令時連帶INCLUDE CURRENT CONTROLFILE命令執行。
# 2010.02.07 增加
# 6、 修正了一個會導致備份檔案過期後仍然無法被自動刪除的ORACLE初始化引數的預設設定值,
# 使得控制檔案可以儲存365天(全年)的備份狀況資料。
##########################################################################################################################


###################################################
#開始指令碼的各項初始化工作
#先核對命令列中,引數是否齊備
if [ $# -lt 6 ]
then
echo "==========================================================================================================="
echo "Usage:"
echo "RmanBackup.sh {BackupMode} {ORACLE_SID} {BackupDirectory} {ArchRetainDay} {BakFileRetainDay} {Parallelism} "
#echo "請詳細核對命令列中需要設定的6個引數是否完整:"
#echo "RmanBackup.sh 備份模式 ORACLE_SID 備份的目標資料夾 本地歸檔日誌存放有效天數 備份資料有效天數 備份程式並行度"
echo "==========================================================================================================="
exit 1
fi

#執行變數
source $HOME/.bash_profile
TEE=/usr/bin/tee
RMAN=$ORACLE_HOME/bin/rman
SQLPLUS=$ORACLE_HOME/bin/sqlplus

export ORACLE_SID=$2

#目錄變數
BACKUPDEST=$3
if [ ! -d $BACKUPDEST ]
then
echo "請詳細核對“備份的目標資料夾”引數是否正確,此資料夾無法正常訪問!"
exit 1
fi

#日誌檔案
if [ ! -d $ORACLE_BASE/BackupLogs ]
then
mkdir $ORACLE_BASE/BackupLogs
fi
LOGFILE=$ORACLE_BASE/BackupLogs/RmanBackup_`date +%Y%m%d`.log

#檢查資料庫是否已經處於“歸檔模式”下
$SQLPLUS "/ as sysdba" <spool AL.log
SELECT LOG_MODE FROM V$DATABASE;
spool off
EXIT
EOF

STATUS=`grep -i "NOARCHIVELOG" AL.log|wc -l`
if [ $STATUS -eq 1 ]
then
echo "當前ORACLE資料庫未執行在“歸檔模式”下,不能進行聯機熱備,請完善相關配置!"
exit 1
fi

###########################################################
#啟用“塊跟蹤”功能,並設定塊跟蹤日誌檔案的檔名及其存放路徑
if [ ! -d $ORACLE_BASE/Rman ]
then
mkdir $ORACLE_BASE/Rman
fi

#檢查是否已經啟用了“塊跟蹤”功能
$SQLPLUS "/ as sysdba" <spool BCT.log
SELECT STATUS FROM V$BLOCK_CHANGE_TRACKING;
spool off
EXIT
EOF

STATUS=`grep -i "ENABLED" BCT.log|wc -l`
if [ $STATUS -eq 0 ]
then
$SQLPLUS "/ as sysdba" <ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '$ORACLE_BASE/Rman/RmanBlockChangeTrack.f';
EXIT
EOF
fi

###########################################################
#修改初始化引數---控制檔案儲存備份檔案資訊的天數 擴大為1年

$SQLPLUS "/ as sysdba" <spool KD.log
SHOW PARAMETER control_file_record_keep_time
spool off
EXIT
EOF

STATUS=`grep -i "integer" KD.log| awk '{print $3}'`
if [ $STATUS -lt 365 ]
then
$SQLPLUS "/ as sysdba" <ALTER SYSTEM SET CONTROL_FILE_RECORD_KEEP_TIME = 365 SCOPE=BOTH;
EXIT
EOF
fi

###########################################################
# 防止RMAN可能對部分過期備份檔案漏刪除,這裡用OS的命令補做
#find $BACKUPDEST -name "20*_L0_*.bak" -mtime +$5 -exec rm {} ;
#find $BACKUPDEST -name "20*_L1_*.bak" -mtime +$5 -exec rm {} ;
#find $BACKUPDEST -name "20*_c-*" -mtime +$5 -exec rm {} ;

###########################################################
#開始執行備份工作
if [ $1 -eq 0 ]
then
$RMAN <CONNECT TARGET

#若開啟CF的自動備份規則,那麼RMAN會在每個資料檔案發生備份時產生1個控制檔案備份(僅第一個記錄在案),
#這勢必造成備份檔案過多的問題,因此需要遮蔽此規則
#CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$BACKUPDEST/%T_%F';

#備份檔案的保持策略(即保留天數,過期將會被delete noprompt obsolete語句自動刪除)
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF $5 DAYS;

#最大同時可開啟4個備份通道
CONFIGURE CHANNEL 0 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 3 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;

#並行度(決定開啟併發的備份通道個數,多併發可以加快備份速度,但要和CPU核數、磁碟實際的吞吐能力匹配)
CONFIGURE DEVICE TYPE DISK PARALLELISM $6 BACKUP TYPE TO BACKUPSET;

SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';

#0級全備份;控制檔案(spfile也會包含)需同步備份,且每次backup僅備份產生1個控制檔案備份。
BACKUP INCREMENTAL LEVEL 0 TAG 'BackupLevel0' DATABASE FILESPERSET=4 INCLUDE CURRENT CONTROLFILE;

#因為在備份過程中,某些資料檔案可能仍然被修改(已經備份的檔案的SCN會比控制檔案最後記錄的SCN要小),仍然產生redoLog,
#在做完backup database後,保險起見,建議備份歸檔,否則恢復時會產生其他問題。
#先強制切換並歸檔當前的redo log
#SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
#將近期的archived log 一併備份到共享區
#BACKUP ARCHIVELOG ALL NOT BACKED UP FORMAT '$BACKUPDEST/%T_num%s%p.bak' FILESPERSET=5;

#備份完成後,自動清除處於失效期的本地歸檔日誌(即僅保留 $3 天之內的)
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-$4';

#根據先前制定的備份保留策略,自動刪除過期失效檔案
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;

EXIT;
EOF
else
$RMAN <CONNECT TARGET

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$BACKUPDEST/%T_%F';

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF $5 DAYS;

CONFIGURE CHANNEL 0 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 3 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;

CONFIGURE DEVICE TYPE DISK PARALLELISM $6 BACKUP TYPE TO BACKUPSET;

SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';

#1級增量備份
BACKUP INCREMENTAL LEVEL 1 TAG 'BACKUPLEVEL1' DATABASE FILESPERSET=4 INCLUDE CURRENT CONTROLFILE;

DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-$4';

CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
EXIT;
EOF
fi

#備份控制檔案
rm $ORACLE_BASE/NEW.CTL
#不要直接備份到$BACKUPDEST目錄
$SQLPLUS "/ as sysdba" <ALTER DATABASE BACKUP CONTROLFILE TO '$ORACLE_BASE/NEW.CTL';
exit;
EOF

cp $ORACLE_BASE/NEW.CTL $BACKUPDEST/NEW.CTL

-----------------------------------------------------Rmanrestore

##########################################################################################################################
#!/bin/sh
# 編寫: 劉建 2010.01.15(版本0.8)
# 功能: 目標資料庫根據源資料庫定期備份到共享存放區的備份資料,定期執行資料恢復任務,保證備份機的準同步狀態。
# 呼叫方式:RmanRestore.sh 恢復模式 ORACLE_SID 備份檔案的“共享存放區”訪問路徑 源資料庫的dbid 恢復程式的並行度
# 恢復模式
# 0: "全量恢復"模式 先恢復最近的0級全備份,再尋找1級增量備份來恢復
# 1: "增量恢復"模式 只優先使用1級增量備份來恢復(之後再找archivelog,但本備份體系未備份archivelog)
# 備份機必須要保證的:“備份檔案的共享存放區” 在 源資料庫和目標資料庫 上的訪問路徑命名是 一致 的!
# 否則,目標資料庫使用了源資料庫的控制檔案後,無法實施資料恢復工作,因為備份檔案無法獲取。
# 例如: ./RmanRestore.sh 1 orcl /opt/ora10g/backup 4241560514 2
# 執行方式:(1)以oracle使用者身份登入linux後手工執行
# (2)以oracle使用者身份自動執行的crontab任務
#
# 版本修訂說明:
# 一、版本0.9 劉建 2010.01.22
# 1、 簡化備份流程的複雜度,去除RmanConfig模組。
# 2、 忽略歸檔日誌的備份。
# 3、 加入交叉檢查、自動刪除無效備份檔案的功能。
# 4、 加入了對工作記錄log檔案所在目錄的自動建立功能,不需人工干預。
# 5、 最佳化恢復程式,避免常見的ORA-600和ORA-01152錯誤。
#
# 二、版本1.0 劉建 2010.01.27
# 1、 增加了對當前資料庫是否啟用“歸檔模式”的自動檢查,未開啟則提示該資訊並中斷本次任務。
# 2、 增加對單機存在多個資料庫例項的支援,備份與恢復指令碼都增加了{ORACLE_SID}引數。
# 3、 為更加明晰的標識存放於備份區的的備份檔案是屬於“全備份”還是“增量備份”,
# 修改了備份指令碼,使得“全備份”和“增量備份”的備份片檔名特徵不同。
# 2010.01.28 增加
# 4、 補充了對【目標資料庫伺服器】塊跟蹤日誌檔案存放路徑的自動檢測和建立工作程式碼,否則該目錄不存在時,“恢復”會提示錯誤。
# 5、 改變了對控制檔案和SPFILE自動備份的觸發方式,
# 由原先的RMAN的CONFIG定製改為每次backup database命令時連帶INCLUDE CURRENT CONTROLFILE命令執行。
##########################################################################################################################

if [ $# -lt 5 ]
then
echo "==============================================================================================="
echo "請詳細核對命令列中需要設定的5個引數是否完整:"
echo "RmanRestore.sh 恢復模式 ORACLE_SID 備份檔案的“共享存放區”訪問路徑 源資料庫的dbid 恢復程式的並行度"
echo " 主資料庫的dbid可透過以下SQL語句獲取:"
echo " select dbid from v$database; "
echo "==============================================================================================="
exit 1
fi

BACKUPDEST=$3
if [ ! -f $BACKUPDEST/NEW.CTL ]
then
echo "======================================================================="
echo "請詳細核對備份檔案的“共享存放區”訪問路徑引數是否正確:"
echo "NEW.CTL在當前資料夾不存在!"
echo "======================================================================="
exit 1
fi

#執行變數
source $HOME/.bash_profile
TEE=/usr/bin/tee
RMAN=$ORACLE_HOME/bin/rman
SQLPLUS=$ORACLE_HOME/bin/sqlplus

export ORACLE_SID=$2

#執行日誌檔案(預設在/home/oracle目錄下,今後可手工修改)
if [ ! -d $ORACLE_BASE/BackupLogs ]
then
mkdir $ORACLE_BASE/BackupLogs
fi
LOGFILE=$ORACLE_BASE/BackupLogs/RmanRestore_`date +%Y%m%d`.log

#檢查資料庫是否已經處於“歸檔模式”下
$SQLPLUS "/ as sysdba" <spool AL.log
SELECT LOG_MODE FROM V$DATABASE;
spool off
EXIT
EOF

STATUS=`grep -i "NOARCHIVELOG" AL.log|wc -l`
if [ $STATUS -eq 1 ]
then
echo "當前ORACLE資料庫未執行在“歸檔模式”下,不能進行聯機恢復,請完善相關配置!"
exit 1
fi

#設定塊跟蹤日誌檔案存放路徑
if [ ! -d $ORACLE_BASE/Rman ]
then
mkdir $ORACLE_BASE/Rman
fi

#資料庫的恢復工作
if [ $1 -eq 0 ]
then
$RMAN <CONNECT TARGET

SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
#強制目標資料庫的dbid和源資料庫相同
SET DBID=$4;
#之後應用源資料庫最新的控制檔案
RESTORE CONTROLFILE FROM '$BACKUPDEST/NEW.CTL';
ALTER DATABASE MOUNT;

#恢復程式的並行度(要和CPU核數、磁碟實際的吞吐能力匹配)
CONFIGURE DEVICE TYPE DISK PARALLELISM $5;
#"全量恢復"模式,使用最近的0級備份來整體恢復資料庫
RESTORE DATABASE;
#應該在rman下recover,而不應該在sqlplus恢復
#這樣recover database的過程中,會優先應用1級增量備份集而不是ArchiveLog
#下面的命令將強制只使用增量備份來恢復
RECOVER DATABASE noredo;
EXIT;
EOF
$SQLPLUS "/ as sysdba" <--因為在備份過程中,某些資料檔案可能仍然被修改(其SCN比最後備份的控制檔案中記錄的SCN要小)
--為忽略今後open“目標資料庫”可能會發生的ORA-01152錯誤,必要時啟用此引數
ALTER SYSTEM SET "_ALLOW_RESETLOGS_CORRUPTION"=TRUE SCOPE=SPFILE;
STARTUP FORCE MOUNT;
--若兩機資料庫系統環境產生偏差,更可能產生嚴重的ORA-600錯誤,所以也不建議每次都OPEN RESETLOGS(僅在必要時)
--而且【目標資料庫】在正常方式(非READ ONLY)OPEN開啟之後,為保證恢復任務的無錯完成,不建議下次進行“增量恢復”,或者在“增量恢復”失敗後做一次“全量恢復”。
ALTER DATABASE OPEN RESETLOGS;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
EXIT;
EOF
else
$RMAN <CONNECT TARGET

SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;

SET DBID=$4;
RESTORE CONTROLFILE FROM '$BACKUPDEST/NEW.CTL';
ALTER DATABASE MOUNT;

CONFIGURE DEVICE TYPE DISK PARALLELISM $5;
#"增量恢復"模式,需跳過restore database這一步,直接recover
RECOVER DATABASE noredo;
EXIT;
EOF
$SQLPLUS "/ as sysdba" <ALTER SYSTEM SET "_ALLOW_RESETLOGS_CORRUPTION"=TRUE SCOPE=SPFILE;
STARTUP FORCE MOUNT;
ALTER DATABASE OPEN RESETLOGS;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
EXIT;
EOF
fi

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12180666/viewspace-1036518/,如需轉載,請註明出處,否則將追究法律責任。

相關文章