在Linux上安装Oracle Instantclient而不设置环境变量?

时间:2009-04-19 05:16:35

标签: linux oracle unix instantclient

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

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

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

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

答案 2 :(得分: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+"$@"}

答案 3 :(得分: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

答案 4 :(得分:1)

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

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

不幸的是,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数据库软件包已经有足够的运行路径。可以通过例如验证elfdump /path/to/sqlplus | grep PATH

有关elfedit以及LD_LIBRARY_PATH的其他优秀替代方案(不涉及更改二进制文件本身)的详细信息,请参阅我的文章LD_LIBRARY_PATH considered harmful

答案 5 :(得分:0)

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

运行良好

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