Oracle как посмотреть все jobs

Обновлено: 04.07.2024

До версии Oracle 10g в запланированной задаче использовался пакет DBMS_JOB, и для замены версии 10g была введена DBMS_SCHEDULER.
Предыдущий DBMS_JOB с точки зрения функций обеспечивает более мощные функции и более гибкий механизм управления, чем DBMS_JOB.


1. DBMS_JOB


1、Просмотр максимального числа одновременных запланированных задач в базе данныхОбычно устанавливается на 10

2. Установите максимальное количество одновременных запланированных задач в базе данных.Если установлено значение 0, запланированное задание базы данных не будет выполнено.

3. Рабочие инструкции:

4. Создайте пример работы 1:

Интервал выполнения заданияОписание параметра интервала

5. Создать вариант работы 2:

Последний параметр 'sysdate + 1/1440' указывает, что интервал времени равен каждой минуте. Другие обычно используемыеНастройка интерваласледующим образом:
(1) Если вы хотите выполнять каждый день в 1 час ночи, этот параметр может быть установлен в''trunc (sysdate) +25/24 ';
(2) Если вы хотите выполнять в 1:00 каждый понедельник, для этого параметра можно установить значение'runc (next_day (sysdate, 1)) + 25/24 ';
(3) Если вы хотите выполнить в 1:00 1-го числа каждого месяца, этот параметр можно установить в''trunc (last_day (sysdate)) + 25/24 ';
(4) Если вы хотите выполнять один раз в квартал, этот параметр можно установить в''trunc (add_months (sysdate, 3), 'Q') + 1/24 ';
(5) Если вы хотите выполнять один раз каждые шесть месяцев, этот параметр может быть установлен в 'add_months (trunc (sysdate,' yyyy '), 6) +1/24';
(6) Если вы хотите выполнять его один раз в год, этот параметр может быть установлен в 'add_months (trunc (sysdate,' yyyy '), 12) +1/24'.

6. Операция просмотра задания планирования работы

7. Работа с другими операциями
(1) Начни работу

(2) Удалить работу: dbms_job.remove (jobno);
(3) Измените операцию для выполнения задания: dbms_job.what (jobno, what);
(4) Измените следующее время выполнения: dbms_job.next_date (job, next_date);
(5) Интервал модификации: dbms_job.interval (задание, интервал);
(6) Остановить работу: dbms.broken (работа, сломана, следующая дата);

Во-вторых, DBMS_SCHEDULER

1. Функция DBMS_SCHEDULER более мощная, определение более гибкое, а взаимодействие с системой улучшено.
Есть два способа определить «план»:
(1) Использовать DBMS_SCHDULER.CREATE_SCHEDULE // определить план, запланировать повторный вызов задания;
(2) Вызов DBMS_SCHDULER.CREATE_JOB // Процесс непосредственно определяет задание

2. Создать сценарий DBMS_SCHEDULER 1: Создать работу напрямую с DBMS_SCHDULER.CREATE_JOBE

