文件標題很長,容我慢慢道來。
在工作中有這么一個需求:
- AIX服務器作為數據庫備份機,/databak/expdp_dest 目錄下有最近一段時間的dmp文件。每個dmp文件使用時間命名,比如:expdp201412212300.dmp expdp201412222300.dmp等。
- 需要每天把最新的dmp文件拷貝到一臺PC上,做異地備份或恢復測試。
- 如果白天再手動做此事,一來每天做很麻煩,二來影響了服務器的性能。希望能在晚間系統空閑時間自動執行該操作。
如果直接用ftp命令來獲取,存在一定的麻煩:
- 無法獲取最新的文件名(通過shell可以獲取到最新的文件名,可是ftp中無法獲取shell變量的值)
- 也不能把所有文件都下載,因為數據量太大。
- 如果直接將dmp拷貝到某個特定目錄,然后再下載。無疑會占用更多的磁盤空間,同時也增加了操作時間。
通過一些思考和嘗試,實現了如下的操作辦法。較好解決了需求,實現了自動化,而且沒有增加其他的系統消耗。但步驟略微繁瑣,期待以后能找出更好的方法。
步驟:
- 在AIX創建link_dmp.sh,文件內容如下:
#!/usr/bin/sh
rm -rf /home/oracle/ftp/*
ln -s -f `ls -lt /databak/expdp_dest/*.dmp|awk 'NR==1'| awk '{print $9}'` /home/oracle/ftp/`ls -lt /databak/expdp_dest/*.dmp|awk 'NR==1'| awk '{print $9}'|awk '{spli
t($0,b,"/"); print b[4]}'`
主要是為了創建一個最新dmp的鏈接文件。
這樣,既可以在固定位置直接找到最新的dmp文件,又不會占用更多的磁盤空間。
其中
ls -lt /databak/expdp_dest/*.dmp|awk 'NR==1'| awk '{print $9}'
是將expdp_dest目錄下的dmp文件安裝日期排序,并通過awk取出最新的一個文件 名。這樣可以保證是最新的dmp文件。得到的結果形如: /databak/expdp_dest/201412232330.dmp
而后面的
ls -lt /databak/expdp_dest/*.dmp|awk 'NR==1'| awk '{print $9}'|awk '{split($0,b,"/"); print b[4]}'
則更進一步,將之前的/databak/expdp_dest/201412232330.dmp繼續用awk分解,最后只留下201412232330.dmp。
執行這個文件,則在/home/oracle/ftp下創建了一個鏈接文件,查詢結果如下
$ pwd
/home/oracle/ftp
$ ls -l
total 0
lrwxrwxrwx 1 oracle oinstall 44 Dec 25 14:44 expdp20141224_230000.dmp -> /databak/expdp_dest/expdp20141224_230000.dmp
- 在PC端創建autoftp.cfg文件
#192.168.3.10為服務器地址
#user1 用戶名
#password1 密碼
open 192.168.3.10
user1
password1
cd ftp
lcd G:\dmp_backup
bin
mget *.dmp
bye
- 在PC端創建autoftp.bat文件
ftp -s:autoftp.cfg
文件創建完畢。然后我們在AIX服務器上添加一個job,等待數據庫備份文件dmp備份完成后,執行link_dmp.sh。
在PC端創建job,在合適的時間調用autoftp.bat。
當autoftp.bat被調用,就會自動登錄到192.168.3.10,并將ftp目錄下的所有dmp文件下載到本地的G:\dmp_backup下。(默認autoftp.cfg和autoftp.bat在同一目錄下)。這樣,我們就完成了每次自動下載最新的文件到指定目錄的需求了。
本文的主要思路是創建一個完全同名的link文件,然后再用普通的ftp方法傳輸文件即可。靈活的使用Shell,是本方法的關鍵。