共計 7087 個字符,預計需要花費 18 分鐘才能閱讀完成。
如何理解數據泵與 rman 腳本,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
腳本主要邏輯:全庫備份讀取到的實例的數據庫,連同附屬功能性文件(spfile,controlfile 控制文件,listener 監聽文件,密碼文件 orapw[instance_name])壓縮后一并發送到遠程服務器上。
(PS:腳本正文中以 #開頭一行為注釋,可直接拷貝以下代碼使用,不影響運行)
一. 首先是數據泵 expdp/impdp 全庫備份的:
#!/bin/bash
#backup oracle instances full databases with datapump(expdp)
#oracleDB_fullbackup_expdp.sh
#DATA_PUMP_DIR=/opt/ora11g/admin/${instance_name}/dpdump/
#created by dc at 2015-12-08
source /home/oracle/.bash_profile
# 讀取用戶 oracle 的環境變量,以便直接讀取使用該文件內容所定義的有關變量
ORACLE_BIN_HOME=${ORACLE_HOME}/bin/
BACKUPTOOL_HOME=${ORACLE_BASE}/dba/OracleTools/
BACKUP_HOME=${BACKUPTOOL_HOME}DBbackup/
# 定義相關變量指向工作目錄,ORACLE_BIN_HOME 是 oracle 工具(sqlplus,rman,dbca,emctl 等等)所在目錄;BACKUPTOOL_HOME 是本腳本工具相關文件所在目錄,BACKUP_HOME 是備份文件存放目錄,ORACLE_HOME 和 ORACLE_BASE 是從.bash_profile 文件中所讀取的環境變量,分別指 oracle 的家目錄和 oracle 的根目錄
echo full backup job start at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}fullbackup.result
# 在本地統計記錄以下備份工作開始時間到文件 fullbackup.result,幫助確定定時任務所需時間
for instance_name in `cat ${BACKUPTOOL_HOME}instances_all`
#for 循環讀取所有記錄在 instances_all 文件里的實例名進行以下操作
do
DATA_PUMP_DIR=${ORACLE_BASE} /admin/ ${instance_name} /dpdump/
# 定義變量 DATA_PUMP_DIR 存放導出文件路徑
expdp system/password@${instance_name} DIRECTORY=DATA_PUMP_DIR DUMPFILE=full_${instance_name}_$(date +%Y-%m-%d)_systemExpdp.dmp LOG=full_${instance_name}_$(date +%Y-%m-%d)_systemExpdp.log FULL=y;
# 使用 system 賬號全庫導出該實例的數據,使用的導出目錄為 DATA_PUMP_DIR(可到后臺 sqlplus 環境下查詢具體對應的目錄,注意此處該系統目錄要真實存在),導出文件命名為選項”DUMPFILE=“之后名稱所定義,同理導出過程記錄日志在選項”LOG=“所定義,”FULL=y“意為全庫導出。注意此處 @${instance_name} 指的是當前實例的 tnsname 即實例解析名,具體要查看 $ORACLE_HOME/network/admin/tnsname.ora 下的設置
mv ${DATA_PUMP_DIR} full_ ${instance_name}*.dmp ${BACKUP_HOME} tarfileDIR/ ${instance_name} /datafile/
mv ${DATA_PUMP_DIR} full_ ${instance_name}*.log ${BACKUP_HOME} tarfileDIR/ ${instance_name} /datafile/
# 轉移上一步導出之后所得數據文件和日志文件到相應實例分類存放目錄
cp ${ORACLE_HOME} /dbs/orapw ${instance_name} ${BACKUP_HOME} tarfileDIR/ ${instance_name} /passwdfile/
cp ${ORACLE_HOME}/network/admin/{listener.ora,tnsnames.ora,sqlnet.ora} ${BACKUP_HOME} tarfileDIR/ ${instance_name}/listenerfile/
# 拷貝數據庫用戶密碼存放文件和監聽相關文件到分類目錄
done
cd ${BACKUP_HOME}
tar -zcpf full_$(date +%Y-%m-%d)_systemExpdp.tar.gz tarfileDIR
# 所有實例導出完畢后壓縮打包
rm -rf ${BACKUP_HOME}tarfileDIR
# 刪除已被打包的原文件以備下次備份使用
for instance_name in `cat ${BACKUPTOOL_HOME}instances_all`
do
mkdir -p ${BACKUP_HOME}tarfileDIR/${instance_name}/{datafile,listenerfile,passwdfile}
done
# 重新建立所有實例存放數據目錄,以備下次使用
/usr/bin/expect EOF
spawn bash -c scp -P77 ${BACKUP_HOME}full_*_systemExpdp.tar.gz root@172.16.3.73:/opt/oracle72fullbackup/
expect password:
send @7043005ec611857\r
set timeout 10800
expect eof
EOF
# 插入使用 expect 腳本自動完成交互操作把數據庫備份所得壓縮包發送到遠程服務器 172.16.3.73 的系統目錄 /opt/oracle72fullbackup/ 下,定義 scp 發送超時時間為 10800 秒即三個小時,超時自動終止,該時間可以結合腳本開頭和結尾所加時間統計功能確定
/usr/bin/expect EOF
spawn bash -c ssh -p77 root@172.16.3.73
expect password:
send @7043005ec611857\r
expect ]#
send chown -R oracle:oinstall /opt/oracle72fullbackup\r
expect ]#
send exit\r
expect eof
EOF
# 繼續使用 expect 腳本更改遠程服務器上數據備份目錄的權限所屬為 oracle:oinstall,方便管理,由于上一步中 scp 使用的用戶是 root 故所發送文件權限也會被更改成 root:root
rm -f ${BACKUP_HOME}full_*_systemExpdp.tar.gz
# 導出數據壓縮包轉移完畢后刪除原文件,節省空間
echo tlm,txmy s daily full backup job is done at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}dailyfullbackup.result
# 寫入日志,在本地記錄執行腳本結束時間
二. 接著是 RMAN 全庫備份腳本:
#!/bin/bash
#full backup oracle instances databases with RMAN
#oracleDB_fullbackup_rman.sh
#recovery directory is /opt/ora11g/dba/OracleTools/DBbackup/restoreDIR_daily/ ,it concerns about your backup level,put the DB backup tar file into the destination server s same directory then extracts it when you need to recover the database
#created by dc at 2015-12-08
# 腳本解釋器 /bin/bash 聲明和其他額外腳本說明補充,注意此處數據恢復路徑是在 /opt/ora11g/dba/OracleTools/DBbackup/restoreDIR_daily 目錄下的對應文件夾,下文有說明,由于是使用 RMAN 進行導入導出,所以導入導出目錄請盡量保持一致,具體可參考我之前的文章:利用 rman 針對同平臺下 oracle 的實例進行異機遷移。
source /home/oracle/.bash_profile
# 導入 /home/oracle/.bash_profile 文件里的環境變量
ORACLE_BIN_HOME=${ORACLE_HOME}/bin/
BACKUPTOOL_HOME=${ORACLE_BASE}/dba/OracleTools/
BACKUP_HOME=${BACKUPTOOL_HOME}DBbackup/
# 定義 oracle 自帶工具所在目錄變量 $ORACLE_BIN_HOME,備份腳本工具目錄 $BACKUPTOOL_HOME 和備份導出文件存放目錄 $BACKUP_HOME
echo tlm,txmy s daily full backup job start at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}dailyfullbackup.result
# 記錄以下腳本操作開始時間到 dailyfullbackup.result
for instance_name in `cat ${BACKUPTOOL_HOME}instances_daily`
do
export ORACLE_SID=$instance_name
# 使用 for 循環依次抽出記錄在 instances_daily 文件中需要操作的實例名稱并導入環境變量
${ORACLE_BIN_HOME} rman target / EOF
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup full tag dbfull format ${BACKUP_HOME}restoreDIR_daily/fullbackup/datafile/dbfull%u_%s_%p database plus archivelog delete all input;
backup current controlfile format ${BACKUP_HOME}restoreDIR_daily/fullbackup/controlfile/control.bak
backup spfile format ${BACKUP_HOME}restoreDIR_daily/fullbackup/spfile/spfile.bak
release channel c1;
release channel c2;
release channel c3;
}
quit;
EOF
#RMAN 全庫備份段,datafile 目錄存放數據導出文件,controlfile 目錄存放控制文件,相應地 spfile 目錄存放 spfile,等到還原時也創建相同目錄擺放好各類數據文件以備恢復
cp ${ORACLE_HOME}/dbs/orapw${instance_name} ${BACKUP_HOME}restoreDIR_daily/fullbackup/passwdfile/
# 拷貝當前實例的的密碼文件到 passwdfile 目錄下
cp ${ORACLE_HOME}/network/admin/{listener.ora,tnsnames.ora,sqlnet.ora} ${BACKUP_HOME}restoreDIR_daily/fullbackup/listenerfile/
# 拷貝監聽相關文件到 listenerfile 目錄下
if [! -d ${BACKUP_HOME}tarfileDIR_daily/full/$instance_name ];then
mkdir -p ${BACKUP_HOME}tarfileDIR_daily/full/$instance_name;
fi
# 判斷壓縮包存放目錄是否存在,否則創建
tar -zcPpf ${BACKUP_HOME}tarfileDIR_daily/full/${instance_name}/full_${instance_name}_$(date +%Y-%m-%d).tar.gz ${BACKUP_HOME}restoreDIR_daily/fullbackup
# 打包當前實例所有備份導出文件,加 - p 參數是保持文件原來屬性,而 - P 參數是按照第二個變量中的路徑進行壓縮,解包出來之后也得到一個 ${BACKUP_HOME}restoreDIR_daily/fullbackup 的多重目錄,這個在解包時需要注意當前目錄,- P 的具體效果可以參考幫助文檔
rm -rf ${BACKUP_HOME}restoreDIR_daily/fullbackup/*
# 打包完畢后刪除當前導出文件
mkdir -p ${BACKUP_HOME}restoreDIR_daily/fullbackup/{controlfile,datafile,passwdfile,spfile,listenerfile}
# 由于上一步操作直接刪除整個目錄,所以重新創建各層級分類目錄以備下次循環使用
done
echo The DB restore directory is ${BACKUP_HOME}restoreDIR_daily/fullbackup/ ${BACKUP_HOME}tarfileDIR_daily/full/readme.txt
# 記下 rman 所使用的還原路徑到幫助文檔 readme.txt
echo The DB base directory is ${ORACLE_BASE} ${BACKUP_HOME}tarfileDIR_daily/full/readme.txt
# 記下源數據庫的根目錄到幫助文檔內容
echo Please extract the tar file with option -P , like tar -zxPf xxx.tar.gz ${BACKUP_HOME}tarfileDIR_daily/full/readme.txt
# 記錄解壓時注意使用 - P 參數到幫助文檔內容
tar -zcPpf ${BACKUP_HOME}tarfileDIR_daily/full_all_$(date +%Y-%m-%d).tar.gz ${BACKUP_HOME}tarfileDIR_daily/full
# 打包所有實例所導出數據的壓縮包,稍后一并發送到存放目的地
rm -rf ${BACKUP_HOME}tarfileDIR_daily/full
# 刪除被打包文件節省空間
/usr/bin/expect EOF
spawn bash -c scp -P77 ${BACKUP_HOME}tarfileDIR_daily/full_*.tar.gz root@172.16.3.73:/opt/oracle72fullbackup/tlmtxmy_daily/
expect password:
send @7043005ec611857\r
expect ]$
set timeout 10800
expect eof
EOF
# 使用 expect 交互腳本發送上一步所打包的總壓縮包到 172.16.3.73 服務器上的 /opt/oracle72fullbackup/tlmtxmy_daily 目錄下,此處密碼為明文,超時時間為 10800 秒即 3 小時,這個值需要根據實際網絡帶寬情況和文件壓縮包大小作適當調整,單位為秒 s
/usr/bin/expect EOF
spawn bash -c ssh -p77 root@172.16.3.73
expect password:
send @7043005ec611857\r
expect ]#
send chown -R oracle:oinstall /opt/oracle72fullbackup\r
expect ]#
send exit\r
expect eof
EOF
# 同樣地,改變 /opt/oracle72fullbackup 目錄擁有者為 oracle,群組為 oinstall
rm -f ${BACKUP_HOME}tarfileDIR_daily/full_*.tar.gz
# 文件發送完畢后刪除總壓縮包,節省空間
echo tlm,txmy s daily full backup job is done at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}dailyfullbackup.result
# 在本地的 dailyfullbackup.result 文件中記錄以上操作的結束時間,呼應開頭統計開始時間
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注丸趣 TV 行業資訊頻道,感謝您對丸趣 TV 的支持。