防止oracle数据库调度任务运行后调度时间



我有一个oracle DBMS计划作业,在早上5点运行。服务器在凌晨4点宕机,6点又恢复了。一旦服务器和数据库上线,上午5点的作业就会自动启动。我该如何预防呢?我要写上结束日期吗?所

BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB
(
job_name        => 'SYSTEM.DAILY_JOB'
,start_date      => TO_TIMESTAMP_TZ('2021/04/09 03:00:00.000000 +00:00','yyyy/mm/dd hh24:mi:ss.ff tzh:tzm')
,repeat_interval => 'FREQ=DAILY;INTERVAL=1'
,end_date        => NULL
,job_class       => 'DEFAULT_JOB_CLASS'
,job_type        => 'PLSQL_BLOCK'
,job_action      => 'SOME JOB'
,comments        => 'NA'
);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'RESTARTABLE'
,value     => FALSE);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'LOGGING_LEVEL'
,value     => SYS.DBMS_SCHEDULER.LOGGING_OFF);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'MAX_FAILURES');
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'MAX_RUNS');
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'STOP_ON_WINDOW_CLOSE'
,value     => FALSE);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'JOB_PRIORITY'
,value     => 3);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'SCHEDULE_LIMIT');
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'AUTO_DROP'
,value     => FALSE);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'RESTART_ON_RECOVERY'
,value     => FALSE);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'RESTART_ON_FAILURE'
,value     => FALSE);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name      => 'SYSTEM.DAILY_JOB'
,attribute => 'STORE_OUTPUT'
,value     => TRUE);
SYS.DBMS_SCHEDULER.ENABLE
(name                  => 'SYSTEM.DAILY_JOB');
END;
/

您必须更改属性RESTART_ON_RECOVERY,默认设置为true

restart_on_recovery

如果作业被设置为TRUE,并且该作业被数据库停止关闭,然后在数据库恢复时重新启动作业。

如果设置为FALSE,并且作业因数据库关闭而停止,则当数据库恢复时,作业被标记为已停止。

BEGIN
dbms_scheduler.create_job( job_name => 'MY_TEST',
job_type => 'PLSQL_BLOCK', 
job_action => 'BEGIN sleee; END;', 
number_of_arguments => 0,
start_date=> systimestamp + 1 , 
repeat_interval=>'freq=hourly; byminute=0; bysecond=0;',
enabled =>FALSE, 
auto_drop=>TRUE,
comments=> 'Test' 
);
dbms_scheduler.set_attribute('MY_TEST','RESTART_ON_RECOVERY',false);
dbms_scheduler.enable('MY_TEST');
END;
/

SQL> BEGIN
dbms_scheduler.drop_job ( job_name => 'MY_TEST');
dbms_scheduler.create_job( job_name => 'MY_TEST',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN sleee; END;',
number_of_arguments => 0,
start_date=> systimestamp + 1 ,
repeat_interval=>'freq=hourly; byminute=0; bysecond=0;',
enabled =>FALSE,
auto_drop=>TRUE,
comments=> 'Test'
);
dbms_scheduler.set_attribute('MY_TEST','NLS_ENV','NLS_LANGUAGE=''AMERICAN'' NLS_TERRITORY=''AMERICA'' ');
dbms_scheduler.set_attribute('MY_TEST','RESTART_ON_RECOVERY',false);
dbms_scheduler.enable('MY_TEST');
END;
/  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17
PL/SQL procedure successfully completed.
SQL> select job_name , restart_on_recovery from dba_scheduler_jobs where job_name = 'MY_TEST' ;
JOB_NAME
--------------------------------------------------------------------------------
RESTA
-----
MY_TEST
FALSE

测试场景

SQL> begin
sys.db  2  ms_scheduler.create_job
(
job_name        => 'TEST_JOB'
3    4    5        ,start_date      => systimestamp
,repeat_interval => 'freq=minutely;interval=1'
,job_class       => 'default_job_class'
6    7    8        ,job_type        => 'plsql_block'
,job_action      => 'begin dbms_lock.sleep(2); end;'
,comments        => 'Test restart_on_recovery'
9   10   11      );
sys.dbms_scheduler.set_attribute
( name      => 'TEST_JOB'
12   13   14       ,attribute => 'auto_drop'
,value     => false);
sys.dbms_scheduler.set_attribute
15   16   17      ( name      => 'TEST_JOB'
,attribute => 'restart_on_recovery'
18   19       ,value     => false);
sys.dbms_scheduler.set_attribute
( name      => 'TEST_JOB'
20   21   22       ,attribute => 'restart_on_failure'
,value     => false);
23   24    sys.dbms_scheduler.enable ('TEST_JOB');
25  end;
/ 26
PL/SQL procedure successfully completed.
SQL> select job_name,state,LAST_START_DATE,NEXT_RUN_DATE,RESTART_ON_RECOVERY,RESTART_ON_FAILURE from dba_scheduler_jobs where job_name='TEST_JOB'

JOB_NAME                       STATE           LAST_START_DATE                                                             NEXT_RUN_DATE                                                               RESTA RESTA
------------------------------ --------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ----- -----
TEST_JOB                       RUNNING         18-OCT-21 02.33.05.519165 PM +02:00                                         18-OCT-21 02.33.05.348417 PM +02:00                                         FALSE FALSE

让作业运行多次

SQL> select job_name,state,LAST_START_DATE,NEXT_RUN_DATE,RESTART_ON_RECOVERY,RESTART_ON_FAILURE,run_count,FAILURE_COUNT from dba_scheduler_jobs where job_name='TEST_JOB'
JOB_NAME                       STATE           LAST_START_DATE                          NEXT_RUN_DATE                            RESTA RESTA  RUN_COUNT FAILURE_COUNT
------------------------------ --------------- ---------------------------------------- ---------------------------------------- ----- ----- ---------- -------------
TEST_JOB                       SCHEDULED       18-OCT-21 02.39.05.537625 PM +02:00      18-OCT-21 02.40.05.540345 PM +02:00      FALSE FALSE          9             0

关机启动(中间有间隙)

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL>
SQL> startup mount
ORACLE instance started.
Total System Global Area 1694495520 bytes
Fixed Size                  8897312 bytes
Variable Size            1442840576 bytes
Database Buffers          234881024 bytes
Redo Buffers                7876608 bytes
Database mounted.
SQL>
SQL> alter database open ;
Database altered.
SQL> select job_name,state,LAST_START_DATE,NEXT_RUN_DATE,RESTART_ON_RECOVERY,RESTART_ON_FAILURE,run_count,FAILURE_COUNT from dba_scheduler_jobs where job_name='TEST_JOB'
2  ;
JOB_NAME                       STATE           LAST_START_DATE                          NEXT_RUN_DATE                            RESTA RESTA  RUN_COUNT FAILURE_COUNT
------------------------------ --------------- ---------------------------------------- ---------------------------------------- ----- ----- ---------- -------------
TEST_JOB                       SCHEDULED       18-OCT-21 02.39.05.537625 PM +02:00      18-OCT-21 02.58.05.317688 PM +02:00      FALSE FALSE         9             0

在我的情况下,频率为1分钟,作业没有失败,并且在恢复后也没有重新启动。下一次执行将是我的调度窗口的下一次迭代。

最新更新