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

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

我怎样才能避免设置任何环境variables?

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

Oracle的即时客户端安装说明指定用户设置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 

你当然可以将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配置。

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

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

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

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

不幸的是,Oracle不会像这样创建Linux的“即时客户端”二进制文件。 但是,可以用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 elfdump /path/to/sqlplus | grep PATH

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

对于任何使用Solaris的人来说,我发现@David Phillips解决方案使用Solaris命令crle -u -l /opt/instantclient

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