暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 调度程序: 如何限制每个用户正在运行的作业数量

ASKTOM 2019-05-22
714

问题描述

嗨,

是否可以限制用户 (或程序) 在任何给定时间可以拥有的运行调度程序作业的数量?我知道job_queue_processes限制了正在运行的作业的总数,但我想降低某些数据库用户的数量。

谢谢,
朱利叶斯

专家解答

我不认为调度程序本身就有。在以后的版本中,我们有了 “资源” 的概念 (可以是您想要的任何东西),并且您可以将作业限制为不使用资源分配。例如,您可以为用户定义每个作业以获取 “10” 资源,然后为该资源设置总计 “30” 的上限,以将并发限制为3。

在此之前-两个选择。

1) 如果您只想完全停止运行超过其并发限制的那些作业,则配置文件可能就足够了

SQL> create profile MAX_TWO
  2  limit sessions_per_user 2;

Profile created.

SQL> alter user scott profile max_two;

User altered.

SQL> create table scott.t ( st date, en date );

Table created.

SQL>
SQL> create or replace
  2  procedure scott.p is
  3    x date := sysdate;
  4  begin
  5    dbms_session.sleep(120);
  6    insert into t values (x,sysdate);
  7    commit;
  8  end;
  9  /

Procedure created.

SQL> begin
  2      dbms_scheduler.create_job (
  3         job_name           =>  'JOB1',
  4         job_type           =>  'PLSQL_BLOCK',
  5         job_action         =>  'p;',
  6         start_date         =>  sysdate,
  7         enabled            =>  true);
  8
  9      dbms_scheduler.create_job (
 10         job_name           =>  'JOB2',
 11         job_type           =>  'PLSQL_BLOCK',
 12         job_action         =>  'p;',
 13         start_date         =>  sysdate,
 14         enabled            =>  true);
 15
 16      dbms_scheduler.create_job (
 17         job_name           =>  'JOB3',
 18         job_type           =>  'PLSQL_BLOCK',
 19         job_action         =>  'p;',
 20         start_date         =>  sysdate,
 21         enabled            =>  true);
 22
 23      dbms_scheduler.create_job (
 24         job_name           =>  'JOB4',
 25         job_type           =>  'PLSQL_BLOCK',
 26         job_action         =>  'p;',
 27         start_date         =>  sysdate,
 28         enabled            =>  true);
 29
 30  end;
 31  /

PL/SQL procedure successfully completed.


那么过多的将永远无法运行-您会在警报日志中看到这一点

PDB1(3):Errors in file C:\ORACLE\diag\rdbms\db18\db18\trace\db18_j001_28348.trc:
ORA-12012: error on auto execute of job "SCOTT"."JOB2"
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit
2019-05-28T12:28:28.553783+08:00
PDB1(3):Errors in file C:\ORACLE\diag\rdbms\db18\db18\trace\db18_j002_25248.trc:
ORA-12012: error on auto execute of job "SCOTT"."JOB3"
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit
2019-05-28T12:28:28.557711+08:00
PDB1(3):Errors in file C:\ORACLE\diag\rdbms\db18\db18\trace\db18_j003_24232.trc:
ORA-12012: error on auto execute of job "SCOTT"."JOB4"
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit


2) 如果要 * 推迟 * 它们,则可以在作业开始时调整调度程序设置

这里的逻辑是:

总是允许作业运行 * 但是 * 它将

-完成原本打算做的工作 (在下面的示例中,这将是proc P),并在完成后将自己删除队列,或者

-它会看到发生的事情太多了,它什么也做不了

在后一种情况下,我们告诉作业它需要在30秒内重复,看看它是否有机会运行,依此类推

SQL> create or replace
  2  procedure scott.p(p_job varchar2) is
  3    x date := sysdate;
  4  begin
  5    insert into t values (sysdate, p_job||' started');
  6    commit;
  7    dbms_session.sleep(90);
  8    insert into t values (sysdate, p_job||' finished');
  9    commit;
 10  end;
 11  /

Procedure created.

