2010-06-25 77 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

相关问题