Описание параметра:
•job_name: Как следует из названия, каждое задание должно иметь имя, чтобы обеспечить уникальность указанного имени. Обязательное значение.
•job_type: Тип операции, выполняемой задачей, в настоящее время поддерживает следующие типы, обязательные значения.
(1)PLSQL _BLOCK Указывает, что выполнение задачи является анонимным блоком PL / SQL.
(2)STORED_PROCEDURE : Указывает, что задача выполняет процесс ORACLE (включая PL / SQL PROCEDURE и JAVA PROCEDURE).
(3)EXECUTABLE Указывает, что задача выполняет внешнюю программу, например команду операционной системы.
(4)CHAIN : Указывает, что задача является ЦЕПЬЮ.
•JOB_ACTION : Операция, выполняемая задачей, обязательное значение, должно соответствовать параметрам, указанным в типе JOB_TYPE.
Например, для анонимных блоков PL / SQL здесь могут быть размещены конкретные представители блоков PL / SQL, аналогично DECLARE, BEGIN, END;
Если это процесс ORACLE, то здесь должно быть указано конкретное имя процесса. Обратите внимание, что из-за выполнения задачи, даже если в процессе есть OUT-подобные параметры,
Там не будет никакого вывода во время фактического выполнения.
•START_DATE : Укажите время, когда задача выполняется в первый раз. Этот параметр может быть пустым. Если он пуст, это означает, что задача будет выполнена немедленно.
Эффект эквивалентен указанию значения параметра SYSDATE.
•REPEAT_INTERVAL : Укажите частоту выполнения задачи, например, как долго она будет запущена для повторного выполнения. Этот параметр также может быть пустым,
Если оно пустое, это означает, что заданная в данный момент задача выполняется только один раз.
Грамматическая структура параметра REPEAT_INTERVAL является относительно сложной, наиболее важными из которых являются два ключевых слова FREQ и INTERVAL.
(1 ) Ключевое слово FREQ Используется для указания периода времени интервала, необязательные параметры: YEARLY, MONTHLY, WEEKLY, DAILY,
ЧАСЫ, МИНУТЫ, ВТОРОЙ, представляющие такие единицы, как год, месяц, неделя, день, час, минута, секунда и т. Д.
(2) Ключевое слово INTERVAL Используется для указания частоты интервала, диапазон значений, который можно указать, составляет от 1 до 99.
Например: REPEAT_INTERVAL => 'FREQ = DAILY; INTERVAL = 1'; означает выполнение один раз в день,
Если вы измените ИНТЕРВАЛ на 7, это означает, что он будет выполняться каждые 7 дней. Эффект эквивалентен FREQ = WEEKLY; INTERVAL = 1.
.END_DATE : Задает срок действия задачи. Значение по умолчанию - NULL. После того, как задача истекает, состояние задачи будет автоматически изменено на ЗАВЕРШЕНО,
ENABLED установлен в FALSE. Если для этого параметра установлено пустое значение, это означает, что срок действия задания никогда не истечет, и он всегда будет следовать за REPEAT_INTERVAL.
Цикл установки параметров повторяется до тех пор, пока не будет достигнуто установленное значение MAX_RUNS или MAX_FAILURES.
•JOB_CLASS : Определяет CLASS, связанный с задачей. Значением по умолчанию является DEFAULT_JOB_CLASS.
•ENABLED : Указывает, включена ли задача, значением по умолчанию является ЛОЖЬ. Состояние FALSE означает, что задача не будет выполнена, пока пользователь не вызовет ее вручную,
Или пользователь может изменить статус задачи на ИСТИНА.
•AUTO_DROP : Если флаг установлен в значение ИСТИНА, ORACLE автоматически удалит созданную задачу при выполнении условий
(1) Задание истекло;
(2) Максимальное количество запущенных задач достигло значения настройки MAX_RUNS;
(3) Задача не указывает параметр REPEAT_INTERVAL, выполняется только один раз;
•COMMENTS : Задайте информацию о комментарии для задачи. Значение по умолчанию - NULL.

Описание выражений календаря:MON означает понедельник, SUN - воскресенье, DAY - каждый день, WEEK - каждую неделю и так далее.
Конкретные примеры следующие:

3. Создать сценарий DBMS_SCHEDULER 2

Примечание: включен по умолчанию false, оракул не будет запускать это задание, поэтому нам нужно включить его

4. Создайте DBMS_SCHEDULER, вариант 3, используйте DBMS_SCHDULER.CREATE_SCHEDULE.
Создайте планировщик (управляйте временем и частотой), а затем добавьте в него несколько заданий (действий).
Шаг 1. Создайте планировщик: «zbb_schedule»

Шаг 2: Добавьте работу "zbb_job2" в "zbb_schedule"

Шаг 3: Добавьте работу "zbb_job3" в "zbb_schedule"

Шаг 4: Добавьте задание "zbb_job1" в "zbb_schedule", но процесс изменения атрибутов выполнен

5. Просмотр всех заданий в расписании.

6. Удалите работу в планировщике

7. Удалить планировщик

8. Измените атрибуты задания (частота: частота)

9. Начни работу, Когда рабочие места созданы, они находятся в состоянии «отключено». Мы должны «включить» его вручную.

Задания в Oracle9i

В Oracle существует возможность запланировать выполнение определенного набора действий в виде заданий. Задание может, представляет собой хранимую процедуру, анонимный блок PL /SQL, внешнюю процедуру на языке C или Java. Время выполнения может иметь значение любого времени суток и подчинятся заданному интервалу. Это хорошо подходит для переноса тяжёлых в обработке расчётов на менее загруженное ночное время. По умолчанию выполнение заданий выключено. Поэтому надо провести небольшую дополнительную настройку сервера.

Настройка сервера

Для того чтобы задания начались выполняться необходимо, установить параметр инициализации JOB_QUEUE_PROCESSES. Изначально он имеет значение 0 и задаёт максимальное количество фоновых процессов для выполнения заданий. В версии Oracle 9.2 максимальное значение этого параметра может составлять 1000. На практике же обычно можно ограничиться не более 5 процессами. В любом случае вы всегда можете изменить это значение с помощью команды ALTER SYSTEM SET без перезагрузки сервера. Итак, для начала внесем новую строчку в файл инициализации и перезагрузим сервер:

В файле alert.log мы увидим, что в момент, когда стартуют фоновые процессы, у нас появилось новая запись:

Это стартовал новый фоновый процесс CJQ0, так называемый координатор заданий. Что он делает и для чего он нужен, мы рассмотрим чуть ниже, а на этом предварительную настройку сервера можно считать законченной.

Процессы

Итак, процесс координатора заданий запущен, и как можно догадаться из его названия именно этот процесс осуществляет общее управление всеми заданиями. Для начала он выбирает таблицу SYS.JOB$, в которой хранятся параметры заданий. Если среди заданий имеются те, которые будут выполняться в ближайший интервал времени указанный в скрытом параметре _JOB_QUEUE_INTERVAL (по умолчанию его значение составляет 5 секунд), то для них порождаются фоновые процессы очереди заданий Jnnn, которые в свою очередь создают сеансы для непосредственного выполнения запланированных действий. Именно максимальное количество процессов Jnnn, которые могут быть одновременно запущены и отражает настраиваемый параметр JOB_QUEUE_PROCESSES.

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

Выставляйте значение параметра JOB_QUEUE_PROCESSES чуть больше максимального количества одновременно запускаемых заданий. Маленькое значение может привести к сдвигу времени выполнения из-за конкуренции за процессы Jnnn. Большое значение к неоправданному запуску этих же процессов в исключительных ситуациях.

Создание заданий

Для управления заданиями в Oracle существует специальный пакет DBMS_JOB. С его помощью над ними можно осуществлять различные действия. Для начала попробуем создать новое задание. В нашем случае для этого, нужно применить следующую процедуру пакета:

Опишем параметры этой процедуры:

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

WHAT - тело задания. Представляет собой анонимный PL/SQL блок. Всё что здесь указано, будет выполнено в процессе работы задания. Если вы запускаете только одну процедуру, то можно не заключать её в блок достаточно поставить в конце названия процедуры точку с запятой. Значение WHAT в этом случае автоматически будет помещено в PL/SQL блок. Если процедура имеет строковые параметры, то они обязательно должны заключаться в две одинарные кавычки с каждой стороны. В PL/SQL блоке можно также писать DML и DDL команды, но нельзя производить создание и запуск заданий. Это только приведёт к ошибке ORA-32317. Если же используются ссылки на удалённую базу данных, то они должны явно включать имя и пароль. Анонимные ссылки здесь не поддерживаются. И, наконец, владельцу задания требуется явно предоставить привилегии, на объекты, используемые в теле задания.

NEXT_DATE - дата следующего выполнения задания. Время непосредственно задаётся владельцем или автоматически вычисляется Oracle.

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

INTERVAL - формула интервала времени. Представляет собой DATE функцию. Именно от её правильного значения будет зависеть дата следующего выполнения задания казанного в столбце NEXT_DATE. Приведём некоторые примеры формулы интервала задания:

Задание будет выполняться ровно в n часов m минут каждого дня.

Задание будет выполняться ровно в n часов m минут последнего дня каждого месяца.

Задание будет выполняться ровно в n часов m минут первого дня каждого месяца.

Учитывайте, что вычисление NEXT_DATE с помощью формулы интервала происходит после выполнения задания. Поэтому всегда учитывайте это время и старайтесь не ставить их на время близкое к окончанию суток из-за возможного неправильного расчёта следующей даты выполнения.

