Установить 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/