5

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

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

OS/X 的相关说明:在 Mac OS/X 上安装 Oracle Instantclient 而不设置环境变量?

4

6 回答 6

8

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

要在不设置任何环境变量的情况下使用 Instantclient:

从 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
于 2009-04-19T05:19:28.290 回答
4

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

于 2009-05-28T20:00:19.053 回答
3

您当然可以将 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+"$@"}
于 2009-04-19T10:04:24.000 回答
2

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

有关(不涉及更改二进制文件本身)的更多详细信息elfedit和其他好的替代方案,另请参阅我的文章LD_LIBRARY_PATH 认为有害LD_LIBRARY_PATH

于 2016-07-26T21:26:58.727 回答
1

或者您可以尝试使用此命令

Linux

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

视窗

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

所以你不需要 tnsnames.ora

于 2011-05-04T10:23:28.923 回答
0

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

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

于 2010-03-16T02:41:09.660 回答