【问题标题】:job scheduler issue in oracleoracle中的作业调度程序问题
【发布时间】:2016-09-28 01:38:00
【问题描述】:

我创建了以下工作

begin
dbms_scheduler.create_job(
  job_name => 'DAILY_BACKUP',
  job_type => 'STORED_PROCEDURE',
  job_action => 'DB_BACKUP',
  start_date => sysdate,
  repeat_interval => 'FREQ=DAILY; BYHOUR=23',
  enabled => TRUE,
  comments => 'Runtime: Every day at 11:00 pm');
end;

我可以看到作业已启用

  select job_name, enabled from user_scheduler_jobs;
 JOB_NAME                       ENABL
------------------------------ -----
DAILY_BACKUP                   TRUE

我也可以在 user_SCHEDULER_JOB_LOG 中看到执行日志

select log_date, substr( job_name, 1, 30 )job_name, owner, status from user_SCHEDULER_JOB_LOG;
    LOG_DATE                                                                    JOB_NAME                                                                                                                 OWNER                          STATUS
--------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------ ------------------------------ ------------------------------
26-SEP-16 11.54.14.755972 PM +00:00                                         DAILY_BACKUP                                                                                                             BACKUP                         SUCCEEDED
27-SEP-16 02.02.32.603195 AM +00:00                                         DAILY_BACKUP                                                                                                             BACKUP                         SUCCEEDED
27-SEP-16 11.54.14.835203 PM +00:00                                         DAILY_BACKUP                                                                                                             BACKUP                         SUCCEEDED

user_scheduler_job_log 中的第二行是我手动运行作业时创建的。

但是应该由过程 db_backup 更新的表数据没有更新。 当我使用手动运行作业时,表格数据会更新

      exec dbms_scheduler.run_job('DAILY_BACKUP'); 

我已完成此 URL 中建议的参数级别检查进程数,会话数似乎没问题。

https://community.oracle.com/thread/648581

我可能遗漏了一些非常基本的东西,请指导我的工作有什么问题?

这是 db_backup 的代码

   create or replace procedure db_backup as

 cursor cur_listOfTables is
    select table_name from backuplog where backup_flag = 'Y';

  v_truncate_query varchar2(4000);
 v_insert_query varchar2(4000);
 v_current_function varchar2(200);

 v_disable_constraint_success number := 0;
 v_truncate_success number := 0;
 v_insert_success number := 0;
 v_enable_constraint_success number := 0;

 v_schema_to_backup varchar2(50) := 'PRODSCHEMA';

 begin

  v_current_function := $$PLSQL_UNIT;

  v_disable_constraint_success := alter_all_fk_constraints( v_schema_to_backup, 'D');

  for backup_rec in cur_listOfTables
  loop
    v_truncate_query := 'truncate table ' || backup_rec.table_name;

    v_insert_query := 'insert into ' || backup_rec.table_name || ' select * from ' || backup_rec.table_name || '@prod';

    --v_disable_constraint_success := alter_fk_constraints( backup_rec.table_name, 'D' );

    if v_disable_constraint_success = 0 then
            begin
                    execute immediate v_truncate_query;
                    exception
                            when others then
                                    log_error( v_current_function, backup_rec.table_name, sqlcode, sqlerrm);
                                    v_truncate_success := 1;
            end;

            if v_truncate_success = 0 then
                    begin
                            execute immediate v_insert_query;
                            exception
                                    when others then
                                    log_error( v_current_function, backup_rec.table_name, sqlcode, sqlerrm);
                                    v_insert_success := 1;
                    end;
                    if v_insert_success = 0 then
                            update backuplog set last_backup_date = sysdate where table_name = backup_rec.table_name;
                            commit;
                    end if;
            end if;

            --v_enable_constraint_success := alter_fk_constraints( backup_rec.table_name, 'E' );

    end if;

    --dbms_output.put_line(v_truncate_query);
    --dbms_output.put_line(v_insert_query);
end loop;


  v_enable_constraint_success := alter_all_fk_constraints( v_schema_to_backup, 'E');
 reset_all_sequences(v_schema_to_backup);

 end;

【问题讨论】:

  • 能否提供db_backup程序的内容?
  • 嗨@JSapkota 我已经在问题中添加了 db_backup 的代码
  • start_date => sysdate。也许你需要设置 to_timestamp(to_char(sysdate,'dd.mm.yyyy') || ' 23:00:00', 'dd.mm.yyyy hh24:mi:ss' )跨度>
  • 嗨 @SkyWalker 我会进行更改并更新您的发现。

标签: oracle scheduler jobs


【解决方案1】:

感谢您抽出宝贵时间调查我的问题并提出解决方法。实际上我只是在 job_action 属性中添加了架构名称,并且作业运行正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2010-12-28
    相关资源
    最近更新 更多