【发布时间】: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
Oracle 的指令指定设置 LD_LIBRARY_PATH。这使得我的应用程序依赖于随机用户的配置,设置起来非常麻烦。
如何避免设置任何环境变量?
OS/X 相关说明:installing Oracle Instantclient on Mac OS/X without setting environment variables?
【问题讨论】:
标签: linux oracle unix instantclient
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
【讨论】:
您当然可以将 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+"$@"}
【讨论】:
将库路径添加到/etc/ld.so.conf,然后运行/sbin/ldconfig。您不需要为安装在标准位置(如/usr/lib)的库设置LD_LIBRARY_PATH,因为这些位置已在/etc/ld.so.conf 中配置。
【讨论】:
对于任何使用 Solaris 的人(比如我!)来自 Linux 背景,我发现@David Phillips 解决方案使用 Solaris 命令 crle -u -l /opt/instantclient 效果很好
感谢发帖http://chrismiles.info/systemsadmin/solaris/articles/ld-path-customisation-on-solaris/
【讨论】:
或者你可以尝试使用这个命令
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
【讨论】:
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 considered harmful。
【讨论】: