如何使用dbms_scheduler每30分钟运行一次作业

时间:2016-11-07 16:09:52

标签: oracle

我正在使用oracle DB,现在因为我正在监视连接到我的java应用程序的oracle DB的性能,所以现在我必须定期监视DB中活动连接的数量,让我们说每隔30分钟一次下面是查询,它返回活动用户的数量以及名称和计数

select osuser, count(osuser) as active_conn_count 
from v$session 
group by osuser 
order by active_conn_count desc

现在请告知我如何在oracle DB本身的调度程序中安排一个调度,每30分钟触发一次。

4 个答案:

答案 0 :(得分:4)

我建议您将统计信息保存在表格中(例如my_log_table),在这种情况下,时间表看起来像这样:

begin
    DBMS_SCHEDULER.CREATE_JOB (
         job_name             => 'keep_stats',
         job_type             => 'PLSQL_BLOCK',
         job_action           => 'begin insert into my_log_table (mUser,mCnt) (select osuser, count(osuser) as active_conn_count from v$session group by osuser  order by active_conn_count desc);commit;end;',
         start_date           => timestamp '2016-11-07 19:00:00',
         repeat_interval      => 'FREQ=MINUTELY;INTERVAL=30;',
         enabled              => TRUE);
end;

答案 1 :(得分:1)

有很多关于dbms_scheduler的例子。提交定期工作很容易。但实际上你不需要这样做! Oracle已经存储了大量关于数据库性能的数据,使用这些统计数据会更容易,更准确。 在这里查看active_session_history

希望这就是你要找的东西。

答案 2 :(得分:0)

首先,您要创建一个计划。

dbms_scheduler.create_schedule( schedule_name   => 'EVERY_1ST_SATURDAY'
                              , repeat_interval => 'FREQ=MONTHLY;INTERVAL=1;BYDAY=1 SAT;BYHOUR=2;BYMINUTE=0'
                              , start_date      => SYSTIMESTAMP
                              , comments        => '1st Saturday of the month 2am.'
                              );

您可以选择创建一个程序:

dbms_scheduler.create_program( program_name       => 'GATHER_SCHEMA_STATS'
                             , program_type        => 'STORED_PROCEDURE'
                             , program_action      => 'dbms_stats.GATHER_SCHEMA_STATS'
                             , number_of_arguments => 1
                             , enabled             => FALSE
                             , comments            => 'Gather schema''s stats (e.g. FRAMEWORK''s)'
                             );

...授予访问权限:

GRANT execute ON sys.GATHER_SCHEMA_STATS TO framework;

...及其参数:

DBMS_SCHEDULER.define_program_argument ( 'GATHER_SCHEMA_STATS', 1 , 'ownname', 'VARCHAR2', 'FRAMEWORK' );

其次,你创造了一份工作:

DBMS_SCHEDULER.CREATE_JOB ( job_name      => 'FRAMEWORK.GATHER_FRAMEWORK_STATS_JOB1'
                          , program_name  => 'SYS.GATHER_SCHEMA_STATS'
                          , schedule_name => 'SYS.EVERY_1ST_SATURDAY'
                          , enabled       => TRUE
                          , auto_drop     => FALSE
                          , comments      => 'Gather FRAMEWORK''s stats on 1st Saturday of the month.'
                          );

答案 3 :(得分:0)

repeat_interval => ' FREQ = HOURLY; BYMINUTE = 0,30; BYSECOND = 0', -