NO_PARSE - флаг разбора PL/SQL. Если его значение равно FALSE разбор происходит в момент установки задания. Иначе, в момент выполнения задания.

INSTANCE - какой экземпляр производит выполнение задания.

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

При создании задания или изменения его параметров ORACLE записывает текущие параметры NLS владельца. Эти параметры каждый раз восстанавливаются при выполнении задания. Это может приводить к некоторым ошибкам в случае ожидания других значений. Поэтому если необходимо лучше производить установку нужных NLS значений с помощью команды ALTER SESSION в параметре WHAT задания.

В качестве примера создадим простое задание, которое при запуске будет делать паузу в 20 секунд, первый раз выполниться 1 января 2006 года в 1 час 5 минут и будет повторяться каждый день в то же самое время.

Изменение задания

И так задание создано. Теперь попробуем изменить некоторые его параметры. Для изменения доступны следующие параметры задания: WHAT, NEXT_DATE, INTERVAL и INSTANCE. Их можно менять все одновременно или по отдельности. К примеру, следующая процедура пакета меняет все три параметра, при этом следует учитывать, что если какой либо из них равен NULL, то значение параметра не изменится.

А вот уже эта процедура меняет значение только параметра WHAT:

Также с параметрами NEXT_DATE,INTERVAL,INSTANCE:

В качестве примера, увеличим паузу, которое делает задание, созданное ранее, до 30 секунд и изменим, время повторного запуска задания на 3 часа 15 минут:

Изменить параметры или совершать другие действия над заданием можно только его владельцу. В противном случае возникнет ошибка ORA-23421: job number 24 is not a job in the job queue.

Удаление задания

Если задание становиться ненужным, то его можно удалить. Сделать это можно следующей процедурой:

Выключение задания

Бывают случаи, когда задание временно не должно выполняться. Для этого совсем необязательно его удалять. Достаточно его просто выключить. Выключение (включение) задания производится установкой специального флага состояния - BROKEN. Делается это с помощью следующей процедуры:

Если флаг BROKEN имеет значение истинно, то такое задание считается разрушенным и выполняться не будет. Параметр NEXT_DATE определяет здесь дату следующего выполнения задания и действует только при его включении.

В момент выключения задания параметр NEXT_DATE устанавливается в максимальное значение даты. Если не указать параметр NEXT_DATE в момент включения, то задание начнёт выполняться немедленно.

Для примера выключим задание:

Вынужденное выполнение задания

Если необходимо запустить задание в текущий момент времени, то сделать это можно с помощью следующей процедуры пакета:

Если параметр FORCE имеет значение ложно, то задание может быть выполнено в приоритетном режиме только в указанном экземпляре, иначе .

Задание выполняется в текущем сеансе, при этом повторно инициализируются пакеты текущего сеанса, и происходит неявная фиксация транзакции.

Экспорт задания

Если требуется перенести задание в другую базу данных или пересоздать задание, то это можно легко сделать с помощью следующей процедуры пакета:

Переменная mycall будет при этом содержать текст команды, с помощью которой можно заново создать задание.

Контроль задания

Как было указано выше, координатор заданий обращается в своей работе к системной таблице SYS.JOB$, хранящей описания всех заданий. На эту таблицу существуют три представления: DBA_JOBS, ALL_JOBS и USER_JOBS. Они наиболее часто используются для контроля над заданиями. Рассмотрим их некоторые столбцы:

  • JOB, NEXT_DATE, INTERVAL, WHAT, INSTANCE - эти столбцы знакомы нам по процедуре SUBMIT.
  • LOG_USER - пользователь под которым была создано задание. Фактически это и есть владелец задания.
  • PRIV_USER - пользователь привилегии которого используются для выполнения задания.
  • SCHEMA_USER - схема по умолчанию для разбора задания.
  • LAST_DATE (LAST_SEC) - дата (время) последнего успешного выполнения задания.
  • THIS_DATE (THIS_SEC) - дата (время) начала выполнения задания.
  • TOTAL_TIME - общее время выполнения задания в секундах. Содержит суммарное время длительности всех выполнений задания.
  • BROKEN - этот столбец показывает состояние флага разрушенного задания. Если значение равно Y задание выполняться не будет.
  • FAILURES - количество неудачных попыток выполнить задание. Максимальное значение может достигать 16.
  • NLS_ENV - NLS параметры сеанса. Соответствуют параметрам сеанса, в котором задание создавалось.

