2010-06-25 35 views
2

您好我在我的腳本中使用DBD :: Oracle來查詢到oracle數據庫。當我運行此腳本其工作正常,但是當我計劃從cron運行此其得到下述錯誤dbi ::從cron運行時出現Oracle錯誤

install_driver(Oracle) failed: Can't load '/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libnnz10.so: cannot open shared object file: No such file or directory at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/DynaLoader.pm line 230. 
at (eval 3) line 3 
Compilation failed in require at (eval 3) line 3. 
Perhaps a required shared library or dll isn't installed where expected 
at /scripts/db/dbquery.pl line 50 

50號線:

my $dbh = DBI->connect("dbi:Oracle:$tns","$dbuser","$dbpass"); 

請建議,如何解決這個問題。

+0

Perl的5.8.5?如果可能的話,你應該考慮升級。 – Ether 2010-06-25 16:24:26

+0

您不需要在'DBI-> connect()'中引用'$ dbuser'和'$ dbpass'參數 - 它們可能已經是字符串,並且在需要時會這樣。 – pilcrow 2010-06-25 18:16:45

回答

2

聽起來像所需的Oracle環境變量尚未設置爲cron(re:ysth評論amphetamachine答案)。

看看這個answer to SO question: How can I use a database server from a Perl CGI script?的一些指導。

幫助,看看甲骨文ENV變量在您登錄配置文件已設置:

env | grep -i oracle 

幾乎所有你看到這裏應該設置爲$ ENV {}在您的Perl腳本,或者根據變量cron的版本,你正在運行它也可以添加到您的crontab文件:

ORACLE_HOME=/home/oracle/product/10.x.x 
* * * * * /path/to/your/script.pl 

/I3az/

+0

+ 1'cron'執行環境*相當*貧窮,這對習慣於交互式會話的完全加載環境的人來說是一個驚喜。 – pilcrow 2010-06-25 18:14:27

0

看起來您可能需要安裝Oracle client libraries才能正常工作。需要由模塊動態加載的libnnz10.so顯然是安裝的一部分。

值得注意的是,Oracle是專有的,而不是GPL兼容的,因此幾乎沒有Linux發行版將通過它的存儲庫提供它。這意味着您可能需要自己安裝。

編輯:確保LD_CONFIG_PATH指向庫所在的目錄。

或者,您也可以在/etc/ld.so.conf之後附加一行,指向Oracle客戶端庫的路徑。

+3

如果它是從命令行運行的,但是從cron失敗,則該庫必須已經安裝,但可能需要一些環境變量才能使它在正確的位置顯示。 – ysth 2010-06-25 07:17:38

+0

@ysth:是的lib已經安裝。你能幫忙設置env變量嗎? – Space 2010-06-25 07:21:57

+0

空間,您首先必須弄清楚Oracle需要哪些變量,閱讀文檔,並比較shell中以及從cron運行時'/ usr/bin/env'的輸出。 – daxim 2010-06-25 10:22:24