Использование планировщика Oracle Scheduler

Oracle scheduler - работаем с планировщиков в базе данных OracleOracle Database 11g и 12c предлагает новое средство Scheduler (Планировщик), которое помогает автоматизировать задания внутри базы данных Oracle. Пакет DBMS_SCHEDULER содержит различные функции и процедуры, помогающие управлять планировщиком, хотя также можно очень легко планировать запуск заданий в интерфейсе Database Control. Наиболее важная архитектурная особенность Scheduler состоит в его модульном подходе к управлению заданиями, что позволяет повторно использовать сходные задания.

Использование Scheduler вместе с Database Resource Manager позволяет осуществлять тонкую настройку выделения ресурсов различным заданиям. Oracle Scheduler — не только инструмент описания заданий (jobs), он также помогает контролировать использование ресурсов и устанавливать приоритеты заданий внутри базы данных.

Одним из ограничений пакета DBMS_JOB является то, что он может выполнять только задания на базе PL/SQL, и его нельзя использовать для планирования запуска системных сценариев либо исполняемых файлов. Чтобы запускать такие задания, не связанные с базой данных, до сих пор нужно было применять средство crontab в UNIX или at на серверах Windows или же обращаться к инструментам от независимых поставщиков. Oracle Scheduler позволяет использовать сценарии PL/SQL, сценарии оболочки операционной системы, программы Java, и родные двоичные исполняемые файлы для выполнения запланированных заданий.

 

Базовые компоненты Scheduler

Scheduler состоит из пяти базовых компонентов — заданий (jobs), расписаний (schedules), программ, событий и цепочек (chains). Задания очень похожи на задания в пакете DBMS_JOB, но расписания, программы, события и цепочки — это новые концепции, формирующие модульный подход к управлению заданиями. Программа, например, позволяет нескольким пользователям выполнять сходные задачи.

Рассмотрим базовые компоненты Scheduler более подробно.

 

Задания (jobs)

Задание — это задача, которая планируется для однократного или многократного автоматического запуска. Задание содержит спецификацию того, что и когда должно быть выполнено. Задание Scheduler может выполнять блок кода PL/SQL, двоичный родной исполняемый код, приложение Java или сценарий оболочки. Новое задание (jobs) создается за счет спецификации таких его деталей, как действия, которые должны быть выполнены, время и частота запуска — как это делается с помощью традиционного пакета DBMS_JOB. В Scheduler можно абстрагировать все детали выполнения и времени запуска задания, используя модули программ (program) или расписаний (schedule).

 

Расписания (schedules)

Расписание — это спецификация того, когда и как часто база данных должна выполнять задание. Одно и то же расписание может использоваться для нескольких заданий (jobs). Можно также запланировать выполнение задания при возникновении определенного события в базе данных.

 

Программы

Программа содержит метаданные о задании Scheduler. Программа включает имя, тип (например, код PL/SQL или сценарий оболочки UNIX) и действие программы, которое представляет собой действительное имя процедуры или исполняемого сценария. Обратите внимание, что задание может специфицировать то, что именно следует выполнить, непосредственно в определении задания, или же использовать предварительно созданную программу для той же цели.

 

События

Scheduler использует средство Oracle Streams Advanced Queuing для инициации событий и запуска заданий базы данных, основанных на событиях. Событие — это сообщение, посланное приложением или процессом в ответ на какое-то действие или условие.

Существуют два типа событий — события, инициируемые Scheduler, и события, инициируемые приложением. События, инициируемые Scheduler, вызваны изменениями в функционировании Scheduler, так что успешное завершение задания (jobs) Scheduler тоже может быть событием. Событие, инициируемые приложением, “потребляются” или используются Scheduler для запуска задания. Фактически, в качестве средства запуска задания есть возможность использовать событие вместо расписания. Можно также базировать расписание на событии; в этом случае расписание называется event schedule (событийное расписание).

 

Цепочки

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

 

Типы запланированных заданий

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

 

Задания базы данных

Задания базы данных — наиболее распространенные задания Scheduler (jobs), и в этой главе они называются просто заданиями. Задания базы данных Oracle запускают такие модули, как анонимные блоки PL/SQL или хранимые процедуры, в дополнение к хранимым процедурам Java. Атрибут JOB_TYPE потребуется установить в PLSQL_BLOCK или STORED_PROCEDURE. В качестве значения атрибута JOB_ACTION нужно специфицировать имя анонимного блока или хранимой процедуры.

 

Задания-цепочки

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

 

Внешние задания

Внешние задания служат для запуска исполняемых программ операционной системы извне базы данных. Для внешних заданий JOB_TYPE устанавливается в EXECUTABLE.

 

Отсоединенные задания

Отсоединенные задания (jobs) служат для запуска сценария или приложения в виде независимого процесса. Значение атрибута DETACHED для отсоединенного задания равно TRUE.

 

Легковесные задания

Легковесные задания отличаются от обычных заданий Scheduler в том, что зависят от шаблона, наследуя его привилегии и метаданные задания. Легковесные задания влекут за собой меньшие накладные расходы, они быстрее создаются и уничтожаются, что делает их незаменимыми в том случае, когда требуется запустить множество мелких заданий (jobs).

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

 

Расширенные компоненты Scheduler

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

 

Классы заданий

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

  • Назначать уровни приоритетов индивидуальным заданиям, причем более высокоприоритетные задания выполняются перед низкоприоритетными.
  • Специфицировать общие атрибуты для наборов заданий (jobs).

Для выделения дефицитных ресурсов в базе данных применяется Database Resource Manager в координации с Scheduler. В Database Resource Manager концепция группы потребителей ресурсов позволяет группировать пользователей в соответствии с потреблением ресурсов. Oracle контролирует выделение ресурсов, назначая каждый класс заданий в определенную группу потребителей. По умолчанию класс заданий назначается в группу потребителей по умолчанию.

 

Окна

Окна Scheduler предлагают ссылку на Oracle Resource Manager. Окно в данном контексте представляет интервал времени, на который можно запланировать запуск задания; целью использования окон является изменение выделения ресурсов в определенный период времени. Каждое окно ассоциировано с определенным планом ресурсов, который создается с помощью Database Resource Manager. Используя окна, можно активизировать различные планы ресурсов во время разных периодов времени, предлагая различные приоритеты заданий (jobs).

 

Группы окон

Группа окон — это коллекция сходных окон. Например, можно создать окно на выходные и окно на праздники, и сгруппировать оба окна в одну группу окон обслуживания.

 

Архитектура планировщика

Архитектура Scheduler состоит из таблицы заданий, координатора заданий и исполнителей заданий (или подчиненных (slave), как их называет Oracle).

Таблица заданий содержит информацию о заданиях, такую как наименование задания, имя программы и владельца задания. Просмотреть данные этой таблицы можно через представление DBA_SCHEDULER_JOBS. Координатор заданий регулярно заглядывает в таблицу заданий, чтобы узнать, какие нужно выполнить задания. Координатор заданий создает и управляет процессами исполнителей заданий, которые, собственно, и делают работу.

При создании нового или запуске существующего задания фоновый процесс (cjqnnn) просыпается и координирует запуск задания. Когда координатор заданий указывает исполнителю выполнить задание, процесс исполнителя запускает новый сеанс базы данных и новую транзакцию. Он выполняет задание, и по завершении фиксирует результаты, завершая транзакцию и закрывая сеанс базы данных. Исполнитель задания обновляет таблицу заданий, счетчик запусков и таблицу журнала заданий.

 

Привилегии планировщика

Oracle создает все jobs, программы и расписания в схеме пользователя, создавшего эти объекты, а кроме этого создает такие расширенные компоненты Scheduler, как классы заданий, окна и группы окон, на уровне базы данных, и их владельцем является схема SYS.

Роль SCHEDULER_ADMIN содержит все системные привилегии Scheduler, с опцией WITH ADMIN OPTION. Роль администратора баз данных включает роль SCHEDULER_ADMIN.

