【问题标题】:installing Oracle Instantclient on Linux without setting environment variables?在 Linux 上安装 Oracle Instantclient 而不设置环境变量?
【发布时间】:2010-10-20 09:00:50
【问题描述】:

Oracle 的指令指定设置 LD_LIBRARY_PATH。这使得我的应用程序依赖于随机用户的配置,设置起来非常麻烦。

如何避免设置任何环境变量?

OS/X 相关说明:installing Oracle Instantclient on Mac OS/X without setting environment variables?

【问题讨论】:

    标签: linux oracle unix instantclient


    【解决方案1】:

    Oracle 的即时客户端安装说明指定用户设置 LD_LIBRARY_PATH。这对于多个用户来说管理起来非常麻烦。

    在不设置任何环境变量的情况下使用即时客户端:

    从 oracle.com 下载 Instantclient 发行版。对于进行非 Java 软件开发,您将需要(假设 Oracle 10.2):

    instantclient-basic-linux-x86_64-10.2.0.4.0.zip
    instantclient-sdk-linux-x86_64-10.2.0.4.0.zip
    instantclient-sqlplus-linux-x86_64-10.2.0.4.0.zip
    

    解压这三个文件。这会给你一个目录

    instantclient_10_2/
    

    将文件复制到 /usr,这是动态加载程序搜索的默认位置之一。

    sudo cp instantclient_10_2/sdk/include/*.h /usr/include
    sudo cp instantclient_10_2/sqlplus         /usr/bin
    sudo cp instantclient_10_2/*.so*           /usr/lib
    

    如果您使用 tnsnames.ora,请将其复制到 /etc,这是 oracle 运行时搜索的默认全局位置。

    sudo cp tnsnames.ora /etc
    

    测试

    /usr/bin/sqlplus scott/tiger@myoracle
    

    【讨论】:

    • 我不知道这是一个很好的做法,但它确实有效!
    • 这是一个非常糟糕的做法。考虑一下当您需要升级时必须做什么。
    • 到目前为止,我们的升级很简单……卸载旧版本的 InstantClient 并安装新版本的 InstantClient。我们的一个权衡是我们正在为一个拥有近 15,000 个内核的渲染农场提供服务,因此消除潜在的问题区域(例如错误设置的环境变量)对我们来说是一个巨大的胜利。当然是 YMMV。
    【解决方案2】:

    您当然可以将 sqlplus 重命名为 sqlplus.real 并制作一个包装脚本:

    #!/bin/sh
    
    if [ "$LD_LIBRARY_PATH" = "" ]
    then
            LD_LIBRARY_PATH=/what/ever
    else
            LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/what/ever
    fi
    
    export LD_LIBRARY_PATH
    
    exec sqlplus.real ${1+"$@"}
    

    【讨论】:

      【解决方案3】:

      将库路径添加到/etc/ld.so.conf,然后运行/sbin/ldconfig。您不需要为安装在标准位置(如/usr/lib)的库设置LD_LIBRARY_PATH,因为这些位置已在/etc/ld.so.conf 中配置。

      【讨论】:

      • 我在 etc 文件夹中没有 ld.so.conf,在 sbin 位置也没有 ldconfig。彻底击中!!我现在该怎么办!?
      【解决方案4】:

      对于任何使用 Solaris 的人(比如我!)来自 Linux 背景,我发现@David Phillips 解决方案使用 Solaris 命令 crle -u -l /opt/instantclient 效果很好

      感谢发帖http://chrismiles.info/systemsadmin/solaris/articles/ld-path-customisation-on-solaris/

      【讨论】:

        【解决方案5】:

        或者你可以尝试使用这个命令

        Linux

        sqlplus user/pass@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=port_number)))(CONNECT_DATA=(SID=sid)))'
        

        Windows

        sqlplus user/pass@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=port_number)))(CONNECT_DATA=(SID=sid)))"
        

        所以你不需要 tnsnames.ora

        【讨论】:

          【解决方案6】:

          Oracle 关于设置LD_LIBRARY_PATH 的说明并不理想。

          在 Linux 或 Solaris 等 ELF 平台上,实际上不需要设置 LD_LIBRARY_PATH,因为正确的库搜索路径(又名运行路径)可以在构建时写入二进制文件,相对于二进制。因此,使用此类二进制文件,运行时链接器始终能够找到打包的库,即使安装的子树被复制。

          不幸的是,Oracle 没有像这样创建 Linux 'Instant Client' 二进制文件。但是,可以使用patchelf 修复它们。

          例如:

          patchelf --set-rpath '$ORIGIN/..' /path/to/instantclient_11_2/sdk/proc
          patchelf --set-rpath '$ORIGIN'    /path/to/instantclient_11_2/sqlplus
          patchelf --set-rpath '$ORIGIN'    /path/to/instantclient_11_2/libclntsh.so.11.1
          

          在这些更改之后,运行时链接器能够在没有任何 LD_LIBRARY_PATH 环境变量的情况下找到所有需要的库。

          在 Solaris 上有 elfedit - 但 IIRC 至少一些适用于 Solaris 的 Oracle DB 软件包已经带有足够的运行路径。可以通过例如验证。 elfdump /path/to/sqlplus | grep PATH.

          有关elfeditLD_LIBRARY_PATH 的其他良好替代品(不涉及更改二进制文件本身)的更多详细信息,另请参阅我的文章LD_LIBRARY_PATH considered harmful

          【讨论】:

            猜你喜欢
            • 2010-10-15
            • 1970-01-01
            • 1970-01-01
            • 2015-02-14
            • 1970-01-01
            • 2022-11-20
            • 1970-01-01
            • 2021-06-09
            • 1970-01-01
            相关资源
            最近更新 更多