无法加载oracle.so

时间:2014-09-10 23:29:44

标签: oracle perl

我得到了这个例外:

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。还有其他可能导致此错误的内容吗?

2 个答案:

答案 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;
   }
}