Oracle 的指令指定设置 LD_LIBRARY_PATH。这使得我的应用程序依赖于随机用户的配置,并且设置起来非常麻烦。
如何避免设置任何环境变量?
Oracle 的指令指定设置 LD_LIBRARY_PATH。这使得我的应用程序依赖于随机用户的配置,并且设置起来非常麻烦。
如何避免设置任何环境变量?
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
将库路径添加到/etc/ld.so.conf
,然后运行/sbin/ldconfig
. 您不需要LD_LIBRARY_PATH
为安装在标准位置的库进行设置,/usr/lib
因为这些位置已经在/etc/ld.so.conf
.
您当然可以将 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+"$@"}
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
或者您可以尝试使用此命令
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
对于来自 Linux 背景的任何使用 Solaris 的人(比如我!),我发现 @David Phillips 解决方案使用 Solaris 命令运行良好crle -u -l /opt/instantclient
感谢发帖http://chrismiles.info/systemsadmin/solaris/articles/ld-path-customisation-on-solaris/