您好,登錄后才能下訂單哦!
如何理解數據泵與rman腳本,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
腳本主要邏輯:全庫備份讀取到的實例的數據庫,連同附屬功能性文件(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文件中記錄以上操作的結束時間,呼應開頭統計開始時間
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。