Кроме вышеперечисленных представлений существует и ещё одно - DBA_JOBS_RUNNING. Оно показывает задания, которые выполняются в текущий момент времени. С его помощью можно легко определить SID сеанса выполняемого задания.

Блокировки

Если подробнее разобрать представление DBA_JOBS_RUNNING, то можно увидеть что в его основе лежит соединение таблицы SYS.JOB$ и представления V$LOCK. Кажется, какая тут есть связь? Оказывается, есть и самая прямая. Для того чтобы гарантировать, что данное задание выполняется одновременно только в одном сеансе, Oracle выставляет блокировку JQ. Это можно хорошо видеть, сделав запрос к представлению V$LOCK во время выполнения задания:

При этом столбец ID2 будет указывать на идентификатор выполняемого задания.

Ошибки

Прерывание задания

Не так давно мне пришло письмо с вопросом о том, как контролировать задания (jobs) в Oracle . Вот почему в этом выпуске я решил представить перевод ответа Тома Кайта на давно заданный аналогичный вопрос. Кроме того, я хочу представить вам новую книгу, над переводом которой я сейчас работаю.

Мониторинг заданий

Как понять, что реально делает задание? Я хотел бы получать признаки жизни от посланного на выполнение SQL-оператора. Не видно никаких блокировок, которые мешали бы ему работать - я работаю на новом и практически не используемом сервере. Этот сервер должен заменить текущий производтсвенный, поэтому я, по сути, скопировал все настройки. Пришлось внести несколько изменений в файл INIT.ORA , в основном, связанных с изменением каталогов: ранее значение compatible было 7.3.2.3.0, а теперь - 7.3.4.5.0; ресурсов enqueue было 16000, а теперь - 32000 (я просто выполнил "diff" для двух файлов). Я уверен, что никаких блокировок не может быть, но ЧТО делает задание, мне непонятно.

Я пытался просматривать все обнаруженные представления динамической производительности V$ ; где взять их полный список? В одной из книг, которую я читал, написано, что надо обращаться к представлению X$KQFVI , но его, похоже, нет.

Ответ Тома Кайта

Чтобы узнать, какие задания сейчас выполняются, используйте следующее представление:

Чтобы узнать, какой sql-оператор выполняет задание, и выполняет ли оно что-то вообще, можно использовать такой сценарий sqlplus :

Может иметь смысл использовать пакет DBMS_APPLICATION_INFO для задания значений столбцов action , client_info и module в представлении v$session - после этого при выполнении сценария showsql вы будете получать значения из этих столбцов, что поможет понять, на каком этапе выполнения сейчас находится программа.

я попытался использовать твой сценарий, но столкнулся с проблемой при использовании его совместно с FGA (Fine Grained Auditing). Вот мой сценарий:

А вот и процедура Capture :

Затем, я выполняю

и обращаюсь к таблице rt_suivi_consult_aas , чтобы проверить, перехвачен ли текст SQL-оператора, оказывается, что там следующий текст:

а не "select * from ref_ur"

Не подскажешь, в чем дело?

Ответ Тома Кайта

Пакет dbms_fga уже ЗАХВАТИЛ текст SQL-оператора - он уже в журнале аудита (audit trail). Всё уже сделано, просто выкиньте ваш код. Именно это и делает пакет dbms_fga .

В статье рассматриваются некоторые свойства и примеры употребления планировщика заданий, появившегося в версии Oracle 10 на смену старому.

Введение

