【问题标题】:Error querying Oracle database from CGI Perl script从 CGI Perl 脚本查询 Oracle 数据库时出错
【发布时间】:2023-12-04 08:26:01
【问题描述】:

我有一个 CGI Perl 脚本,它将从 Oracle 数据库运行一条 select 语句来获取记录。此脚本在 Apache 上运行,并链接了 cgi-bin。它运行良好。

由于故障转移,我们将硬盘移至具有类似设置的备份服务器。但是,当我们运行脚本时,会显示以下错误:

install_driver(Oracle) failed: Can't load '/u02/system/perl/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /u02/system/perl/usr/lib64/perl5/DynaLoader.pm line 200.

我检查了我的 ORACLE_HOMELD_LIBRARY_PATH 变量,它们都指向正确的 oracle 客户端。也尝试locate libclntsh.so.11.1 并设法在正确的目录中找到该文件,并授予权限。

还添加了一个oracle.conf 文件,该文件具有/etc/ld.so.conf.d 中oracle lib 目录的路径

所有这些,但仍然显示相同的错误。我的想法已经不多了......

感谢任何指针或建议。谢谢。

【问题讨论】:

    标签: oracle apache perl cgi dbd


    【解决方案1】:

    您已经介绍了很好的基础知识:确保库存在,确保您的程序具有读取/执行权限,并为 ORACLE_HOME 和 LD_LIBRARY_PATH 设置环境变量。

    很多人需要递归检查依赖关系。

    ldd /u02/system/perl/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so
    

    应该向您显示无法加载的 .so 的任何依赖项。 DBD::Oracle 对 Oracle 客户端也是版本敏感的。如果 Oracle 客户端的版本或位置发生了变化(或者其他方法都失败了),您可能需要重新编译 DBD::Oracle。

    【讨论】:

    • 谢谢。似乎问题是在将oracle.conf 添加到 ldd 路径后,我需要执行ldconfig 命令来刷新它。您运行ldd 的提示提供了洞察力,谢谢。