Системная привилегия MANAGE SCHEDULER позволяет выполнять следующие действия.

  • Создание, удаление и изменение классов заданий, окон и групп окон.
  • Останов любого jobs.
  • Преждевременный запуск и останов окна.

На заметку! Все объекты Scheduler имеют форму [схема].имя. По умолчанию все имена объектов планировщика записываются в верхнем регистре, если только не заключить имя в нижнем регистре в кавычки, например, "test_job".


Для создания компонентов Scheduler (заданий, расписаний, программ, цепочек и событий) необходимо иметь привилегию CREATE JOB. Чтобы использовать расширенные компоненты Scheduler (окна, группы окон и классы заданий), понадобится системная привилегия MANAGE SCHEDULER.

Выдавая другим пользователям привилегии EXECUTE на одном из своих компонентов, вы предоставляете им право пользоваться этим компонентом.

  • Привилегия EXECUTE ANY PROGRAM разрешает пользователю выполнять любую программу в любой схеме.
  • Привилегия EXECUTE ANY CLASS дает возможность назначать задание в любой класс заданий.

Чтобы пользователи могли модифицировать компоненты Scheduler, они должны применить SQL-оператор GRANT ALTER для каждого компонента Scheduler.


На заметку! Чтобы иметь возможность создавать задание (jobs) в сгенерированном вами классе заданий, необходимо располагать отдельной привилегией EXECUTE на этом классе заданий.


Относительно привилегий Scheduler следует отметить некоторые ключевые моменты.

  • Чтобы создать задание, необходимо иметь привилегию CREATE JOB.
  • Для спецификации расписания, окна, группа окон или программа, которыми вы владеете, никакие специальные привилегии не нужны.
  • Для указания программы, принадлежащей другому пользователю, понадобится привилегия EXECUTE на эту программу или же системная привилегия EXECUTE ANY PROGRAM.

 

Управление базовыми компонентами планировщика

Базовые компоненты Scheduler — задания (jobs), программы, расписания, цепочки и события — имеют несколько общих средств управляемости. Создание, изменение и уничтожение всех компонентов осуществляется одной и той же процедурой из пакета DBMS_SCHEDULER. В следующих разделах будет описано управление этими компонентами.

 

Управление заданиями

В основе средства Scheduler лежит создание и управление заданиями. Можно создавать и запускать задания независимо или же создавать задания, применяя расписания и программы. Использование готовых программ и расписаний избавляет от необходимости переопределения программы или расписания при каждом создании нового задания.

 

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

Задание Scheduler создается с помощью процедуры CREATE_JOB из пакета DBMS_SCHEDULER. В листинге 1 ниже показан пример создания базового задания Scheduler без применения программы или расписания. Это наиболее простой способ спецификации задания, при котором вся необходимая информация указывается в самом операторе создания задания (jobs), без использования готовых программ или расписаний.


 

SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB(
3 JOB_NAME => 'test_job',
4 JOB_TYPE => 'PLSQL_BLOCK',
5 JOB_ACTION => 'insert into persons select * from new_persons;',
6 START_DATE => '28-JUNE-08 07.00.00 PM ',
7 REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=2',
8 END_DATE => '20-NOV-08 07.00.00 PM ',
9 COMMENTS => 'Insert new customers into the persons table',
10 ENABLED => TRUE,
11* END;
/
PL/SQL procedure successfully completed.
SQL>


На заметку! Если вы создаете задание в собственной схеме, то становитесь его владельцем. Однако если задание создается в другой схеме, владельцем задания будет владелец этой другой схемы. Таким образом, тот факт, что именно вы создали задание, еще не означает, что вы обязательно будете его владельцем.


Давайте рассмотрим параметры процедуры CREATE_JOB.

  • JOB_NAME — дает возможность указать имя задания.
  • JOB_TYPE — указывает тип задания. Задания могут включать блок PL/SQL, хранимую процедуру, исполняемую программу или программу Java.
  • JOB_ACTION — специфицирует конкретную процедуру, команду или сценарий, который будет запускать ваше задание.
  • START_DATE и END_DATE — специфицируют дату запуска и завершения нового задания. (Если задание находится в процессе выполнения, оно может и не иметь параметра END_DATE.)
  • REPEAT_INTERVAL — специфицирует, насколько часто Scheduler будет запускать задание. В листинге 1 выше интервал повторения указан 'FREQ=DAILY; INTERVAL=2'; это означает, что вы запускаете задание каждый второй день. Существуют два способа задания интервала повторения (оба обсуждаются в следующем разделе):
  • использование календарного выражения базы данных;
  • использование выражения даты/времени PL/SQL.
  • COMMENTS — позволяет включить любые комментарии о запланированном задании.
  • ENABLED — специфицирует, включено ли задание при его создании. Значением по умолчанию является FALSE, т.е. задание отключено; чтобы включить задание немедленно, установите ENABLED в TRUE.

 

Установка интервала повторения

Давайте рассмотрим два способа указания интервала повторения. Календарное выражение — простой способ, подобный выражению на английском языке; он состоит из трех компонентов, которые описаны ниже.

  • Частота. Это обязательный компонент календарного выражения, который идентифицируется ключевым словом FREQ. Возможные значения — YEARLY, MONTHLY, DAILY, HOURLY, MINUTELY и SECONDLY.
  • Интервал повторения. Этот интервал идентифицируется ключевым словом INTERVAL и указывает, насколько часто база данных должна повторять задание.
  • Спецификаторы. Предоставляют детальную информацию о том, когда должно запускаться задание. Возможные значения — BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY, BYHOUR, BYMINUTE и BYSECOND. Например, BYMONTHDAY указывает день месяца, когда должно быть запущено задание, а BYDAY — день недели.

Обратите внимание, что спецификаторы не обязательны, а компоненты интервала и частоты календарного выражения — обязательны. Вот некоторые типичные календарные выражения:

  • FREQ=DAILY; INTERVAL=3 — выполняет задание каждые три дня;
  • FREQ=HOURLY; INTERVAL=2 — выполняет задание каждый второй час;
  • FREQ=WEEKLY; BYDAY=MON — выполняет задание каждый понедельник;
  • FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI — выполняет задание каждую вторую пятницу;
  • FREQ=MONTHLY; BYMONTHDAY=1 — выполняет задание в последний день месяца.

Также можно задавать более сложные интервалы повторения, используя выражения PL/SQL, с условием, что все такие выражения должны в результате вычисления возвращать выражение типа даты или временной метки. Когда для задания интервала повторения применяется выражение даты/времени, в качестве значения интервала получается значение типа даты/времени: 

repeat_interval => 'FREQ=MINUTELY INTERVAL=30'

Приведенное выражение PL/SQL устанавливает, что Oracle будет выполнять задание каждые полчаса.

 

Задания администрирования

Пакет DBMS_SCHEDULER служит выполнения административных заданий. Включить и тем самым активизировать задание можно следующим образом:

SQL> EXEC DBMS_SCHEDULER.ENABLE('TEST_JOB1');
PL/SQL procedure successfully completed.

Отключается задание так:

SQL> EXEC DBMS_SCHEDULER.DISABLE('TEST_JOB1');
PL/SQL procedure successfully completed. 

Уничтожить задание можно процедурой DROP_JOB, как показано ниже:

SQL> BEGIN
DBMS_SCHEDULER.DROP_JOB( JOB_NAME => 'TEST_JOB1');
END; 

Задание можно запустить вручную (в неурочное время), используя процедуру RUN_JOB:

SQL> EXEC DBMS_SCHEDULER.RUN_JOB('TEST_JOB'); 

И, наконец, с помощью процедуры STOP_JOB можно немедленно остановить задание:

SQL> EXEC DBMS_SCHEDULER.STOP_JOB('TEST_JOB'); 

Совет. В обеих процедурах — STOP_JOB и RUN_JOB — можно использовать атрибут FORCE, который указывает на то, может ли быть остановлено или удалено выполняющееся задание. Установив FORCE в TRUE, можно остановить или удалить работающее задание (jobs). Значением FORCE по умолчанию является FALSE.


 

Управление легковесными заданиями

Когда нужно использовать Scheduler для частого запуска быстро выполняющегося задания, вместо заданий базы данных по умолчанию можно применять легковесные задания, что даст выигрыш в производительности. Легковесные задания не являются отдельными заданиями. Поскольку легковесные задания на самом деле не являются объектами схемы, с ними связаны намного меньшие накладные расходы. К тому же легковесные задания создаются быстрее, чем обычные; легковесные задания требуют меньше места для хранения метаданных и данных времени выполнения. Таким образом, за счет использования легковесных заданий получается выигрыш во времени и пространстве, если их нужно запускать в базе тысячи раз. Обычные задания обеспечивают большую гибкость и предполагают больше вариантов выполнения, и потому, если задание должно выполняться нечасто, то вместо легковесных заданий имеет смысл использовать обычные.

При создании легковесного задания необходимо использовать шаблон задания, причем такой шаблон должен содержать метаданные легковесного задания наряду с привилегиями, которые должны быть унаследованы этим легковесным заданием (jobs). В качестве шаблона задания можно применять хранимую процедуру или программу Scheduler. Чтобы специфицировать действие задания, нужно ссылаться на программу Scheduler. Типом программы должен быть PLSQL_BLOCK или STORED_PROCEDURE. Если у пользователя есть привилегии на программу, он автоматически получает привилегии на легковесное задание.

Для просмотра подробной информации о легковесном задании в базе данных применяется запрос, подобный показанному ниже: 

SQL> SELECT job_name, program_name FROM dba_scheduler_jobs
WHERE job_style='LIGHTWEIGHT';
JOB_NAME    PROGRAM_NAME
----------- -------------
TEST_JOB1   TEST_PROG1

В отличие от обычных заданий базы данных, легковесные задания не отображаются в представлении DBA_SCHEDULER_JOBS, поскольку легковесные задания не являются объектами схемы как обычные задания (jobs).

Легковесное задание создается подобно обычному заданию — с помощью процедуры CREATE_JOB. Просто укажите в параметре JOB_STYLE значение LIGHTWEIGHT вместо REGULAR (которое является значением по умолчанию). Ниже приведен пример создания легковесного задания:

begin
dbms_scheduler.create_job (
job_name        => 'test_ltwtjob1',
program_name    => 'test_prog',
repeat_interval => 'freq=daily,by_hour=10',
end_time        => '31-DEC-08 06:00:00 AM Australia/Sydney',
job_style       => 'lightweight',
comments        => 'A lightweight job based on a program');
end;

В данном примере программа test_prog служит шаблоном для легковесного задания TEST_LTWTJOB1. Вместо атрибутов REPEAT_INTERVAL и END_TIME можно также указать расписание.

Для создания набора легковесных заданий Scheduler можно использовать массив заданий. Массив заданий удобен, когда требуется создать большое количество заданий Scheduler. Следующий пример демонстрирует создание набора легковесных заданий посредством массива заданий.

1. Создайте две переменные — одну для определения задания Scheduler (jobs), а вторую для определения массива. 

declare
testjob sys.job;
testjobarr sys.job_array;

2. Воспользуйтесь конструктором sys.job_array для инициализации массива заданий:

begin
testjobarr := sys.job_array(); 

При инициализации массива заданий testobjarr, представляющего собой массив объектов типа JOB, база данных создает слот одиночного задания в этом массиве.

3. Установите размер массива заданий равным количеству заданий, которые собираетесь создать. 

testjobarr.extend(500);

Показанный здесь оператор выделяет место в массиве заданий для хранения информации о 500 заданиях.

4. Следующий код создает 500 заданий и помещает их в массив заданий (jobs):

for I in 1 . . . 500 loop
testjob := sys.job(job_name => 'TESTJOB'||TO_CHAR(I),
job_style             => 'LIGHTWEIGHT',
job_template          => 'TEST_PROG',
enabled               => TRUE);
testjobarr(i) := TESTJOB;
end loop;

Приведенный здесь код создает 500 заданий с использованием шаблона TEST_PROG. Эти задания добавляются в массив заданий операцией присваивания testjobarr(i).

5. Воспользуйтесь процедурой CREATE_JOBS для фиксации массива из 500 заданий:

dbms_scheduler.create_jobs (testjobarr, 'transactional'); 

Процедура CREATE_JOBS создает все 500 заданий за раз. В данном примере было решено создать легковесные задания как часть массива, специфицируя LIGHTWEIGHT в качестве значения параметра JOB_STYLE при создании массива заданий. Если не указать параметр JOB_STYLE, можно создать массив обычных заданий вместо легковесных, поскольку значением JOB_STYLE по умолчанию является REGULAR.

 

Управление внешними заданиями

Внешние задания — это исполняемые программы операционной системы, которые запускаются за пределами базы данных. Для внешнего задания в качестве значения параметра JOB_TYPE указывается EXECUTABLE. При использовании для внешнего задания именованной программы в атрибуте JOB_ACTION или PROGRAM_ACTION потребуется указать полный путь к каталогу, где хранится эта исполняемая программа, например /usr/local/bin/perl.

Можно создавать локальные внешние задания и удаленные внешние задания. Локальное внешнее задание запускается на том же сервере, на котором находится база данных, а удаленное внешнее задание — на удаленном хосте. Удаленное внешнее задание применяется для управления заданиями по всей сети из единой базы данных. Что интересно — при этом вам даже не обязательно иметь запущенные экземпляры Oracle на удаленных хостах. Потребуется лишь инсталлировать Scheduler Agent на каждом из удаленных хостов, где нужно запускать внешние задания (jobs), чтобы он принимал запросы на задания от исходной базы данных, выполнял их на удаленном хосте и передавал результаты в исходную базу данных.

Запуск локальных внешних заданий прост. Все, что нужно — это указать значение EXECUTABLE для аргумента JOB_TYPE или PROGRAM_TYPE. Чтобы запускать удаленные внешние задания, необходимо инсталлировать и сконфигурировать агент планировщика (Scheduler Agent), а также назначить мандат для выполнения удаленных заданий. В последующих разделах описаны все шаги по настройке удаленного внешнего задания.

 

Настройка базы данных

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

1. Поскольку для запуска удаленного внешнего задания понадобится Oracle XML DB, сначала проверьте, успешно ли инсталлирована Oracle XML DB, запустив следующую команду DESCRIBE:

SQL> desc resource_view
Name              Null?  Type
----------------- -----  ----------------------------
RES
XMLTYPE                  (XMLSchema "http://xm
                         lns.oracle.com/xdb/XDBResour
                         ce.xsd" Element "Resource")
ANY_PATH                 VARCHAR2(4000)
RESID                    RAW(16)
SQL>

Команда DESCRIBE показывает, что Oracle XML DB корректно инсталлирована. Если отображается иное, прежде чем продолжить работу, нужно будет инсталлировать Oracle XML DB.

2. Выполните предоставленный Oracle сценарий prvtsch.plb, расположенный в каталоге $ORACLE_HOME/rdbms/admin:

SQL> connect sys/sammyy1 as sysdba
SQL> @$ORACLE_HOME/rdbms/admin/prvtrsch.plb
PL/SQL procedure successfully completed.
. . .
PL/SQL procedure successfully completed.
no rows selected
Package created.
Package body created.
No errors.
. . .
User altered.
SQL>

3. И, наконец, установите регистрационный пароль для Scheduler Agent:

SQL> EXEC dbms_scheduler.set_agent_registration_pass(
registration_password => 'sammyy1'.-
expiration_date => systimestamp + interval '7' day,-
max_uses => 25)
PL/SQL procedure successfully completed.
SQL> 

Scheduler Agent использует пароль для регистрации в базе данных. Параметры EXPIRATION_DATE и MAX_USES показывают, соответственно, срок действия пароля (дату, до которой он действителен) и сколько он может быть использован.

Инсталляция и конфигурирование Scheduler Agent

Scheduler Agent потребуется инсталлировать на каждый удаленный хост, где планируется запускать внешние задания. Программное обеспечение для инсталляции можно либо загрузить с сайта Oracle, либо воспользоваться комплектом Database CD. В любом случае понадобится инсталляционный носитель для Oracle Database Gateway. Ниже перечислены шаги, которые необходимо выполнить для инсталляции Scheduler Agent.

  1. Войдите в систему как владелец программного обеспечения Oracle (обычно пользователь oracle).
  2. Перейдите в место хранения инсталляционных файлов Oracle Database Gateway и введите следующую команду для запуска универсального инсталлятора Oracle: 
    $ /oracle11g/gateways/runInstaller
  3. На экране приглашения щелкните на кнопке Next (Далее).
  4. На странице Select a Product (Выберите продукт) выберите Oracle Scheduler Agent 11.10.0.6.0 и щелкните на кнопке Next.
  5. На странице Specify Home Details (Укажите детальную информацию о домашнем каталоге) выберите имя и укажите путь к домашнему каталогу Oracle Scheduler Agent. Щелкните на кнопке Next.
  6. На странице Oracle Scheduler Agent (Агент планировщика Oracle) укажите имя хоста и номер порта, который должен использовать агент для взаимодействия с базой данных, выдавшей запрос на внешнее задание (jobs). Щелкните на кнопке Next.
  7. На странице Summary (Сводка) проверьте установки и щелкните на кнопке Install (Инсталлировать).

Внимание! Для автоматизации процесса установки Scheduler Agent на большое количество хостов можно использовать молчаливую инсталляцию.


  1. Когда инсталлятор предложит запустить сценарий root.sh от имени пользователя root, сделайте это и щелкните на кнопке OK.
  2. Щелкните на кнопке Exit (Выход) на странице End of Installation (Конец инсталляции).

Для запуска Scheduler Agent служит исполняемый файл schagent. Однако сначала потребуется зарегистрировать агент в базе данных, откуда хотите запускать внешние задания на хосте, где был установлен Scheduler Agent. Вот как регистрируется Scheduler Agent в базе данных:

$ schagent –registerdatabase prod1 1522

В этом примере хост базы данных называется prod1, а номером порта, назначенного Scheduler Agent, является 1522. После выдачи этой команды появится приглашение указать пароль регистрации агента, созданного ранее:

$./schagent -registerdatabase localhost.localdomain 1522
Agent Registration Password ? ******
$

Запускается Scheduler Agent с помощью следующей команды:

$./schagent –start
Scheduler agent started
$ 

Остановить агент можно такой командой:

$./schagent –stop
Scheduler agent stopped
$ 

Приведенный выше пример демонстрирует работу с Scheduler Agent в системе UNIX/Linux. Прежде чем можно будет пользоваться агентом, потребуется установить службу OracleSchedulerExecutionAgent. Эта служба инсталлируется следующим образом: 

$ schagent –installagentservice

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

 

Создание и включение удаленных внешних заданий

Поскольку внешнее задание должно выполняться как задание пользователя операционной системы, Scheduler позволяет назначать мандаты операционной системы внешнему заданию. Используется мандат, который является объектом схемы, содержащим комбинацию имени и пароля пользователя, от имени которого будет выполняться это задание.

Для локальных внешних заданий указывать мандаты не обязательно, хотя в Oracle и рекомендуют это делать. Прежде чем можно будет создать удаленное внешнее задание, потребуется создать мандат. Объект мандата можно назначить пользователю, от имени которого будет запускаться внешняя исполняемая программа. Обратите внимание, что пользователь должен обладать привилегиями на выполнение объекта мандата, чтобы иметь возможность применять его для запуска задания (jobs).

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

1. Сначала выполните процедуру CREATE_CREDENTIAL для создания объекта мандата:

SQL> exec dbms_scheduler.create_credential('hrcredential, 'hr','sammyy1');

2. Выдайте привилегии на вновь созданный мандат пользователю, которому нужно будет его использовать:

SQL> grant execute on system.hrcrdential to sam; 

Для просмотра всех мандатов в базе данных можно запросить представление DBA_SCHEDULER_VIEW.

3. Создайте удаленное внешнее задание, выполнив процедуру CREATE_JOB:

SQL> begin
2 dbms_scheduler.create_job(
3 job_name           => 'remove_logs',
4 job_type           => 'executable',
5 job_action         => '/u01/app/oracle/logs/removelogs',
6 repeat_interval    => 'freq=daily; byhour=23',
7 enabled => false);
8* end;
SQL> /
PL/SQL procedure successfully completed.
SQL> 

4. Создав удаленное внешнее задание REMOVE_LOGS, с помощью процедуры SET_ATTRIBUTE установите атрибут CREDENTIAL_NAME этого удаленного задания:

SQL> exec dbms_scheduler.set_attribute('remove_logs',
'credential_name','hrcredential');
PL/SQL procedure successfully completed.
SQL> 

5. Снова выполните процедуру SET_ATTRIBUTE, на этот раз, чтобы установить атрибут DESTINATION:

SQL> exec dbms_scheduler.set_attribute('remove_logs',
'destination', 'localhost.localdomain:1521');
PL/SQL procedure successfully completed.
SQL> 

6. Выполните процедуру ENABLE для включения внешнего задания:

SQL> exec dbms_scheduler.enable('remove_logs');
PL/SQL procedure successfully completed.
SQL> 

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

SQL> drop user remote_scheduler_agent cascade;

Затем, чтобы база данных снова могла запускать удаленные внешние задания (jobs), придется заново запустить сценарий prvtsch.plb.

 

Управление программами

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

 

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

Новая программа создается с использованием процедуры CREATE_PROGRAM из пакета DBMS_SCHEDULER, как показано ниже: 

SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_PROGRAM(
3 PROGRAM_NAME     => 'MY_PROGRAM',
4 PROGRAM_ACTION   => 'UPDATE_SCHEMA_STATS',
5 PROGRAM_TYPE     => 'STORED_PROCEDURE',
6 enabled          => TRUE);
7* end;
SQL> /
PL/SQL procedure successfully completed.
SQL>

После создания программы можно упростить оператор создания задания, заменив атрибуты JOB_TYPE и JOB_ACTION именем программы, которая уже содержит спецификацию этих атрибутов. Атрибуты PROGRAM_TYPE и PROGRAM_ACTION заменяют атрибуты задания, которые обычно указываются при создании нового задания. Такого модульный подход дает преимущество — разные задания могут использовать одну и ту же программу, чем упрощается создание новых заданий.

В следующем примере пересоздается задание TEST_JOB, которое было создано в листинге 1, но на этот раз с использованием компонента-программы: 

SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB(
3 JOB_NAME         => 'TEST_JOB',
4 PROGRAM_NAME     => 'TEST_PROGRAM',
5 REPEAT_INTERVALl => 'FREQ=DAILY;BYHOUR=12',
6 ENABLED          => TRUE);
7* END;
SQL> /
PL/SQL procedure successfully completed.
SQL>

В приведенном примере использование программы позволяет избежать необходимости указывать параметры JOB_TYPE и JOB_ACTION в операторе CREATE_JOB.

 Oracle scheduler - позволяет выполнять задания jobs в базе данных Oracle

 

Администрирование программ

Вы можете включать, отключать и удалять программы Scheduler с помощью различных процедур из пакета DBMS_SCHEDULER, как показано в последующих примерах.

Процедура ENABLE используется для включения программы Scheduler:

SQL> EXEC DBMS_SCHEDULER.ENABLE('TEST_PROGRAM');
PL/SQL procedure successfully completed.

Соответственно, для отключения программы применяется процедура DISABLE:

SQL> EXEC DBMS_SCHEDULER.DISABLE('TEST_PROGRAM');
PL/SQL procedure successfully completed.
SQL> 

Процедура DROP_PROGRAM служит для удаления программы:

SQL> EXEC DBMS_SCHEDULER.DROP_PROGRAM('TEST_PROGRAM');
PL/SQL procedure successfully completed.
SQL> 

 

Управление расписаниями

Предположим, что имеется множество заданий (jobs), выполняемых в одно и то же время. Используя общее расписание, можно упростить создание и управление такими заданиями. В следующем разделе будет объяснено, как управлять расписаниями.

 

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

Для создания расписания применяется процедура CREATE_SCHEDULER из пакета DBMS_SCHEDULER

SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_SCHEDULE(
3 SCHEDULE_NAME => 'TEST_SCHEDULE',
4 START_DATE => SYSTIMESTAMP,
5 END_DATE => SYSTIMESTAMP + 90,
6 REPEAT_INTERVAL => 'FREQ=HOURLY;INTERVAL= 4',
7 COMMENTS => 'Every 4 hours');
8* END;
SQL> /
PL/SQL procedure successfully completed
SQL>

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

  • Процедура CREATE_SCHEDULE имеет три важных параметра: START_DATE, END_DATE и REPEAT_INTERVAL.
  • Время начала и конца расписания задается с использованием типа данных TIMESTAMP WITH TIME ZONE.
  • Для указания интервала повторения необходимо применять календарное выражение.

Создав расписание TEST_SCHEDULE, можно еще более упростить процесс создания заданий, используя и программу, и расписание, как показано ниже: 

SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB(
3 JOB_NAME => 'MY_JOB',
4 PROGRAM_NAME => 'MY_PROGRAM',
5 SCHEDULE_NAME => 'MY_SCHEDULE');
6 END;
7 /
PL/SQL procedure successfully completed.
SQL>

Как видите, применение сохраняемых расписаний и программ превращает создание нового задания в пару пустяков.

 

Администрирование расписаний

Изменять различные атрибуты расписания можно с помощью процедуры SET_ATTRIBUTE из пакета DBMS_SCHEDULER. Модификации доступны любые атрибуты, за исключением имени самого расписания.

Удаляется расписание процедурой DROP_SCHEDULE, как показано ниже: 

SQL> BEGIN
2 DBMS_SCHEDULER.DROP_SCHEDULE (SCHEDULE_NAME => 'TEST_SCHEDULE');
3 END;
4 /
PL/SQL procedure successfully completed.
SQL>

Если расписание, которое планируется удалить, используется окном или заданием, то попытка удаления такого расписания по умолчанию закончится ошибкой. Тем не менее, можете заставить базу данных все равно удалить это расписание, указав в предыдущем примере дополнительный параметр FORCE со значением TRUE.


Совет. При создании расписания Oracle предоставляет к нему PUBLIC-доступ, тем самым по умолчанию разрешая всем пользователям применять это расписание.


 

Управление цепочками

Цепочка Scheduler состоит из набора взаимосвязанных программ, которые запускаются в заданной последовательности. Относительные позиции в цепочке называются “шагами”, причем каждый шаг указывает на другую цепочку, программу или событие. Цепочка включает “правила”, определяющие то, что должно быть сделано на каждом шаге цепочки.

Давайте создадим простую цепочку Scheduler, начиная с создания объекта цепочки, после чего добавим к ней шаги и правила.

 

Создание цепочки

Поскольку цепочки Scheduler используют объекты Oracle Streams Rules Engine, для создания цепочки пользователь должен иметь как привилегии CREATE JOB, так и привилегии Rules Engine. Выдать все необходимые привилегии Rules Engine можно с помощью приведенного ниже оператора, который выдает привилегии пользователю nina:

SQL> BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(DBMS_RULE_ADM.CREATE_RULE_OBJ, 'nina'),
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE (
DBMS_RULE_ADM.CREATE_RULE_SET_OBJ, 'nina'),
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE (
DBMS_RULE_ADM.CREATE_EVALUATION_CONTEXT_OBJ, 'nina')
END;

Теперь, имея необходимые привилегии, создадим цепочку Scheduler по имени TEST_CHAIN с использованием процедуры CREATE_CHAIN

SQL> BEGIN
DBMS_SCHEDULER.CREATE_CHAIN (
chain_name          => 'test_chain',
rule_set_name       => NULL,
evaluation_interval => NULL,
comments            => NULL);
END;

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

SQL> BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_STEP('test_chain', 'step1', 'program1');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP('test_chain', 'step2', 'program2');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP('test_chain', 'step3', 'program3');
END;

И, наконец, чтобы запустить цепочку в действие, с помощью процедуры DEFINE_CHAIN_RULE к ней нужно добавить правила. Правила цепочки определяют, когда цепочка запускается, и специфицируют условия, при которых запускается каждый шаг. Обычно правило, на котором базируется шаг цепочки, состоит в выполнении определенных условий. Вот пример: 

SQL> BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_RULE('test_chain', 'TRUE', 'START step1');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE('test_chain', 'step1 COMPLETED',
'Start step2, step3');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE('test_chain',
'step2 COMPLETED AND step3 COMPLETED', 'END');
END;

Первое правило в приведенном примере указывает, что должен выполниться шаг step1, а это означает, что Scheduler запустит program1. Второе правило говорит о том, что шаги step2 (program2) и step3 (program3) будут запущены только при условии успешного завершения шага step1 ('step1 COMPLETED'). Последнее правило говорит о том, что по завершении step2 и step3 цепочка закончится.

 

Включение цепочки

Прежде чем использовать цепочку, ее необходимо включить. Вот как это делается: 

SQL> BEGIN
     DBMS_SCHEDULER.ENABLE ('test_chain');
     END;

 

Встраивание заданий в цепочку

Для того чтобы запустить задание внутри цепочки Scheduler, нужно создать задание с атрибутом JOB_TYPE, установленным в CHAIN, и атрибутом JOB_ACTION, указывающим на имя определенной цепочки, которую необходимо использовать. Разумеется, это означает, что сначала следует создать цепочку.


Вот как выглядит синтаксис создания задания для цепочки Scheduler: 

SQL> BEGIN
DBMS_SCHEDULER.CREATE_JOB (
JOB_NAME => 'test_chain_job',
JOB_TYPE => 'CHAIN',
JOB_ACTION => 'test_chain',
REPEAT_INTERVAL => 'freq=daily;byhour=13;byminute=0;bysecond=0',
ENABLED => TRUE);
END;

С использованием процедуры RUN_CHAIN можно запустить цепочку без предварительного создания задания. Эта процедура создаст временное задание и немедленно запустит цепочку. Ниже показано, как это делается: 

SQL> BEGIN
DBMS_SCHEDULER.RUN_CHAIN (
CHAIN_NAME     => 'my_chain1',
JOB_NAME       => 'quick_chain_job',
START_STEPS    => 'my_step1, my_step2');
END;

Как и с другими компонентами Scheduler, здесь существуют процедуры, позволяющие удалить цепочку, удалить правила из цепочки, отключить цепочку, изменить ее и т.д. За всеми подробностями обращайтесь в раздел руководства Oracle PL/SQL Packages and Types Reference (Справочник по пакетам и типам PL/SQL), посвященный DBMS_SCHEDULER.

 

Управление событиями

До сих пор было показано, как создаются задания с расписанием и без. При создании задания без расписания должно быть указано время запуска и частота повторений, в то время как применение расписаний позволяет исключить эти сведения из спецификации задания. В обоих случаях время задания базируется на календарном времени. Однако можно создавать также задания и расписания, основанные только на событиях, а не на календарном времени. В следующих разделах мы кратко рассмотрим задания и расписания на основе событий.

 

Создание задания на базе события

В следующем примере показано, как создается задание Scheduler с использованием программы и события. Задание будет запущено при возникновении события FILE_ARRIVAL

SQL> BEGIN
dbms_scheduler.create_job(
JOB_NAME        => test_job,
PROGRAM_NAME    => test_program,
START_DATE      => '01-AUG-08 5.00.00AM US/Pacific',
EVENT_CONDITION => 'tab.user_data.event_name = ''FILE_ARRIVAL''',
QUEUE_SPEC      => 'test_events_q'
ENABLED         => TRUE,
COMMENTS        => 'An event based job');
END;

В приведенной процедуре CREATE_JOB есть два незнакомых параметра; оба они уникальны для заданий на основе событий.

  • EVENT_CONDITION. Атрибут EVENT_CONDITION представляет собой условное выражение, которое берет свои значения из таблицы очереди источника событий и использует правила Oracle Streams Advanced Queuing. В этом выражении указываются атрибуты объектов, и они снабжаются префиксом tab.user_data. Загляните в описание пакета DBMS_AQADM, чтобы узнать больше о Oracle Streams Advanced Queuing и связанных с этим правилах.
  • QUEUE_SPEC. Атрибут QUEUE_SPEC определяет очередь, в которую будет помещено событие, инициирующее задание. В приведенном примере test_events_q — имя очереди.

 

Создание расписаний на базе событий

В следующем примере показано, как создается расписание на основе события. Всякий раз, когда возникает событие (FILE_ARRIVAL), Scheduler запускает задание, основанное на расписании, которое создано в этом примере. В данном случае событие указывает на поступление файла до полудня. 

SQL> BEGIN
dbms_scheduler.create_event_schedule(
SCHEDULE_NAME   => 'appowner.file_arrival',
START_DATE      => systimestamp,
EVENT_CONDITION => 'tab.user_data.object_owner = ''APPOWNER''
AND tab.user_data.event_name = ''FILE_ARRIVAL''
AND extract hour FROM tab.user_data.event_timestamp < 12',
QUEUE_SPEC     => 'test_events_q');
END;

В предыдущем примере вы уже видели применение EVENT_CONDITION и QUEUE_SPEC.

 

Управление расширенными компонентами Scheduler

До сих пор вы изучали управление базовыми компонентами Scheduler — заданиями, программами, расписаниями, цепочками и событиями. В этом же разделе мы рассмотрим управление расширенными компонентами Oracle Scheduler — классами заданий и окнами (а также группами окон).

Вы уже видели, как Scheduler использует средства Database Resource Manager, такие как группы потребителей ресурсов и планы ресурсов, чтобы эффективно распределять дефицитные ресурсы операционной системы и базы данных. Очень часто случается так, что сложные пакетные задания выходят за пределы выделенного им окна и распространяются на рабочее время, когда транзакции OLTP требуют львиной доли ресурсов. Назначение приоритетов заданиям для обеспечения адекватного использования ресурсов — важнейшее требование в рабочих базах данных. Scheduler для назначения приоритетов использует концепции классов заданий и окон.

 

Управление классами заданий

С помощью классов заданий заданиям устанавливаются приоритеты, что позволяет дифференцированно выделять ресурсы различным группам заданий. Планировщик ассоциирует каждый класс заданий с группой потребителей ресурсов, что позволяет ему определять соответствующее выделение ресурсов для каждого из таких классов. Возможность ассоциировать классы заданий с группами потребителей ресурсов, созданных Database Resource Manager, помогает в назначении приоритетов заданиям.


На заметку! Все задания должны относиться к определенному классу. Существует класс заданий по умолчанию — DEFAULT_JOB_CLASS, — к которому по умолчанию относятся все задания, если они явно не отнесены к какому-то другому классу. Класс заданий будет ассоциирован по умолчанию с DEFAULT_CONSUMER_GROUP, если вы не назначите его явно в другую группу потребителей ресурсов.


 

Создание класса заданий

Все классы заданий создаются в схеме SYS, независимо от того, кто из пользователей создает их. В следующем примере используется процедура CREATE_JOB_CLASS для создания нового класса заданий по имени ADMIN_JOBS:

SQL> BEGIN
DBMS_SCHEDULER.CREATE_JOB_CLASS(
JOB_CLASS_NAME          => 'admin_jobs'
RESOURCE_CONSUMER_GROUP => 'admin_group',
LOGGING_LEVEL           => dbms_scheduler.logging_runs
LOG_HISTORY             => 15);
END;

В приведенном примере используются перечисленные ниже атрибуты.

JOB_CLASS_NAME. Имя класса заданий.

RESOURCE_CONSUMER_GROUP. Этот атрибут указывает, что все задания, являющиеся членами этого класса, будут назначены в группу потребителей ресурсов ADMIN_GROUP.

LOGGING_LEVEL. Этот атрибут может принимать следующие три значения.

DBMS_SCHEDULER.LOGGING_OFF. Специфицирует отсутствие какого-либо ведения журналов для заданий этого класса.

DBMS_SCHEDULER.LOGGING_RUNS. Специфицирует детальные записи в журнале для каждого запуска задания.

DBMS_SCHEDULER.LOGGING_FULL. Специфицирует детальные записи о каждом запуске задания из данного класса, как и для всех прочих операций в задании, включая создание, удаление, изменение, включение и отключение заданий.


На заметку! Значение DBMS_SCHEDULER.LOGGING_FULL для атрибута LOGGING_LEVEL предоставляет большую часть информации о заданиях класса; уровень ведения журналов по умолчанию — DBMS_SCHEDULER.LOGGING_RUNS.


  • LOG_HISTORY. Этот атрибут указывает количество дней, в течение которых база данных будет сохранять журналы, прежде чем очистить их автоматически запланированным заданием PURGE_LOG. Очищать журналы можно также вручную, применяя процедуру PURGE_LOG пакета DBMS_SCHEDULER.

Процедура PURGE_LOG пакета DBMS_SCHEDULER принимает два важных параметра — LOG_HISTORY и WHICH_LOG. Параметр LOG_HISTORY служит для спецификации количества дней, в течение которых будут храниться журналы перед тем, как Scheduler очистит их. Параметр WHICH_LOG позволяет указать, хотите ли вы очищать задание. Например, чтобы очистить журналы всех заданий старше 14 дней, следует применить такой оператор: 

SQL> EXEC DBMS_SCHEDULER.PURGE_LOG(LOG_HISTORY=14, WHICH_LOG='JOB_LOG');

 

Удаление класса заданий

Класс заданий удаляется с помощью процедуры DROP_JOB_CLASS, как показано ниже:

SQL> BEGIN
DBMS_SCHEDULER.DROP_JOB_CLASS('TEST_CLASS');
END; 

Совет. Для удаления классов заданий вместе с принадлежащими к ним заданиями потребуется специфицировать опцию FORCE=TRUE. Если задание в данный момент выполняется, ему будет позволено завершиться, прежде чем будет отключен удаляемый класс заданий.


 

Изменение атрибутов класса заданий

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

SQL> BEGIN
2 DBMS_SCHEDULER.ALTER_ATTRIBUTES(
3 NAME      => 'ADMIN_JOBS',
4 ATTRIBUTE => 'START_DATE',
5 VALUE     => '01-JUL-2008 9:00:00 PM US/Pacific');
6* END;
SQL>

 

Изменение планов ресурсов, использующих окна

Окном называется интервал с определенным временем начала и конца, такой как “с полуночи до 6 утра”. Однако окно — это не просто хронологическая характеристика вроде расписания, которое указывает момент, когда будет запущено задание. Каждое окно ассоциировано с планом ресурсов. При создании окна в качестве параметра специфицируется план ресурсов. Возможность активизировать различные планы ресурсов в разное время — это то, что делает окна специальными объектами планирования, которые позволяет назначать приоритеты.

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


На заметку! Все окна создаются в схеме SYS, независимо от пользователя, создающего их. Для управления окнами необходимо располагать системной привилегией MANAGE SCHEDULER.


Окно Scheduler состоит из следующих трех основных атрибутов.

  • Время начала, время конца и интервал повторения. Эти атрибуты определяют, когда и насколько часто будет открываться и закрываться окно (т.е. задают время действия окна).
  • Длительность. Задает продолжительность времени, в течение которого окно остается открытым.
  • План ресурсов. Задает приоритеты ресурсов между классами заданий.

На заметку! Представление V$RSRC_PLAN предоставляет информацию о текущих активных планах ресурсов в базе данных.


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

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

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

SQL> SELECT window_name, resource_plan, enabled, active
2 FROM DBA_SCHEDULER_WINDOWS;
WINDOW_NAME       RESOURCE_PLAN         ENABLED  ACTIVE
----------------  --------------------  -------  -------
TEST_WINDOW       TEST_RESOURCEPLAN     TRUE     FALSE
. . .
SQL>

Здесь видно, что окно TEST_WINDOW включено, но в данный момент не активно.

 

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

Окно создается с использованием процедуры CREATE_WINDOW. Давайте рассмотрим два примера применения этой процедуры: один с встроенной спецификацией времени начала, конца и интервала повторения, и другой — с использованием сохраненного расписания вместо указания этих трех атрибутов планирования.

В первом примере оператор создания окна специфицирует расписание для окна: 

SQL> BEGIN
DBMS_SCHEDULER.CREATE_WINDOW(
WINDOW_NAME       => 'MY_WINDOW',
START_DATE        => '01-JUN-08 12:00:00AM',
REPEAT_INTERVAL   => 'FREQ=DAILY',
RESOURCE_PLAN     => 'TEST_RESOURCEPLAN',
DURATION          => interval '60' minute,
END_DATE          => '31-DEC-08 12:00:00AM',
WINDOW_PRIORITY   => 'HIGH',
COMMENTS          => 'Test Window');
END;

Рассмотрим индивидуальные атрибуты нового окна, созданного в предыдущем операторе.

  • RESOURCE_PLAN. Этот атрибут специфицирует, что на то время, пока это окно открыто, выделение ресурсов для всех заданий, запускаемых в этом окне, будет управляться директивами плана ресурсов TEST_RESOURCEPLAN.
  • WINDOW_PRIORITY. Этот атрибут установлен в HIGH, а уровнем приоритета по умолчанию является LOW; это единственная пара допустимых значений. Если два окна перекрываются, то окно с более высоким приоритетом имеет преимущество. В каждый данный момент времени может быть открыто только одно окно, и потому, когда они перекрываются, высокоприоритетное окно открывается, а низкоприоритетное — нет.
  • START_DATE. Установка этого атрибута специфицирует, что окно впервые активизируется в 12:00 дня 1 июня 2008 г. Можно также сказать, что окно открывается в это время.
  • DURATION. Этот атрибут говорит о том, что окно останется открытым в течение 60-минутного периода, после чего будет закрыто.
  • REPEAT_INTERVAL. Этот атрибут специфицирует следующее время, когда окно будет вновь открыто. В данном примере это 12:00 2 июня 2008 г.
  • END_DATE. Этот атрибут специфицирует, что данное окно будет открыто последний раз 31 декабря 2008 г., после чего будет отключено и закрыто.

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


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

SQL> BEGIN
DBMS_SCHEDULER.CREATE_WINDOW(
WINDOW_NAME       => 'TEST_WINDOW',
SCHEDULE_NAME     => 'TEST_SCHEDULE',
RESOURCE_PLAN     => 'TEST_RESOURCEPLAN',
DURATION          => interval '180' minute,
COMMENTS          => 'Test Window');
END; 

В приведенном вызове процедуры CREATE_WINDOW использование расписания TEST_SCHEDULE позволяет избежать необходимости в указании параметров START_DATE, END_DATE и REPEAT_INTERVAL.


На заметку! Окно автоматически включается при создании.


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

 

Управление окнами

Открывать, закрывать, изменять, включать, выключать или удалять окна можно с помощью соответствующих процедур из пакета DBMS_SCHEDULER, и для выполнения всех этих заданий понадобится привилегия MANAGE SCHEDULER. Обратите внимание, что поскольку все окна создаются в схеме SYS, при обращении к окну всегда должен использоваться синтаксис [SYS].имя_окна.

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

Ниже показан пример открытия окна вручную: 

SQL> EXECUTE DBMS_SCHEDULER.OPEN_WINDOW(
WINDOW_NAME => 'BACKUP_WINDOW',
DURATION => '0 12:00:00');
SQL>

Взгляните на атрибут DURATION в предыдущем операторе. Когда вы специфицируете продолжительность, то можете указать дни, часы, минуты и секунды — именно в таком порядке. Таким образом, данная установка означает 0 дней, 12 часов, 0 минут и 0 секунд.

Можно также открывать уже открытое окно. Если сделать это, оно останется открытым в течение периода, заданного атрибутом DURATION. То есть если вы откроете окно, которое уже было открыто в течение 30 минут, и его продолжительность установлена в 60 минут, это окно останется открытым в течение начальных 30 минут плюс дополнительные 60 минут, итого — 90 минут.

Для закрытия окна используется процедура CLOSE_WINDOW, как иллюстрирует следующий пример: 

SQL> EXECUTE DBMS_SCHEDULER.CLOSE_WINDOW('BACKUP_WINDOW');

Если на момент закрытия окна задание еще выполняется, оно будет продолжено до завершения. Однако если вы создадите задание с атрибутом STOP_ON_WINDOW_CLOSE, установленным в TRUE, это работающее задание будет закрыто сразу при закрытии его окна. Для отключения окна служит процедура DISABLE:

SQL> EXECUTE DBMS_SCHEDULER.DISABLE (NAME => 'BACKUP_WINDOW');

Вы можете отключить окно только в том случае, если ни одно задание не использует его, или если окно не открыто. Если же окно открыто, его можно отключить с помощью процедуры DISABLE с атрибутом FORCE=TRUE.

Для удаления окна применяется процедура DROP_WINDOW. Если задание, ассоциированное с окном, выполняется, то процедура DROP_WINDOW продолжится до завершения, после чего только окно будет отключено. Однако если установить атрибут STOP_ON_WINDOW_CLOSE в TRUE, задание остановится немедленно при удалении ассоциированного окна. При использовании установки FORCE=TRUE отключаются все задания, использующие это окно.

 

Назначение приоритетов заданиям

Каждый класс заданий Scheduler можно отобразить на определенную группу потребителей ресурсов. План ресурсов назначается группе потребителей ресурсов и, следовательно — каждому классу заданий, с помощью Database Resource Manager. Активный план ресурсов (определяемый текущим открытым окном) выделит ресурсы группе, с разными уровнями ресурсов для разных заданий, на основе их класса заданий.

Scheduler тесно взаимодействует с Database Resource Manager, обеспечивая правильное выделение ресурсов заданиям. Scheduler запустит задание только при наличии достаточного количества ресурсов для его выполнения.

Внутри каждого окна Scheduler можно иметь несколько работающих заданий, с разными уровнями приоритета. Приоритеты назначаются заданиям на двух уровнях —класса и задания. Назначение приоритетов на уровне класса основано на ресурсах, выделенных каждой группе потребителей ресурсов текущим активным планом распределения ресурсов. Например, класс FINANCE_JOBS может иметь преимущество перед классом ADMIN_JOBS в отношении выделяемых ресурсов, продиктованных его активным планом распределения ресурсов. Внутри классов FINANCE_JOBS и ADMIN_JOBS присутствуют несколько индивидуальных заданий. С помощью процедуры SET_ATTRIBUTES можно изменять приоритет любого задания, как показано ниже:

SQL> BEGIN
dbms_scheduler.SET_ATTRIBUTE(
NAME => 'test_job',
ATTRIBUTE => 'job_priority',
VALUE => 1);
END;

Значение приоритета задания по умолчанию равно 3, что можно проверить следующим запросом:

SQL> SELECT job_name, job_priority FROM dba_scheduler_jobs;
JOB_NAME                                JOB_PRIORITY
------------------------------  --------------------
ADV_SQLACCESS1523128                               3
ADV_SQLACCESS5858921                               3
GATHER_STATS_JOB                                   3
PURGE_LOG                                          3
TEST_JOB03                                         3
TEST_JOB1                                          3
6 rows selected
SQL> 

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

 

Приоритеты окон

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

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

 

Группы окон

Группой окон называется коллекция окон, являющаяся частью схемы SYS. Группы окон — необязательные сущности, и какое-нибудь окно можно сделать частью группы окон при ее создании, либо же добавить окна в группу позднее. В качестве расписания для задания можно специфицировать единственное окно или группу окон.

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

 

Управление атрибутами Scheduler

В начальных разделах этой главы уже было показано, как использовать процедуру SET_ATTRIBUTE для модификации различных компонентов Scheduler. Такие атрибуты, как JOB_NAME и PROGRAM_NAME, уникальны для компонентов задания и программы.

Извлечь атрибуты любого компонента Scheduler можно с помощью процедуры GET_SCHEDULER_ATTRIBUTE из пакета DBMS_SCHEDULER.

Отмена установки атрибутов компонента

Процедура SET_ATTRIBUTE_NULL служит для установки атрибутов компонента Scheduler в NULL. Например, для отмены установки атрибута COMMENTS программы TEST_PROGRAM можно воспользоваться следующим кодом: 

SQL> EXECUTE dbms_scheduler.SET_ATTRIBUTE_NULL('TEST_PROGRAM', 'COMMENTS');

 

Изменение атрибутов компонентов

Существуют некоторые атрибуты, общие для всех компонентов Scheduler. Процедура SET_SCHEDULER_ATTRIBUTE позволяет устанавливать эти общие, или глобальные, значения атрибутов, что затрагивает все компоненты Scheduler. Общие атрибуты включают часовой пояс по умолчанию, период хранения журнала хронологии и максимальное количество рабочих процессов задания.

 

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

Существует несколько динамических представлений, которые можно использовать для мониторинга заданий Scheduler, и ниже кратко описаны важнейшие из них.

 

DBA_SCHEDULER_JOBS

Представление DBA_SCHEDULER_JOBS показывает состояние и общую информацию о запланированных заданиях в базе данных. Вот простой запрос к этому представлению: 

SQL> SELECT job_name, program_name
2 FROM DBA_SCHEDULER_JOBS;
JOB_NAME                PROGRAM_NAME
-----------------  -----------------
PURGE_LOG             PURGE_LOG_PROG
GATHER_STATS_JOB   GATHER_STATS_PROG
. . .
SQL>

 

DBA_SCHEDULER_RUNNING_JOBS

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

 

DBA_SCHEDULER_JOB_RUN_DETAILS

Представление DBA_SCHEDULER_JOB_RUN_DETAILS можно использовать для проверки состояния и длительности выполнения всех заданий в базе данных, например: 

SQL> SELECT job_name, status, run_duration
2* FROM DBA_SCHEDULER_JOB_RUN_DETAILS;
JOB_NAME           STATUS      RUN_DURATION
-----------------  ----------  -------------
PURGE_LOG          SUCCEEDED   +000 00:00:02
PURGE_LOG          SUCCEEDED   +000 00:00:04
GATHER_STATS_JOB   SUCCEEDED   +000 00:31:18
SQL>

 

DBA_SCHEDULER_SCHEDULES

Представление DBA_SCHEDULER_SCHEDULES содержит информацию обо всех текущих расписаниях заданий в базе данных, как показано ниже:

SQL> SELECT schedule_name, repeat_interval
2* FROM dba_scheduler_schedules;
SCHEDULE_NAME                     REPEAT_INTERVAL
---------------------  ------------------------------------------
DAILY_PURGE_SCHEDULE   freq=daily;byhour=12;byminute=0;bysecond=0
SQL> 

 

DBA_SCHEDULER_JOB_LOG

Представление DBA_SCHEDULER_JOB_LOG позволяет выполнять аудит деятельности, связанной с управлением заданиями в базе данных. Данные, содержащиеся в этом представлении, зависят от того, как установлены параметры ведения журналов для заданий и классов.

Ранее в разделе “Создание класса заданий” настоящей главы было показано, как устанавливается уровень ведения журналов на уровне задания или класса заданий. Для того настройки уровней ведения журналов для индивидуального задания используется процедура SET_ATTRIBUTE из пакета DBMS_SCHEDULER. В процедуре SET_ATTRIBUTE можно установить атрибут LOGGING_LEVEL в два разных значения:

  • DBMS_SCHEDULER.LOGGING_FULL
  • DBMS_SCHEDULER.LOGGING_RUNS

Опция DBMS_SCHEDULER.LOGGING_RUNS просто фиксирует запуски задания, в то время как опция DBMS_SCHEDULER.LOGGING_FULL включает полное ведение журналов задания.

Ниже приведен пример включения полного ведения журналов на уровне задания: 

SQL> EXECUTE dbms_scheduler.set_attribute ('TESTJOB',
'LOGGING_LEVEL', dbms_scheduler.LOGGING_FULL);

 

Очистка журналов заданий

По умолчанию раз в день Scheduler будет очищать все журналы окон и журналы заданий, которые старше 30 дней. Очистить журналы можно также и вручную, выполнив процедуру PURGE_LOG, как показано ниже: 

SQL> EXECUTE DBMS_SCHEDULER.PURGE_LOG(
LOG_HISTORY => 1,
JOB_NAME => 'TEST_JOB1');

 

Здания Scheduler по умолчанию

По умолчанию все базы данных Oracle Database 11.1 используют Scheduler для запуска следующих заданий, хотя при желании можно отключить любое из них: 

SQL> SELECT owner, job_name, job_type FROM dba_scheduler_jobs;
OWNER                    JOB_NAME                         JOB_TYPE
----------------------   ------------------------------   ----------------
SYS                      ADV_SQLACCESS1821051             PLSQL_BLOCK
SYS                      XMLDB_NFS_CLEANUP_JOB            STORED_PROCEDURE
SYS                      FGR$AUTOPURGE_JOB                PLSQL_BLOCK
SYS                      BSLN_MAINTAIN_STATS_JOB
SYS                      DRA_REEVALUATE_OPEN_FAILURES     STORED_PROCEDURE
SYS                      HM_CREATE_OFFLINE_DICTIONARY     STORED_PROCEDURE
SYS                      ORA$AUTOTASK_CLEAN
SYS                      PURGE_LOG
ORACLE_OCM               MGMT_STATS_CONFIG_JOB            STORED_PROCEDURE
ORACLE_OCM               MGMT_CONFIG_JOB                  STORED_PROCEDURE
EXFSYS                   RLM$SCHDNEGACTION                PLSQL_BLOCK
EXFSYS                   RLM$EVTCLEANUP                   PLSQL_BLOCK
12 rows selected.
SQL>

Oracle Scheduler — замечательное дополнение к арсеналу инструментов администратора баз данных Oracle. Предоставляя изощренные средства планирования сложных заданий, оно исключает необходимость в инструментах от независимых поставщиков или сложных сценариях оболочки для планирования заданий внутри базы данных.

Вас заинтересует / Intresting for you:

Oracle Scheduler и Database Re...
Oracle Scheduler и Database Re... 1876 просмотров Дэн Tue, 21 Nov 2017, 13:18:46
Запись в бд oracle (DBWr)
Запись в бд oracle (DBWr) 6386 просмотров Боба Tue, 24 Nov 2020, 07:10:36
Oracle alerts: генерируемые се...
Oracle alerts: генерируемые се... 4480 просмотров Алексей Вятский Tue, 21 Nov 2017, 13:18:05
Технологии хранения Sun, NAS, ...
Технологии хранения Sun, NAS, ... 1817 просмотров Ярослав Tue, 21 Nov 2017, 13:19:25
Войдите чтобы комментировать