Убить работу Oracle. 10 г специфический - PullRequest
3 голосов
/ 06 октября 2009

Мы используем систему планирования заданий, которая работает поверх DBMS_JOB. Он использует основную работу для создания разовых работ. Мы развертываем один и тот же набор заданий для всех наших клиентов, но можем указать, какие задания должны выполняться только на определенных клиентах.

Время от времени возникают проблемы с процессом, выполняемым при зависании задания. Основной причиной этого является то, что UTL_TCP не выполняет тайм-аут при получении ожидаемого ответа. Я хочу иметь возможность убивать эти задания, чтобы они могли работать снова.

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

Мы еще какое-то время застряли с Oracle 10g, поэтому я ограничен тем, что это может сделать.

Есть статья, которая, кажется, покрывает большую часть этого в

http://it.toolbox.com/blogs/database-solutions/killing-the-oracle-dbms_job-6498

У меня такое ощущение, что это не охватит все возможности, в том числе:

  1. Мы можем выполнять задания от нескольких разных пользователей, и пользователь может только нарушать / удалять созданные ими задания. Я полагаю, что я могу использовать DBMS_IJOB, чтобы обойти это, но мне нужно, чтобы администратор БД позволил мне выполнить его.
  2. У нас есть системы Oracle RAC. Я понимаю, что 10g ограничивает ALTER SYSTEM KILL SESSION уничтожением сессий на текущем экземпляре. Я мог бы организовать выполнение всех заданий в одном экземпляре, но я еще не пробовал.

Что-нибудь еще, что я должен рассмотреть? Переполнение стека требует определенного ответа на этот вопрос.

Ответы [ 2 ]

1 голос
/ 07 октября 2009

Есть больше способов убить сеанс на оракуле. Зависит от вашей платформы. Запуск в сеансах Unix (также фоновые задания) представлен процессами. Убивая процесс, убивает сеанс. На окнах сессии представлены потоком. Уничтожение потока с помощью orakill , убивает сеанс. Идентификатор процесса (или потока) хранится в gv $ process .

1 голос
/ 07 октября 2009
  • Вы можете получить PID из таблиц заданий и уничтожить зависший процесс с помощью обычных команд ОС.

  • Вы можете убить задания на любом экземпляре. На 10g вам нужно знать, на каком экземпляре выполняется зависшее задание, и подключиться к этому экземпляру:

Чтобы получить свой экземпляр и pid:

select inst_id, process from gv$session where ...

Подключение к конкретному экземпляру:

sqplus admin@node3 as sysdba
alter system kill session ...
...