installing Oracle Instantclient on Linux without setting environment variables?

前端 未结 6 851
别那么骄傲
别那么骄傲 2021-02-10 01:37

Oracle\'s instructions specify setting LD_LIBRARY_PATH. This makes my application dependent on random users\' configuration and is very troublesome to set up.

How can I

相关标签:
6条回答
  • 2021-02-10 01:54

    Oracle's instructions regarding setting the LD_LIBRARY_PATH are suboptimal.

    On ELF platforms like Linux or Solaris there is really no need to require setting the LD_LIBRARY_PATH because the correct library search path (a.k.a. runpath) can be written into the binary, at build-time, relative to the location of the binary. Thus, with such binaries, the runtime linker is always able to find the packaged libraries, even if the installed subtree is copied around.

    Unfortunately, Oracle doesn't create the Linux 'Instant Client' binaries like that. But, it is possible to fix them with patchelf.

    For example:

    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
    

    After those changes the runtime linker is able to find all needed libraries without any LD_LIBRARY_PATH environment variable.

    On Solaris there is elfedit - but IIRC at least some Oracle DB packages for Solaris already come with a sufficient runpath. One can verify that via e.g. elfdump /path/to/sqlplus | grep PATH.

    For more details on elfedit and other good alternatives to LD_LIBRARY_PATH (that don't involve changing the binary itself) see also my article LD_LIBRARY_PATH considered harmful.

    0 讨论(0)
  • 2021-02-10 01:57

    You could of course rename sqlplus to sqlplus.real and make a wrapper script:

    #!/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+"$@"}
    
    0 讨论(0)
  • 2021-02-10 02:08

    Oracle's instantclient installation instructions specify that the user set LD_LIBRARY_PATH. This is very troublesome to manage for multiple users.

    To use the instantclient without setting any environment variables:

    Download the instantclient distribution from oracle.com. For doing non-java software development, you will need (assuming 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
    

    Unzip the three files. This will give you a directory

    instantclient_10_2/
    

    Copy the files to /usr, which is one of the default places the dynamic loader searches.

    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
    

    If you use tnsnames.ora, copy it to /etc, which is the default global place the oracle runtime searches.

    sudo cp tnsnames.ora /etc
    

    Test with

    /usr/bin/sqlplus scott/tiger@myoracle
    
    0 讨论(0)
  • 2021-02-10 02:10

    For anyone playing with Solaris (like me!) coming from a Linux background, I found that @David Phillips solution worked well using the Solaris command crle -u -l /opt/instantclient

    Thanks to post http://chrismiles.info/systemsadmin/solaris/articles/ld-path-customisation-on-solaris/

    0 讨论(0)
  • 2021-02-10 02:12

    Add the library path to /etc/ld.so.conf, then run /sbin/ldconfig. You don't need to set LD_LIBRARY_PATH for libraries installed in standard locations like /usr/lib because these locations are already configured in /etc/ld.so.conf.

    0 讨论(0)
  • 2021-02-10 02:12

    or you can try using this command

    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)))"
    

    so you don't need the tnsnames.ora

    0 讨论(0)
提交回复
热议问题