Установить Oracle Instantclient в Linux без установки переменных среды?

В инструкциях Oracle указана настройка LD_LIBRARY_PATH. Это делает мое приложение зависимым от конфигурации случайных пользователей и очень проблематичным в настройке.

Как мне избежать необходимости устанавливать какие-либо переменные окружения?

Связанное примечание для OS/X: установка Oracle Instantclient в Mac OS/X без установки переменных среды?

6 ответов

Решение

В инструкциях Oracle по установке InstantClient указано, что пользователь установил LD_LIBRARY_PATH. Это очень хлопотно для нескольких пользователей.

Чтобы использовать InstantClient без установки каких-либо переменных среды:

Загрузите дистрибутив InstantClient от oracle.com. Для разработки не 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 являются неоптимальными.

На платформах ELF, таких как Linux или Solaris, нет необходимости устанавливать 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 переменная окружения.

На солярисе есть elfedit - но IIRC, по крайней мере, некоторые пакеты Oracle DB для Solaris уже имеют достаточный путь выполнения. Это можно проверить с помощью, например, 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)))'

Windows

sqlplus user/pass@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=port_number)))(CONNECT_DATA=(SID=sid)))"

так что вам не нужен tnsnames.ora

Для тех, кто играет с Solaris (как я!) Из Linux, я обнаружил, что решение @David Phillips хорошо работает с помощью команды Solaris crle -u -l /opt/instantclient

Благодаря посту http://chrismiles.info/systemsadmin/solaris/articles/ld-path-customisation-on-solaris/

Другие вопросы по тегам