溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解數(shù)據(jù)泵與rman腳本

發(fā)布時間:2021-11-12 09:21:18 來源:億速云 閱讀:119 作者:柒染 欄目:關(guān)系型數(shù)據(jù)庫

如何理解數(shù)據(jù)泵與rman腳本,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

腳本主要邏輯:全庫備份讀取到的實例的數(shù)據(jù)庫,連同附屬功能性文件(spfile,controlfile控制文件,listener監(jiān)聽文件,密碼文件orapw[instance_name])壓縮后一并發(fā)送到遠程服務器上。

(PS:腳本正文中以#開頭一行為注釋,可直接拷貝以下代碼使用,不影響運行)

一.首先是數(shù)據(jù)泵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的環(huán)境變量,以便直接讀取使用該文件內(nèi)容所定義的有關(guān)變量

ORACLE_BIN_HOME=${ORACLE_HOME}/bin/
BACKUPTOOL_HOME=${ORACLE_BASE}/dba/OracleTools/
BACKUP_HOME=${BACKUPTOOL_HOME}DBbackup/

#定義相關(guān)變量指向工作目錄,ORACLE_BIN_HOME是oracle工具(sqlplus,rman,dbca,emctl等等)所在目錄;BACKUPTOOL_HOME是本腳本工具相關(guān)文件所在目錄,BACKUP_HOME是備份文件存放目錄,ORACLE_HOME和ORACLE_BASE是從.bash_profile文件中所讀取的環(huán)境變量,分別指oracle的家目錄和oracle的根目錄

echo "full backup job start at $(date +%Y-%m-%d_%T)" >> ${BACKUPTOOL_HOME}fullbackup.result

#在本地統(tǒng)計記錄以下備份工作開始時間到文件fullbackup.result,幫助確定定時任務所需時間

for instance_name in `cat ${BACKUPTOOL_HOME}instances_all`

#for循環(huán)讀取所有記錄在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賬號全庫導出該實例的數(shù)據(jù),使用的導出目錄為DATA_PUMP_DIR(可到后臺sqlplus環(huán)境下查詢具體對應的目錄,注意此處該系統(tǒng)目錄要真實存在),導出文件命名為選項”DUMPFILE=“之后名稱所定義,同理導出過程記錄日志在選項”LOG=“所定義,”FULL=y“意為全庫導出。注意此處@${instance_name}指的是當前實例的tnsname即實例解析名,具體要查看$ORACLE_HOME/network/admin/tnsname.ora下的設(shè)置
    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/'

#轉(zhuǎn)移上一步導出之后所得數(shù)據(jù)文件和日志文件到相應實例分類存放目錄
    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/

#拷貝數(shù)據(jù)庫用戶密碼存放文件和監(jiān)聽相關(guān)文件到分類目錄

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
#重新建立所有實例存放數(shù)據(jù)目錄,以備下次使用
/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腳本自動完成交互操作把數(shù)據(jù)庫備份所得壓縮包發(fā)送到遠程服務器172.16.3.73的系統(tǒng)目錄/opt/oracle72fullbackup/下,定義scp發(fā)送超時時間為10800秒即三個小時,超時自動終止,該時間可以結(jié)合腳本開頭和結(jié)尾所加時間統(tǒng)計功能確定
/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
#繼續(xù)使用expect腳本更改遠程服務器上數(shù)據(jù)備份目錄的權(quán)限所屬為oracle:oinstall,方便管理,由于上一步中scp使用的用戶是root故所發(fā)送文件權(quán)限也會被更改成root:root
rm -f ${BACKUP_HOME}full_*_systemExpdp.tar.gz

#導出數(shù)據(jù)壓縮包轉(zhuǎn)移完畢后刪除原文件,節(jié)省空間

echo "tlm,txmy's daily full backup job is done at $(date +%Y-%m-%d_%T)" >> ${BACKUPTOOL_HOME}dailyfullbackup.result

#寫入日志,在本地記錄執(zhí)行腳本結(jié)束時間

二.接著是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聲明和其他額外腳本說明補充,注意此處數(shù)據(jù)恢復路徑是在/opt/ora11g/dba/OracleTools/DBbackup/restoreDIR_daily目錄下的對應文件夾,下文有說明,由于是使用RMAN進行導入導出,所以導入導出目錄請盡量保持一致,具體可參考我之前的文章:利用rman針對同平臺下oracle的實例進行異機遷移。

source /home/oracle/.bash_profile

#導入/home/oracle/.bash_profile文件里的環(huán)境變量

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循環(huán)依次抽出記錄在instances_daily文件中需要操作的實例名稱并導入環(huán)境變量
    ${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目錄存放數(shù)據(jù)導出文件,controlfile目錄存放控制文件,相應地spfile目錄存放spfile,等到還原時也創(chuàng)建相同目錄擺放好各類數(shù)據(jù)文件以備恢復

    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/

#拷貝監(jiān)聽相關(guān)文件到listenerfile目錄下
    if [ ! -d "${BACKUP_HOME}tarfileDIR_daily/full/$instance_name" ];then
            mkdir -p ${BACKUP_HOME}tarfileDIR_daily/full/$instance_name;
    fi

#判斷壓縮包存放目錄是否存在,否則創(chuàng)建

        tar -zcPpf ${BACKUP_HOME}tarfileDIR_daily/full/${instance_name}/full_${instance_name}_$(date +%Y-%m-%d).tar.gz ${BACKUP_HOME}restoreDIR_daily/fullbackup

#打包當前實例所有備份導出文件,加-p參數(shù)是保持文件原來屬性,而-P參數(shù)是按照第二個變量中的路徑進行壓縮,解包出來之后也得到一個${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}

#由于上一步操作直接刪除整個目錄,所以重新創(chuàng)建各層級分類目錄以備下次循環(huán)使用

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

#記下源數(shù)據(jù)庫的根目錄到幫助文檔內(nèi)容

echo "Please extract the tar file with option -P , like tar -zxPf xxx.tar.gz" >> ${BACKUP_HOME}tarfileDIR_daily/full/readme.txt

#記錄解壓時注意使用-P參數(shù)到幫助文檔內(nèi)容

tar -zcPpf ${BACKUP_HOME}tarfileDIR_daily/full_all_$(date +%Y-%m-%d).tar.gz ${BACKUP_HOME}tarfileDIR_daily/full

#打包所有實例所導出數(shù)據(jù)的壓縮包,稍后一并發(fā)送到存放目的地

rm -rf ${BACKUP_HOME}tarfileDIR_daily/full

#刪除被打包文件節(jié)省空間
/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交互腳本發(fā)送上一步所打包的總壓縮包到172.16.3.73服務器上的/opt/oracle72fullbackup/tlmtxmy_daily目錄下,此處密碼為明文,超時時間為10800秒即3小時,這個值需要根據(jù)實際網(wǎng)絡帶寬情況和文件壓縮包大小作適當調(diào)整,單位為秒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

#文件發(fā)送完畢后刪除總壓縮包,節(jié)省空間

echo "tlm,txmy's daily full backup job is done at $(date +%Y-%m-%d_%T)" >> ${BACKUPTOOL_HOME}dailyfullbackup.result
#在本地的dailyfullbackup.result文件中記錄以上操作的結(jié)束時間,呼應開頭統(tǒng)計開始時間

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI