天天看點

oracle用expdp方式備份腳本

需求:備份oracle資料庫并将資料備份的檔案上傳到ftp所在伺服器

ftp伺服器IP位址:192.168.6.9

ftp伺服器賬戶/密碼:test/test2018

1、oracle使用者建立備份腳本路徑:

#su - oracle
$ mkdir /u0/app/backup/bin
$ cd /u01/app/backup/bin           
$ vi /u01/app/backup/bin/bak.sh
#!/bin/sh
#自己指定環境變量(适合多執行個體的資料庫)
export ORACLE_SID=orcl
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH:/sbin/
expot LANG=zh_CN.UTF-8
export NLS_LANG='AMERICAN_AMERICA.AL32UTF8'

#或使用oracle原先.bash_profile檔案裡環境變量
source /home/oracle/.bash_profile

#上面環境變量二選一即可
timedate=$(date +%Y%m%d%H%M%S)
bakdbname=hb
bakdbpasswd=h1234
dumpbame=hd
bakdbhome=/u01/app/backup
expdp $bakdbname/$bakdbpasswd directory=backDir dumpfile=$dumpbame-$timedate.dmp logfile=$bakdbname-$timedate.log
#方法一、壓縮dmp檔案,會連接配接bakdbhome變量的目錄及檔案一并壓縮
zip -r $bakdbhome/$dumpbame-$timedate.zip $bakdbhome/$dumpbame-$timedate.dmp $bakdbhome/$bakdbname-$timedate.log      #壓縮dmp檔案及日志檔案
#或用方法二
#若是不加項目路徑目錄名就切換到存放dmp檔案的目錄進行壓縮即可
cd $bakdbhome
zip -r $dumpbame-$timedate.zip $dumpbame-$timedate.dmp $bakdbname-$timedate.log

find $bakdbhome/*.log -mtime +10 -exec rm -rf {} \;
find $bakdbhome/*.zip -mtime +10 -exec rm -rf {} \;
find $bakdbhome/*.dmp -exec rm -rf {} \;  #前面壓縮後,删除原dmp檔案

cd $bakdbhome   #切換到備份檔案目錄下(這裡如果用的方法二的就不在需要在切換目錄的了)
ftp -v -n 192.168.6.9  << EOF       #執行ftp指令
或
ftp -v -n 192.168.6.9 >>${bakdbname}_${timedate}.log << EOF
将ftp上傳日志資訊一起追加到備份日志裡面

user test test2018           #使用者名和密碼
binary                     #切換傳輸模式為二進制模式,以位元組傳輸(除文字檔案外皆用此模式)
hash                       #切換#字号的出現,每一個#字号表示傳送了1024/8192BYTES
put $dumpbame-$timedate.zip $dumpbame-$timedate.zip
bye
EOF

#将日志檔案的GB2312轉為UTF-8編碼,這樣腳本執行的log日志檔案中文不會亂碼
iconv -f gb2312  -t utf8 $bakdbname-$timedate.log  -o $bakdbname-$timedate.log
           
#!/bin/sh
source /home/oracle/.bash_profile
timedate=$(date +%Y%m%d%H%M%S)
bakdbname=re
bakdbpasswd=123
dumpdbname=re
bakdbhome=/u01/databack
expdp $bakdbname/$bakdbpasswd directory=backDir dumpfile=$dumpdbname'_'$timedate.dmp logfile=$dumpdbname'_'$timedate.log
cd /u01
zip -r databack/$dumpdbname'_'$timedate.zip databack/$dumpdbname'_'$timedate.dmp databack/$dumpdbname'_'$timedate.log
find $bakdbhome/*.log -mtime +10 -exec rm -rf {} \;
find $bakdbhome/*.zip -mtime +10 -exec rm -rf {} \;
find $bakdbhome/*.dmp -exec rm -rf {} \;

cd $bakdbhome
ftp -v -n 192.168.6.9 >>${dumpdbname}_${timedate}.log << EOF
user test test2018
binary
hash
put ${dumpdbname}_${timedate}.zip ${dumpdbname}_${timedate}.zip
bye
EOF

#iconv -f gb2312  -t utf8 ${bakdbname}_${timedate}.log  -o ${bakdbname}_${timedate}.log           
FTP的指令行格式為: 
ftp -v -d -i -n -g [主機名] ,其中 
-v 顯示遠端伺服器的所有響應資訊; 
-n 限制ftp的自動登入,即不使用;
hash:每傳輸1024位元組,顯示一個hash符号(#);
.n etrc檔案; 
-d 使用調試方式; 
-g 取消全局檔案名;
bye:退出ftp會話過程;
get下傳檔案;
mget批量下傳檔案,需配合萬用字元,例如:MGET*.GZ;
put上傳檔案;
mput批量上傳檔案,需配合萬用字元;
recv相當于GET(RECV為RECEIVE的簡寫):
send相當于PUT。           
$ crontab -l
10 0 * * * /bin/bash /u01/app/backup/bin/bak.sh