Изменить / Предисловие: Этот вопрос был перенесен из SO, так как меня особенно интересует вопрос о тайм-аутах при запросах ссылок на БД. Предоставленный обходной путь от SO несколько нормальный, но мне действительно интересен сам вопрос.
Мотивация:
у меня был один запрос, выполняемый «навсегда» (более 2 дней, пока я не завершил сеанс), который использовал ссылку на базу данных. Проблема, казалось, ORA-02068
заключалась в том, что удаленная база данных стала недоступной и по какой-то пока еще неизвестной причине не было поднято (не обсуждаться здесь), а запрос просто ждал и ждал.
(Запрос выдается заданием dbms_scheduler, которое выполняет процедуру в пакете PL / SQL. Как следствие, задание также зависло. Но это не представляет особого интереса для сути этого вопроса)
Я смоделировал эту ситуацию, переведя одну из моих тестовых БД в режим ожидания и запросив ее по ссылке в базе данных. Как и ожидалось, запрос находился в ожидании, пока он не будет отменен вручную или удаленная БД не будет приостановлена.
Вопрос:
У меня нет контроля над поведением и временем работы удаленной базы данных, поэтому я нахожусь в поиске некоторой возможности установить тайм-аут для запроса, использующего ссылку на базу данных.
Я уже изучил профили (и CPU_PER_CALL
т. Д.), sqlnet.ora
Параметры, добавляя локальные параметры именования непосредственно в строку подключения (например, добавляя (connect_timeout=10)
в определение ссылки на базу данных), выполняя команду с ... for update wait 1
, но они либо работают для занятых или незанятых сеансов, но не для сессий в ожидании.
Поэтому я нахожусь в поиске некоторого параметра на «локальной» стороне ссылки на базу данных, который устанавливает тайм-аут для запросов по ссылкам базы данных.
Некоторое решение, как alter session set xyz
или select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)
было бы оценено, так как у меня нет прав администратора этих конкретных баз данных.
В настоящее время я использую 10gR2, но через несколько недель обновлюсь до 11gR2, поэтому идеи для любой из этих версий будут полезны.
Ответы:
Поскольку вы используете dbms_scheduler, вы можете установить для атрибута max_run_duration задание некоторого предела, а затем отправить по электронной почте планировщик, если это событие возникнет. За кулисами Oracle использует таблицы очередей (которые могут позволить вам создавать задания, которые запускаются при возникновении события , если вы хотите предпринять дополнительные шаги для большей автоматизации вашего ответа). Но в основном любое задание, которое выполняется с установленной вами max_run_duration, будет вызывать тип события: JOB_OVER_MAX_DUR
Кусок электронной почты построен в 11gr2, смотрите здесь для хорошей рецензии.
Надеюсь, это поможет.
источник
max_run_duration
поднять мероприятие, поэтому я здесьЯ не говорю, что у меня есть решение, но я также хотел бы больше обсудить, как контролировать время ожидания dblink. Я полагаю, что можно было бы написать код, который запускает событие или ожидает события тайм-аута TNS, а затем выполняет:
Конечно, вы можете опрашивать удаленный сервер раньше с помощью:
проверить, доступен ли он, но это не решает проблему слишком долгого выполнения кода на пульте. Плохой удаленный код должен вызывать события ожидания, поэтому я предполагаю, что они могут быть перехвачены (даже на уровне класса в 12c). Это все еще не дает нам элегантного решения для принудительного завершения сеанса dblink.
источник