Oracle Job定时工作最佳实践(oracle job中)
Oracle Job定时工作最佳实践
Oracle数据库是企业级应用程序的重要组成部分,许多组织使用Oracle数据库来实现核心的业务功能。这些业务需要在特定时间执行,例如生成报告、备份数据、维护数据库等。为了满足这些需求,Oracle提供了Job调度程序,使得任务可以自动执行。在本文中,我们将介绍一些Oracle Job定时工作最佳实践。
使用DBMS_SCHEDULER替换DBMS_JOB
Oracle Job调度程序有两种:DBMS_JOB和DBMS_SCHEDULER。在Oracle10g之前,DBMS_JOB是唯一的Job调度程序。然而,DBMS_JOB缺乏一些先进的功能,如细粒度控制,对相互依赖任务的支持等。因此,在Oracle10g及更高版本中,Oracle引入了DBMS_SCHEDULER。DBMS_SCHEDULER提供了更强大的功能和灵活性,也更易于管理。 因此,建议使用DBMS_SCHEDULER来代替DBMS_JOB。
以下是一个使用DBMS_SCHEDULER创建作业的示例代码:
DECLARE
job_name VARCHAR2(100) := 'MY_JOB';BEGIN
DBMS_SCHEDULER.CREATE_JOB ( job_name => job_name,
job_type => 'PLSQL_BLOCK', job_action => 'BEGIN my_procedure; END;',
start_date => SYSTIMESTAMP, repeat_interval=> 'FREQ=DLY;BYHOUR=2;BYMINUTE=30',
enabled => TRUE);END;
以上代码将在每天凌晨2:30执行my_procedure存储过程。
使用CALENDAR和WINDOW
DBMS_SCHEDULER提供了CALENDAR和WINDOW两个功能用于更细粒度地控制任务执行的时间。CALENDAR是一个用于计算特定日期和时间的工具,WINDOW是用于定义任务执行的时间段的容器。通过使用这两个功能,可以创建甚至更精细的Job调度程序。
以下是一个添加WINDOW的例子:
DECLARE
job_name VARCHAR2(100) := 'MY_JOB';BEGIN
DBMS_SCHEDULER.CREATE_JOB ( job_name => job_name,
job_type => 'PLSQL_BLOCK', job_action => 'BEGIN my_procedure; END;',
start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DLY;BYHOUR=2;BYMINUTE=30',
enabled => TRUE, schedule_name => 'DLY_WINDOW');
DBMS_SCHEDULER.CREATE_WINDOW ('DLY_WINDOW', repeat_interval=>'FREQ=DLY;BYHOUR=2;BYMINUTE=30');END;
以上代码将在每天凌晨2:30和晚上8:30之间执行my_procedure存储过程。
使用JOB CLASS和RESOURCE PLAN
Oracle数据库可能会有大量的Job调度程序,这些程序可能会竞争相同的资源。在这种情况下,需要使用JOB CLASS和RESOURCE PLAN功能进行管理。JOB CLASS允许在Job调度程序中为不同类型的任务分配不同的资源优先级。RESOURCE PLAN则是一个绑定到JOB CLASS的资源管理实体,它可以分配CPU,I/O和内存等资源的使用。
以下是一个使用JOB CLASS和RESOURCE PLAN简单例子:
DECLARE
job_name VARCHAR2(100) := 'MY_JOB';BEGIN
DBMS_SCHEDULER.CREATE_JOB ( job_name => job_name,
job_type => 'PLSQL_BLOCK', job_action => 'BEGIN my_procedure; END;',
start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DLY;BYHOUR=2;BYMINUTE=30',
enabled => TRUE, job_class => 'MY_CLASS');
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SYSTEM_PRIVILEGE('ADMINISTER_RESOURCE_MANAGER', 'SCOTT'); DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'MY_GROUP', COMMENT => 'Group for my_job'); DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN => 'MY_PLAN');
DBMS_RESOURCE_MANAGER.CREATE_REPEATED_SUB_PLAN(PARENT_PLAN => 'MY_PLAN', CONSUMER_GROUP => 'MY_GROUP', SGID => 1, CPU_P1 => 100); DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'MY_PLAN', OPTIMIZER_ESTIMATE => FALSE, ESTIMATED_EXECUTION_TIME => 1800, GROUP_OR_SUBPLAN => 'MY_GROUP', CPU_P1 => 100);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;
END;
以上代码将Job调度程序分配给MY_CLASS JOB CLASS,并创建名为MY_PLAN的RESOURCE PLAN。
结论
Oracle Job调度程序是一个强大的工具,可以帮助企业自动化时间敏感的任务。在使用Job调度程序时,请记住使用DBMS_SCHEDULER而不是DBMS_JOB,利用CALENDAR和WINDOW来管理精细化的任务和时间段,以及使用JOB CLASS和RESOURCE PLAN来管理大量的Job调度程序。