Linux下調用crontab 操作Oracle數據庫

最近寫了一個oracle exp自動導出的腳本,單獨執行可以正常運行,放在crontab任務中就無法執行拉。

腳本1:setenv.sh

export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/10.2.0
export ORACLE_SID=db
export PATH=$ORACLE_HOME/bin:$PATH
export LANG=zh_CN
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

腳本2:orabak.sh

#!/bin/bash
/opt/oracle/setenv
bakname=`date +%Y%m%d`
cd /opt/oracle
mkdir -p /opt/oracle/orabak/$bakname
/opt/oracle/10.2.0/bin/exp wyg/wyg file=/opt/oracle/orabak/$bakname/$bakname.dmp log=/opt/oracle/orabak/$bakname/$bakname.log
tar -zcvf /opt/oracle/orabak/$bakname/$bakname.dmp.tgz /opt/oracle/orabak/$bakname/$bakname.dmp
rm -rf /opt/oracle/orabak/$bakname/$bakname.dmp

crontab定時任務設置:

46 20 * * * /opt/oracle/orabak.sh

實驗後的啓示:
1.orabak.sh這個腳本調用了setenv這個環境變量腳本,其實完全可以把setenv腳本中的環境變量寫在orabak.sh中,不必多此一 舉。
2.orabak.sh調用setenv,在crontab中只部分執行,腳本中exp那段沒有執行,應該和環境變量有很大的關係。把setenv中的環 境變量直接寫到orabak.sh腳本中,就沒有這個問題。

摘錄這個,解釋crontab環境變量的問題:

crontab是進行例行性工作常用的命令,比如系統備份,編寫一個備份 的shell腳本後,使用crontab定時執行這個備份腳本,就可實現自動備份了。將備份時間設置在三更半夜系統訪問量小的時候,既不會影響系統日常使 用,也不用派人盯着,第二天看一下郵件,檢查一下執行結果就好了。
   這裏就不描述如何使用crontab了,這些資料網上一大把,下面將我使用crontab曾經犯過的幾個錯誤和大家分享一下
1.使用普通變量

    crontab執行shell時只能識別爲數不多的系統環境變量,普通變量是無法識別的,如果在編寫的腳本中需要使用變量,需要使用export將變量聲 明爲環境變量,腳本才能正常執行。

2.使用相對路徑

   crontab執行shell時,是不會進入到shell腳本所在的路徑下執行的,如果shell裏含有相對路徑的話,會找不到路徑的,因此shell腳 本中都要使用絕對路徑。

3.權限設置錯誤


   權限問題永遠是linux需要注意的問題,一定要確保crontab的執行者(/etc/crontab文檔設置的第二項)有訪問shell腳本所在目錄 並且執行此shell的權限(可使用chomd和chown修改權限和所有者)。

3.crontab生效一定要在2分鐘以後,我在做實驗的時候圖快,每次修改了腳本以後,crontab都在一分鐘之內設置,導致crontab根本就不 起作用,切記!

4.感覺調用setenv這個方法不對,調用的setenv環境變量似乎是在子shell中執行的,所以當前有關oracle的命令在腳本中就無法正常執 行拉。crontab對環境變量的要求還是蠻高的。

5.crontab執行的腳本要寫絕對路徑,被執行的腳本內一定要配置好環境變量,也要用絕對路徑。不是必須,但要結合crontab使用,就必須這樣。

6.結論:當沒有把握做某個事情的時候,還是依照有把握的方法來做吧!不需要setenv腳本調用,直接把環境變量寫在orabak.sh腳本中,確保 crontab執行萬無一失!

我的最終可用稿

 

#!/bin/bash
/oracle/backup
bname=`date +%Y%m%d`
cd /oracle
mkdir -p /oracle/backup/db$bname
/oracle/product/11.1.0/db_1/bin/exp cms/cmsadmin owner=cms file=/oracle/backup/db$bname/db$bname.dmp
tar -zcvf /oracle/backup/db$bname/db$bname.dmp.tar.gz /oracle/backup/db$bname/db$bname.dmp
rm -rf /oracle/backup/db$bname/db$bname.dmp
find /oracle/backup -mtime +30 -exec rm -rf {} \;


轉自:http://www.net527.cn/shujukuguanli/Oracle/2010/0319/8097.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章