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
。
有关elfedit
和LD_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/