You have to change the attribute RESTART_ON_RECOVERY
which by default is set to true
restart_on_recovery
If set to TRUE for a job and the job is stopped by a database
shutdown, then the job is restarted when the database is recovered.
If set to FALSE, and the job is stopped by a database shutdown, then
the job is marked as stopped when the database is recovered.
Example
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;
/
Demo
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
Test Scenario
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
Let the job run several times
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
Shutdown and startup ( with gap in the middle )
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
In my case, frequency of 1 minute, the job was not failing and it was not restarted either after recovery. The next execution will be the next iteration of my schedule window.