пятница, 17 января 2014 г.

ORA-27369: job of type EXECUTABLE failed with exit code: Not owner

Каждый, кто хотя бы раз настраивал в качестве задания для DBMS_SCHEDULER внешний исполняемый скрипт, наверняка сталкивался так или иначе с данной ошибкой.

Я хочу сразу же напомнить, что Оракл, вообще говоря, славится неинформативностью своих ошибок, что осложняет troubleshooting и превращает его в увлекательный квест "Угадай, что".

Конкретно по поводу данной ошибки - самое внятное, что мне удалось разыскать после примерно полудня неистового гугления - было вот это.

Где-то на третьей странице данной портянки удалось найти ключевое предложение, суть которого следующая: эта ошибка может означать что угодно.

Нет нужных прав на скрипт - not owner. Неправильно написан скрипт (скажем, команда без абсолютного пути) - not owner. Поломалась инсталляция Оракла - not owner. Неправильная конфигурация - not owner. Oracle must die.

Дело, собственно говоря, простое. Поскольку данная ошибка возникает при выполнении внешнего задания, она ОБЫЧНО (не всегда!) сопровождается ошибкой операционной системы, которая, в свою очередь, внятно объясняет причины возникновения проблемы. Ну, обычно объясняет.

В моем случае данная ошибка ничем больше НЕ СОПРОВОЖДАЛАСЬ. Ни файл трассировки ничего не содержал, ни alert.log. Ни, разумеется, журнал задания.

Задание, между тем, тупо не выполнялось. Нет, сам скрипт из консоли прекрасно отрабатывал. Но вот планировщиком - никак и ни при каких обстоятельствах.

Я не буду мучить дитю и перескажу простым русским то, что удалось выяснить после каторжных интеллектуальных трудов.

Итак, Oracle 10.2.0.4.

Первое. Пользователь и группа ОС, от которой выполняются внешние задания, находится в данной версии в $ORACLE_HOME/rdbms/admin/externaljob.ora. Владельцем которого является root (не вздумайте менять) и группа dba. По умолчанию там стоит nobody/nobody, чего в ряде случаев категорически недостаточно. Я поменял на oracle/dba. Такие же права владения и группа должны быть на исполняемом скрипте. Который, вообще говоря, может валяться где угодно, важно лишь при создании задания указать к нему полный абсолютный путь (Оракл чхать хотел на переменные среды ОС по соображениям безопасности).

Второе. Скрипт должен быть написан по определенным правилам. При вызове скрипта от имени пользователя, определенного на предыдущем пункте, его окружение полностью сбрасывается. И, в начале скрипта, необходимо в явном виде определить все переменные Oracle (если вы собираетесь выполнять, скажем, SQL-команды посредством SQL*Plus) и все другие необходимые вам переменные. Кроме того, все употребленные в скрипте внешние команды должны быть написаны с полным абсолютным путем. И - самое главное - скрипт должен явно завершаться командой exit 0. В противном случае, даже при успешном выполнении из консоли, в задании он всегда будет завершаться неуспехом.

Пример правильно написанного скрипта:

#!/bin/bash

# Set all needful environment first - all env clears in external jobs
# for security reason
ORACLE_SID=ORCL
export ORACLE_SID
ORACLE_BASE=/oracle
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/ora_home10g
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:/bin:/opt/bin:/usr/bin:/usr/local/bin
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib:/usr/lib
export LD_LIBRARY_PATH

# Inline SQL execution
$ORACLE_HOME/bin/sqlplus / as sysdba <<EOT
 alter system set plsql_code_type=interpreted scope=both;
 show parameter plsql_code_type
EOT

# Finally we MUST return exit code 0
exit 0


Вот примерно так должен выглядеть ваш скрипт. Если вы не выполните приведенные мной выше рекомендации, то как раз и получите ошибку, приведенную в заголовке, без малейшей детализации.

Пользуйтесь на здоровье.

PS. Я привел данный пример условно. Параметры можно менять и менее замысловатыми способами (например, используя native SQL), а подобным образом можно выполнять любые команды SQL и SQL*Plus.

среда, 8 января 2014 г.

SSH-клиент - теперь в браузере

Не знаю, как вам - а лично мне удобно бывает иметь клиента, да с сохраненными сессиями, в браузере и на нескольких машинах. Не считайте это рекламой - но это и правда весьма удобно. Конечно, для лихих работ лучше пользоваться standalone-клиентом. Но все действительно приличные клиенты - обычно платные (puTTY не предлагать - это стрёмный ужас).




Кому как - а лично для меня это одно из самых нужных приложений Хрома.

Единственный, на мой взгляд, недостаток - не на все терминальные хоткеи этот клиент реагирует, в частности, выходить по Ctrl+D не получается - надо-таки набирать exit:


Но с этим лично я вполне могу примириться. :)