关于Oracle RAC中的JOB运行在哪个实例的理解

关于Oracle RAC中的JOB运行在哪个实例的理解,第1张

对于Oracle的RAC集群数据库,一直以来对于高度JOB方面如何做到负载均衡,一直都不太清楚,这几天测试了一下,得出以下结论。

一个JOB在何级别运行是可以定制的。如果把job定义在db级,job可以运行在任何活动的instance上,并遵循job的调度机制;

如果把job定义在instance级别上,job将运行在指定的实例上,如因某种异常导致创建job的实例当机,那job将运行在存活的实例上。

1、目前我们的rac数据库是通过查询语句 select job,instance,what fromdba_jobs 可以看到instance=0,这表示该job是db级,可以运行在任何活动的instance上,由job的调度机制决定在哪个实例上运行。也就是说RAC会根据两台服务器的运行状态来调度JOB在不同的节点实例中运行,一个JOB可以在A机,下一次有可能在B机运行;

2、通过在调度中指定instance 参数,可以指定job只在某个特定实例上运行,但是如果该实例的服务器出现故障时,发现job 在实例A上不再运行,也不会切换到其它实例。如果job建立时没有指定运行在某个实例上,在job当前运行的实例关掉后,却可以切到其他活动的实例上。

3、一般情况下,建立不要指定JOB在特定实例运行,如果对于对于已经在运行的job,如果想指定其只在某个实例运行。建议先删除此job,然后重建job,重建时指定job运行的实例。对于有人说可以使用如下方式修改job运行的实例:SQL> exec dbms_jobinstance(26,1)。经测试,不好使,此sql执行后,job不再运行,并出现等待事件:enq: TX - row lock contention,查到执行的sql是update sysjob$ setthis_date=:1 where job=:2,也就是在更新sys的sysjob$表,最后只能杀掉此会话,才消除此等待事件。

4、目前还没找到SQL语句来查看某一个JOB运行在哪个实例,一查询,都是0(默认),则可能在任何节点执行。笨方法是通过在Linux中用TOP语句查看CPU的性能来判断是否负荷均衡。

转载,仅供参考。

你那个写法, 看上去也没什么问题。

下面这个方式, 是可以处理的。 你测试着看看?

SQL> variable jobno number;

SQL> begin

2 dbms_jobsubmit(:jobno, 'test1;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')');

3 commit;

4 end;

5 /

PL/SQL 过程已成功完成。

可以通过lasttime减去(nexttime-lasttime)totaltime 换算成秒计算出Createtime时间

例子如下: 其中49为Job名称

select last_date,

to_date(to_char(last_date, 'yyyymmddHH24miss'), 'yyyymmddHH24miss') -

1 / 24 / 60 / 60 (next_date - last_date) 24 60 60 total_time createdate,

(next_date - last_date) 24 60 60 total_time startonowsecond

from dba_jobs

where job = '49'

数据库中建表。建表模版在Quartz包下docs/dbTables下,选择相应的数据库和版本即可。ORACLE的11个Table列表如下:

QRTZ_JOB_LISTENERS:存储有关已配置的 JobListener 的信息

JOB_NAME

JOB_GROUP

JOB_LISTENER

QRTZ_TRIGGER_LISTENERS:存储已配置的 TriggerListener 的信息

QRTZ_FIRED_TRIGGERS:存储与已触发的 Trigger 相关的状态信息,以及相联 Job的执行信息

QRTZ_PAUSED_TRIGGER_GRPS:存储已暂停的 Trigger 组的信息

QRTZ_SCHEDULER_STATE:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态

INSTANCE_NAME 之前配置文件中orgquartzschedulerinstanceId配置的名字,就会写入该字段,如果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字

LAST_CHECKIN_TIME:上次检查时间

CHECKIN_INTERVAL :检查间隔时间

QRTZ_LOCKS:存储程序的悲观锁的信息(假如使用了悲观锁)

QRTZ_SIMPLE_TRIGGERS:存储简单的Trigger,包括重复次数,间隔,以及已触的次数

TRIGGER_NAME :qrtz_triggers表trigger_name的外键

TRIGGER_GROUP:qrtz_triggers表trigger_group的外键

REPEAT_COUNT :重复次数

REPEAT_INTERVAL:时间间隔

TIMES_TRIGGERED:触发次数

QRTZ_CRON_TRIGGERS:存储cron表达式表

TRIGGER_NAME :qrtz_triggers表trigger_name的外键

TRIGGER_GROUP:qrtz_triggers表trigger_group的外键

CRON_EXPRESSION:cron表达式

TIME_ZONE_ID :时区

QRTZ_TRIGGERS:保存trigger信息

以上就是关于关于Oracle RAC中的JOB运行在哪个实例的理解全部的内容,包括:关于Oracle RAC中的JOB运行在哪个实例的理解、我想要使用oracle 数据库的job在每晚11点执行一个过程,请问下面的语句有什么问题,总是报错、ORACLE数据库中如何查job创建时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9483186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存