1. Создается каталог для развертывания библиотек внешних процедур (например, /u/tools). Если создается отдельный пользователь для администрирования библиотек (см. п. 2), то в качестве каталога развертывания можно использовать его домашний каталог.
2. По соображениям безопасности и разделения функций администрирования, желательно завести отдельного пользователя для администрирования поддержки библиотек внешних процедур в Oracle. Если это не критично, то можно администрировать и под пользователем oracle.
3. Настраивается listener на сервере для инициализации поддержки внешних процедур. Для этого добавляются согласованные записи следующего вида (согласованы должны быть KEY и SID):
в listener.ora:
Код:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u/app/oracle/product/10.2.0)
(ENVS = "EXTPROC_DLLS=ANY")
# (PROGRAM = extproc32)
(PROGRAM = extproc)
)
)
Параметру PROGRAM, задающему имя исполняемого модуля агента внешних процедур (по умолчанию extproc), может быть указано значение extproc32, если требуется использовать 32-битные версии библиотек для 64-битной версии Oracle. Параметр ENVS задает переменные окружения для процесса, в котором выполняются внешние процедуры, переменная окружения EXTRPROC_DLLS задает список допустимых библиотек для запуска (значение ANY означает допустимость запуска любых библиотек), если этот параметр не будет задан, то выполнение внешних библиотек будет блокировано.
Для работы через внешние процедуры рекомендуется создать специального пользователя (не oracle, см.п.2), чтобы обеспечить дополнительную защиту файлов oracle от случайного изменения через внешние библиотеки. В этом случае для него нужно создать отдельный файл для запуска listener-a с другим наименованием сервиса вместо LISTENER, чтобы он не пересекался с именем стандартного сервиса, который запускается из-под oracle, например:
Код:
EXTLIST =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)
SID_LIST_EXTLIST =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u/app/oracle/product/10.2.0)
(ENVS = "EXTPROC_DLLS=ANY")
# (PROGRAM = extproc32)
(PROGRAM = extproc)
)
)
После этого нужно настроить этого пользователя, чтобы он мог запускать свой сервис listener-а, т.е. ему нужно выставить переменные окружения ORACLE_HOME, ORACLE_SID, NLS_LANG (следует указать кодировку базы для получения адекватных текстовых сообщений, - если внешняя библиотека использует OCI-интерфейсы, например, библиотека lock_info), TNS_ADMIN (каталог файлов настроек listener.ora, sqlnet.ora,tnsnames.ora) и дать ему возможность запускать lsnrctl, т.е. он должен уметь запустить сервис:
Код:
$ORACLE_HOME/bin/lsnrctl start extlist
и остановить его:
Код:
$ORACLE_HOME/bin/lsnrctl stop extlist
В tnsnames.ora должна быть запись вида (как для пользователя oracle, так и для пользователя, под которым администрируется listener для extproc, - в каталогах TNS_ADMIN для этих пользователей):
Код:
EXTPROC_CONNECTION_DATA.FTC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
)
)
с соответствующими значениями KEY и SID, которые прописаны в настройках listener-а.
4. Если устанавливаемые библиотеки имеют зависимости (описанные в файле readme.txt из подкаталога соответствующей библиотеки), то необходимо сконфигурировать окружение запуска агента внешних процедур extproc, чтобы он мог их подгрузить после загрузки основной библиотеки.
Этого можно добиться одним из следующих способов:
а) Положить зависимые библиотеки в системную папку runtime библиотек, например, в /usr/lib.
б) Перезапустить listener для extproc, предварительно выставив переменную окружения загрузки разделяемых библиотек для соответствующей платформы, для большинства платформ - это
LD_LIBRARY_PATH (для HPUX PA32 - SHLIB_PATH, для AIX - LIBPATH, для 64-битного Solaris - LD_LIBRARY_PATH_64), например:
Код:
export LD_LIBRARY_PATH=/u/tools/mylib:$LD_LIBRARY_PATH
Команду инициализации этой переменной можно добавить в файл .profile или .bashrc пользователя, под которым администрируются библиотеки внешних процедур.
в) Перезапустить listener для extproc, добавив установку переменной окружения загрузки разделяемых библиотек, например, LD_LIBRARY_PATH в параметр ENVS настроек listener-а:
Код:
EXTLIST =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)
SID_LIST_EXTLIST =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u/app/oracle/product/9.2.0)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ANY,LD_LIBRARY_PATH=/u/tools/mylib:$LD_LIBRARY_PATH")
)
)