SQL>
SQL> create or replace
  2  function allowed_to_run(p_job varchar2) return boolean is
  3    l_job_count int;
  4    l_max int;
  5  begin
  6    select count(*)
  7    into   l_job_count
  8    from   user_scheduler_running_jobs;
  9
 10    if l_job_count > 2 then
 11      dbms_scheduler.get_attribute(p_job,'max_runs', l_max);
 12      l_max := nvl(l_max,1)+1;
 13      dbms_scheduler.set_attribute(p_job,'max_runs', l_max);
 14      dbms_scheduler.set_attribute(p_job,'repeat_interval','FREQ=SECONDLY; INTERVAL=30');
 15      insert into t values (sysdate, p_job||' deferred');
 16      commit;
 17      return false;
 18    else
 19      dbms_scheduler.set_attribute_null(p_job,'repeat_interval');
 20      insert into t values (sysdate, p_job||' allowed');
 21      commit;
 22      return true;
 23    end if;
 24  end;
 25  /

Function created.

SQL>   begin
  2      dbms_scheduler.create_job (
  3         job_name           =>  'JOB1',
  4         job_type           =>  'PLSQL_BLOCK',
  5         job_action         =>  'if allowed_to_run(''JOB1'') then p(''JOB1''); end if;',
  6         start_date         =>  sysdate,
  7         enabled            =>  true);
  8
  9      dbms_scheduler.create_job (
 10         job_name           =>  'JOB2',
 11         job_type           =>  'PLSQL_BLOCK',
 12         job_action         =>  'if allowed_to_run(''JOB2'') then p(''JOB2''); end if;',
 13         start_date         =>  sysdate,
 14         enabled            =>  true);
 15
 16      dbms_scheduler.create_job (
 17         job_name           =>  'JOB3',
 18         job_type           =>  'PLSQL_BLOCK',
 19         job_action         =>  'if allowed_to_run(''JOB3'') then p(''JOB3''); end if;',
 20         start_date         =>  sysdate,
 21         enabled            =>  true);
 22
 23      dbms_scheduler.create_job (
 24         job_name           =>  'JOB4',
 25         job_type           =>  'PLSQL_BLOCK',
 26         job_action         =>  'if allowed_to_run(''JOB4'') then p(''JOB4''); end if;',
 27         start_date         =>  sysdate,
 28         enabled            =>  true);
 29
 30  end;
 31  /

PL/SQL procedure successfully completed.

SQL>
SQL> select * from t order by 1;

ST                  MSG
------------------- ---------------------------------------------------------------------------------
28/05/2019 13:14:21 JOB4 deferred
28/05/2019 13:14:21 JOB2 allowed
28/05/2019 13:14:21 JOB1 started
28/05/2019 13:14:21 JOB3 deferred
28/05/2019 13:14:21 JOB1 allowed
28/05/2019 13:14:21 JOB2 started

6 rows selected.

SQL> /

ST                  MSG
------------------- ---------------------------------------------------------------------------------
28/05/2019 13:14:21 JOB4 deferred
28/05/2019 13:14:21 JOB1 allowed
28/05/2019 13:14:21 JOB3 deferred
28/05/2019 13:14:21 JOB1 started
28/05/2019 13:14:21 JOB2 allowed
28/05/2019 13:14:21 JOB2 started
28/05/2019 13:14:51 JOB4 deferred
28/05/2019 13:14:51 JOB3 deferred
28/05/2019 13:15:21 JOB4 deferred
28/05/2019 13:15:21 JOB3 deferred
28/05/2019 13:15:51 JOB4 deferred
28/05/2019 13:15:51 JOB3 deferred
28/05/2019 13:15:51 JOB1 finished
28/05/2019 13:15:51 JOB2 finished

14 rows selected.

SQL> /

ST                  MSG
------------------- ---------------------------------------------------------------------------------
28/05/2019 13:14:21 JOB3 deferred
28/05/2019 13:14:21 JOB1 started
28/05/2019 13:14:21 JOB1 allowed
28/05/2019 13:14:21 JOB2 allowed
28/05/2019 13:14:21 JOB2 started
28/05/2019 13:14:21 JOB4 deferred
28/05/2019 13:14:51 JOB3 deferred
28/05/2019 13:14:51 JOB4 deferred
28/05/2019 13:15:21 JOB3 deferred
28/05/2019 13:15:21 JOB4 deferred
28/05/2019 13:15:51 JOB3 deferred
28/05/2019 13:15:51 JOB1 finished
28/05/2019 13:15:51 JOB4 deferred
28/05/2019 13:15:51 JOB2 finished
28/05/2019 13:16:21 JOB3 allowed
28/05/2019 13:16:21 JOB3 started
28/05/2019 13:16:21 JOB4 started
28/05/2019 13:16:21 JOB4 allowed
28/05/2019 13:17:51 JOB3 finished
28/05/2019 13:17:51 JOB4 finished

20 rows selected.


文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论