Убить работу Oracle. Специфический 10g

Мы используем систему планирования заданий, которая работает поверх 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 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам