Rman Scripts (Linux)
---------------------------------------------------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 / <
delete expired backup; Backup incremental level=1 database format '/backup/$filepath/%U'; delete expired backup; backup incremental level=2 database format '/backup/$filepath/%U'; delete expired backup; exit 0 -----------------------------------------------------Rmanbackup #!/bin/sh #執行變數 export ORACLE_SID=$2 #目錄變數 #日誌檔案 #檢查資料庫是否已經處於“歸檔模式”下 STATUS=`grep -i "NOARCHIVELOG" AL.log|wc -l` ########################################################### #檢查是否已經啟用了“塊跟蹤”功能 STATUS=`grep -i "ENABLED" BCT.log|wc -l` ########################################################### $SQLPLUS "/ as sysdba" < STATUS=`grep -i "integer" KD.log| awk '{print $3}'` ########################################################### ########################################################### #若開啟CF的自動備份規則,那麼RMAN會在每個資料檔案發生備份時產生1個控制檔案備份(僅第一個記錄在案), #備份檔案的保持策略(即保留天數,過期將會被delete noprompt obsolete語句自動刪除) #最大同時可開啟4個備份通道 #並行度(決定開啟併發的備份通道個數,多併發可以加快備份速度,但要和CPU核數、磁碟實際的吞吐能力匹配) #0級全備份;控制檔案(spfile也會包含)需同步備份,且每次backup僅備份產生1個控制檔案備份。 #因為在備份過程中,某些資料檔案可能仍然被修改(已經備份的檔案的SCN會比控制檔案最後記錄的SCN要小),仍然產生redoLog, #備份完成後,自動清除處於失效期的本地歸檔日誌(即僅保留 $3 天之內的) #根據先前制定的備份保留策略,自動刪除過期失效檔案 EXIT; 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 DEVICE TYPE DISK PARALLELISM $6 BACKUP TYPE TO BACKUPSET; #1級增量備份 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-$4'; CROSSCHECK BACKUP; #備份控制檔案 cp $ORACLE_BASE/NEW.CTL $BACKUPDEST/NEW.CTL -----------------------------------------------------Rmanrestore ########################################################################################################################## if [ $# -lt 5 ] BACKUPDEST=$3 #執行變數 export ORACLE_SID=$2 #執行日誌檔案(預設在/home/oracle目錄下,今後可手工修改) #檢查資料庫是否已經處於“歸檔模式”下 STATUS=`grep -i "NOARCHIVELOG" AL.log|wc -l` #設定塊跟蹤日誌檔案存放路徑 #資料庫的恢復工作 SHUTDOWN IMMEDIATE; SHUTDOWN IMMEDIATE; SET DBID=$4;
quit;
EOF
elif [ "$weekday" == "2" ]||[ "$weekday" == "4" ]; then
rman target / <
quit;
EOF
elif [ "$weekday" == "1" ]||[ "$weekday" == "3" ] ||[ "$weekday" == "5" ] ||[ "$weekday" == "6" ]; then
rman target / <
quit;
EOF
fi
# 編寫: 劉建 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
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" <
SELECT LOG_MODE FROM V$DATABASE;
spool off
EXIT
EOF
if [ $STATUS -eq 1 ]
then
echo "當前ORACLE資料庫未執行在“歸檔模式”下,不能進行聯機熱備,請完善相關配置!"
exit 1
fi
#啟用“塊跟蹤”功能,並設定塊跟蹤日誌檔案的檔名及其存放路徑
if [ ! -d $ORACLE_BASE/Rman ]
then
mkdir $ORACLE_BASE/Rman
fi
$SQLPLUS "/ as sysdba" <
SELECT STATUS FROM V$BLOCK_CHANGE_TRACKING;
spool off
EXIT
EOF
if [ $STATUS -eq 0 ]
then
$SQLPLUS "/ as sysdba" <
EXIT
EOF
fi
#修改初始化引數---控制檔案儲存備份檔案資訊的天數 擴大為1年
SHOW PARAMETER control_file_record_keep_time
spool off
EXIT
EOF
if [ $STATUS -lt 365 ]
then
$SQLPLUS "/ as sysdba" <
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 <
#這勢必造成備份檔案過多的問題,因此需要遮蔽此規則
#CONFIGURE CONTROLFILE AUTOBACKUP ON;
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_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;
CONFIGURE DEVICE TYPE DISK PARALLELISM $6 BACKUP TYPE TO BACKUPSET;
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP INCREMENTAL LEVEL 0 TAG 'BackupLevel0' DATABASE FILESPERSET=4 INCLUDE CURRENT CONTROLFILE;
#在做完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;
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-$4';
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
EOF
else
$RMAN <
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;
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP INCREMENTAL LEVEL 1 TAG 'BACKUPLEVEL1' DATABASE FILESPERSET=4 INCLUDE CURRENT CONTROLFILE;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
EXIT;
EOF
fi
rm $ORACLE_BASE/NEW.CTL
#不要直接備份到$BACKUPDEST目錄
$SQLPLUS "/ as sysdba" <
exit;
EOF
#!/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命令執行。
##########################################################################################################################
then
echo "==============================================================================================="
echo "請詳細核對命令列中需要設定的5個引數是否完整:"
echo "RmanRestore.sh 恢復模式 ORACLE_SID 備份檔案的“共享存放區”訪問路徑 源資料庫的dbid 恢復程式的並行度"
echo " 主資料庫的dbid可透過以下SQL語句獲取:"
echo " select dbid from v$database; "
echo "==============================================================================================="
exit 1
fi
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
if [ ! -d $ORACLE_BASE/BackupLogs ]
then
mkdir $ORACLE_BASE/BackupLogs
fi
LOGFILE=$ORACLE_BASE/BackupLogs/RmanRestore_`date +%Y%m%d`.log
$SQLPLUS "/ as sysdba" <
SELECT LOG_MODE FROM V$DATABASE;
spool off
EXIT
EOF
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 <
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" <
--為忽略今後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 <
STARTUP NOMOUNT;
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" <
STARTUP FORCE MOUNT;
ALTER DATABASE OPEN RESETLOGS;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
EXIT;
EOF
fi
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12180666/viewspace-1036518/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 神奇的npm -- scriptsNPM
- Converting Oracle Database from Linux to Windows using RMANOracleDatabaseLinuxWindows
- vscode commitlint(debug npm scripts)VSCodeMITNPM
- npm package.json scriptsNPMPackageJSON
- 鳥哥的Linux私房菜基礎篇 第十三章 shell scriptsLinux
- PostgreSQL DBA(147) - pgAdmin(Scripts for freeze)SQL
- Oracle Advanced Performance Tuning Scripts(轉)OracleORM
- 什麼是 WEbExtend Scripts for Emarsys?Web
- Oracle使用RMAN從Windows遷移資料到LinuxOracleWindowsLinux
- 【RMAN】RMAN備份至ASMASM
- 你真的熟悉 npm-scripts 嗎?NPM
- npm scripts的生命週期管理NPM
- 5.npm scripts 使用指南NPM
- Oracle 11G RAC複製備庫RMAN-03002 RMAN-05501 RMAN-03015 RMAN-03009 RMAN-10038Oracle
- 【RMAN】RMAN的備份保留策略
- 你真的瞭解npm-scripts嗎?NPM
- ORACLE rman與RMAN-00054&ORA-09945Oracle
- RMAN(轉)
- 【RMAN】Oracle rman 常用命令參考Oracle
- RMAN恢復之RMAN-06555處理
- RMAN-06207和RMAN-06208的處理
- Windows oracle 11g rman備份恢復到linux系統WindowsOracleLinux
- 【RMAN】在備庫執行rman備份時報錯RMAN-06820 ORA-17629
- Element package.json 中的 scripts 分析 —— "build:file"PackageJSONUI
- 也許你不知道的npm-scriptsNPM
- create-react-app 原始碼解析之react-scriptsReactAPP原始碼
- RMAN增量恢復
- RMAN備份概述
- oracle手工建庫後rman無法啟用(RMAN-04015)Oracle
- RMAN備份恢復典型案例——RMAN備份&系統變慢
- 【RMAN】Oracle11g透過rman升級到12cOracle
- 【DG】在Linux平臺上搭建單例項的dataguard--rman還原方式Linux單例
- RMAN備份進度
- rman 備份指令碼指令碼
- RMAN中的通道分配
- RMAN的備份原理
- RMAN修復壞塊
- RMAN-06214: Datafile Copy
- [20191122]RMAN-03999.txt