我得到了这个例外:
Can't load '/usr/perl/lib/site_perl/5.8/x86_64-linux/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.8.0: cannot open shared object file:
No such file or directory at
/.../perl/lib/5.8/x86_64-linux/DynaLoader.pm line 169
如果我执行ls -ltr /.../perl/lib/site_perl/5.8/x86_64-linux/auto/DBD/Oracle/Oracle.so我看到该文件在那里。我正在运行的进程在尝试连接之前也设置了LD_LIBRARY_PATH。在另一台机器上构建和部署不会产生相同的错误并且运行正常。运行uname -sm会在两台机器上运行Linux x86_64。还有其他可能导致此错误的内容吗?
答案 0 :(得分:2)
看起来DBD::Oracle
Oracle.so
正试图打开libclntsh.so.8.0
但无法找到它。因此,您需要确定是否安装了该版本的共享库。
执行以下命令:
$ locate libclntsh.so
您应该获得以libclntsh.so
开头的文件列表。如果幸运的话,libclntsh.so.8.0
将成为结果中的一部分,然后您需要确保它所在的目录位于您的加载路径中。例如,我的服务器有:
$ locate libclntsh.so
/home/oracle/11.2/lib/libclntsh.so
/home/oracle/11.2/lib/libclntsh.so.10.1
/home/oracle/11.2/lib/libclntsh.so.11.1
如果locate
完全失败,您可以使用updatedb
构建数据库,也可以尝试使用find
:
find / -name 'libclntsh.so*' -print
使用寻呼机或将stderr重定向到文件,因为你最终可能会处理来自find
的大量错误消息,这没关系,但使用less会让你只需刷新屏幕即可看到{{ 1}}的输出。
答案 1 :(得分:2)
另一种解决方案:
在运行任何脚本之前,只需传递Oracle路径变量:
与perl一样,您可以在脚本开头添加以下内容:
BEGIN {
my $ORACLE_HOME = "/usr/lib/oracle/11.2/client64";
my $LD_LIBRARY_PATH = "$ORACLE_HOME/lib";
if ($ENV{ORACLE_HOME} ne $ORACLE_HOME
|| $ENV{LD_LIBRARY_PATH} ne $LD_LIBRARY_PATH
) {
$ENV{ORACLE_HOME} = "/usr/lib/oracle/11.2/client64";
$ENV{LD_LIBRARY_PATH} = "$ORACLE_HOME/lib";
exec { $^X } $^X, $0, @ARGV;
}
}