這個DB以前的老服務器上有一個shell,放在root用戶下,用來執行oracle的每週二自動全庫備份。linux
如今DB遷移了,換到新的服務器下,想用oracle用戶來完成這個操做,結果一開始測試的時候不成功,自動任務寫好沒法自動執行。shell
嘗試手動執行shell
[oracle@oradb2 ~]$ /ora_bak/dbbak/oracle_backup.sh
bash
發現能夠手動執行成功:
服務器
設置自動任務oracle
30 11 * * 3 /ora_bak/dbbak/oracle_backup.sh
由於昨天恰好是週三,因此自動任務測試的時候定義爲:每週三的11:30分測試
查看報錯
到了11點30分01秒的時候,這個cron開始執行,可是失敗了,從日誌中能夠看到以下信息:
spa
問題分析
從報錯上看,linux報出了一個找不到expdp命令的錯誤,可是咱們手動還能執行,這說明是否是shell裏寫的有些問題呢?日誌
咱們來看一下這個shell:code
#!/bin/sh rq=`date +"%Y%m%d"` expdp xxxxx/xxxxx directory=DUMP_DIR dumpfile=xxx_bak$rq.dmp logfile=xxx_bak$rq.log schemas=xxxx
能夠看到,很簡單的兩條命令而已,那爲啥自動執行不行呢?圖片
展開聯想
老的DB服務器上,用的root帳號執行,新的服務器上,用的oracle帳號執行。
這是一個比較明顯的區別,應該就是這裏有問題,再往下想一下,可能跟不一樣用戶的環境變量有關。
正是由於環境變量的關係,因此致使oracle用戶在執行cron的時候,找不到expdp這個命令,那麼爲何oracle找不到呢?答案是:shell裏沒指定環境變量。
問題解決
咱們修改一下shell:
#!/bin/sh . /etc/profile . ~/.bash_profile rq=`date +"%Y%m%d"` expdp xxxx/xxxx directory=DUMP_DIR dumpfile=xxx_bak$rq.dmp logfile=xxx_bak$rq.log schemas=xxx
此次就沒有報錯了,cron準時執行。