Первый механизм планового запуска появился в версии 7 для поддержки автоматических обновлений снимков (snapshots), как поначалу именовались нынешние материализованные виртуальные таблицы (materialized views). В версии 8 этот механизм был открыт для обычных пользователей через посредство некоторых параметров СУБД, таблиц словаря-справочника, а также пакета DBMS_JOB. Пакет DBMS_JOB позволял (и позволяет) запускать хранимую процедуру, или же неименованный блок PL/SQL в моменты времени, вычисляемые по указанной пользователем формуле.

  • Schedule (расписание)
  • Program (программа)
  • Job (плановое задание = расписание + программа)
  • таблицы словаря-справочника LIKE '%SCHEDULER_%' (DBA_SCHEDULER_JOBS, DBA_SCHEDULER_JOB_LOG и прочие);
  • несколько типов объектов хранения, как то:
    • JOB
    • SCHEDULE
    • PROGRAM
    • JOB CLASS,
    • CREATE SESSION
    • CREATE JOB
    • CREATE ANY JOB
    • EXECUTE ANY PROGRAM
    • EXECUTE ANY CLASS
    • MANAGE SCHEDULER
    • CREATE EXTERNAL JOB,
    • EXECUTE
    • ALTER
    • ALL,

    Некоторые ключевые моменты использования планировщика в Oracle 10 рассматриваются ниже на примерах.

    Простой запуск задания

    Простой запуск задания очень напоминает запуск с помощью процедуры SUBMIT из пакета DBMS_JOB. Однако, в отличие от SUBMIT, он возможен только при наличии привилегии CREATE JOB. В последующих примерах созданием заданий и управлением ими для простоты будет заниматься пользователь SCOTT, хотя в жизни разумно подумать об отдельном администраторе для этой цели. Выдадим пользователю SCOTT нужную привилегию:

    Кроме системных привилегий, использование планировщика регулируется объектными привилегиями EXECUTE, ALTER и ALL, выдача которых применительно (GRANT . ON) к заданию, программе, расписанию или классу заданий позволяет работать с объектами БД типов JOB, PROGRAM, SCHEDULE и JOB CLASS соответственно, введенных в Oracle 10 вместе с новым планировщиком.

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

    Внутреннее задание для СУБД

    Пример внутреннего задания в виде неименованного блока PL/SQL:

    1. Обрамлять блок словами BEGIN и END не обязательно, так как код пакета DBMS_SCHEDULER это сделает самостоятельно (ради особой программной логики, добавляемой им к тексту пользователя).
    2. Задание запускается в этом же сеансе и сопровождается неявной выдачей COMMIT. В этом легко удостовериться: Зарплата SAL увеличится на 2. Проверить это в качестве упражнения.

    Для хранимой процедуры задание формируется аналогично:

    Обратите внимание, что нам не потребовалось удалять старое задание SIMPLE_JOB, так как при выбранных нами параметрах процедуры CREATE_JOB задания (и первое, и второе) прогонялись однократно, моментально и сразу же удалялись автоматически. Последнее как раз можно и отменить посредством не использованного в примере выше параметра AUTO_DROP.

    Внешнее задание (для ОС)

    Совсем новым в планировщике Oracle 10 является возможность запускать плановые задания в ОС. Однако чтобы это было возможно, в ОС должна быть запущена программа extjob из ПО СУБД. На Windows она запускается службой OracleJobScheduler . Для того чтобы следующий пример проработал, службу необходимо запустить. Вдобавок потребуется выдать пользователю SCOTT еще одну привилегию.

    Обратите внимание, что в Windows выдача команды ОС или же запуск командного файла напрямую (без вызова cmd.exe), не проходит.

    В Unix аналогичное действие можно записать как 'ls > /tmp/out. txt'.

    Возможности запуска, наблюдения, вмешательства

    Так же, как для пакета DBMS_JOB, в новом планировщике предусмотрено именно плановое, а не одноразовое исполнение задания. Добавим к последнему вызову параметр:

    В результете корневой файл out.txt получим через 10 секунд после создания задания. Добавим еще параметр: В результате задание будет исполняться ежемесячно по воскресениям и последним субботам месяца. В отличие от DBMS_JOB, DBMS_SCHEDULER, в дополнение к возможности употребить выражение на PL/SQL, имеет для формулирования графика запуска еще и специальный язык. Он позволяет указывать частоту, интервал и уточнитель запуска задания. Примеры:

    Для проверки правильности составления выражения можно воспользоваться специальной процедурой:

    Полное описание языка приводится в документации по Oracle.

    Если указать план запуска, задание появится в системе уже надолго. Удалить его при необходимости можно будет так:

    Информацию об имеющихся заданиях пользователь SCOTT может посмотреть запросом:

    Скомпонованное задание

    Более развитая возможность DBMS_SCHEDULER позволяет скомпоновать задание из независимых элементов: программы и расписания. Характерная особенность в том, что оба эти элемента самостоятельны; их можно комбинировать в разных заданиях и изменять, не внося изменений в определения заданий.

    Создание программы

    Простой пример создания программы:

    Список сведений об имеющихся программах для планировщика имеется в таблицах DBA/ALL/USER_SCHEDULER_PROGRAMS.

    Другими значениями параметра PROGRAM_TYPE могут быть 'PLSQL_BLOCK' и 'EXECUTABLE' (см. выше).

    При наличии у процедуры параметров их количество потребуется указать особо:

    Создание расписания

    Пример создания расписания:

    В общем случае язык указания графика для расписания (параметр REPEAT_INTERVAL) допускает ссылаться на ранее созданные таким же образом расписания.

    Список сведений об имеющихся расписаниях для планировщика имеется в таблицах DBA/ALL/USER_SCHEDULER_SCHEDULES.

    Простой пример скомпонованного задания

    Из самостоятельно существующих программы и расписания можно составить задание:

    При наличии параметра пример может выглядеть так:

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

    Создание и использование ресурсного окошка СУБД для задания

    Ресурсный план построить несложно, но, чтобы не отвлекаться, воспользуемся встроенным в любую БД планом SYSTEM_PLAN (см. таблицу DBA_RSRC_PLANS). Тогда создание окошка может выглядеть так:

    Теперь каждые три минуты на минуту будет включаться ресурсный план SYSTEM_PLAN. Это легко наблюдать, выдав несколько раз от имени SYS:

    Если подгадать момент, когда значение OPERATION для окошка MY_JOB_WINDOW станет OPEN, от имени SYS можно будет удостовериться, что план включен:

    Чтобы связать с этим периодически открывающимся ресурсным окошком задание, пользователю SCOTT достаточно указать его вместо расписания:

    С этого момента можно наблюдать уменьшение зарплат сотрудников, осуществляемое каждые три минуты в условиях благоприятного ресурсного плана. В качестве варианта, в процедуре CREATE_WINDOW можно было сослаться и на какое-то существующее расписание.

    Изменение свойств объектов планировщика

    Хотя упомянутые JOB, SCHEDULE, PROGRAM, WINDOW и проч., причисляются к объектам хранения БД (и видны в таблицах DBA/ALL/USEROBJECTS), не только их создание и удаление, но и изменение свойств выполняются так, как было удобно разработчику: через API. Для всех перечисленных видов объектов существует довольно много поведенческих свойств, указанию которых нет места в процедурах LIKE 'CREATE_%'. Устанавливать их следует явно единой для всех процедурой SET_ATTRIBUTE. Вот пример, как для задания MY_WINDOW_JOB (а) задать приоритет выполнения (по отношению к другим заданиям своего класса), если на одно время пришлось выполнение нескольких заданий одновременно, и (б) потребовать прекращения (процедурой STOP_JOB), если оно еще не выполнилось, а ресурсное окошко уже закрылось:

    Полный список атрибутов и объектов, к которым они применимы, имеется в документации по Oracle.

    Заключение

    Помимо использованного выше общения с планировщиком Oracle 10 средствами PL/SQL и SQL, общаться с ним можно через графический интерфейс Oracle Enterprise Manager. По сути, OEM ничего нового не дает, так как в конечном итоге отсылает к СУБД те же команды на PL/SQL и SQL, но выполнение разовых действий через OEM часто администратору быстрее и понятнее. Для автоматизации работ, однако, лучше может подойти работа со сценариями запросов.

    После проведенных опытов с планировщиком не забудьте освободить БД от ненужных объектов. Например:

    Удаление прочих созданных ранее объектов и изъятие выданных пользователю SCOTT привилегий предлагается сделать самостоятельно в виде упражнения, воспользовавшись таблицами словаря-справочника и, при надобности, документацией. Можно также использовать OEM.

    Читайте также: