Oracle里的JOB

以下为每天17:30执行PROC_name(...,...,...,...)这个存储过程的JOB

 begin
  sys.dbms_job.submit(job => :job,
                      what => 'PROC_name(...,...,...,...);',
                      next_date => to_date('15-10-2011 17:30:20', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'TRUNC(SYSDATE+1)+17/24');
  commit;
end;
/

以下为每过1个小时执行一次

 begin
  sys.dbms_job.submit(job => :job,
                      what => 'PROC_name(...,...,...,...);',
                      next_date => to_date('15-10-2011 17:30:20', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'SYSDATE+1/24');
  commit;
end;
/

以下为每过10分钟执行一次

 begin
  sys.dbms_job.submit(job => :job,
                      what => 'PROC_name(...,...,...,...);',
                      next_date => to_date('15-10-2011 17:30:20', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'SYSDATE+1/144');
  commit;
end;
/

 

<think>我们正在讨论Oracle19c中与Job心跳相关的配置和监控。在Oracle数据库中,作业(Job)通常由DBMS_SCHEDULER或DBMS_JOB包管理。心跳机制通常用于监控作业是否活动,避免作业挂起或失败。在Oracle中,没有内置的称为“心跳”的特定功能,但我们可以通过以下方式实现类似心跳的监控:1.**作业状态监控**:查询作业的运行状态和最后运行时间。2.**自定义心跳表**:在作业中定期更新一个表(心跳表),记录作业的最后活动时间。 3. **告警机制**:当心跳表长时间未更新时触发告警。 ###配置Job心跳监控####步骤1:创建心跳表首先,我们创建一个表来记录作业的心跳信息。 ```sqlCREATE TABLEjob_heartbeat(job_nameVARCHAR2(128) PRIMARYKEY,last_heartbeat TIMESTAMP); ```####步骤2:在作业中更新心跳在作业的PL/SQL代码中,定期更新心跳表。例如,假设我们有一个名为`my_job`的作业,它在每次执行时更新心跳。```sqlBEGIN--作业的主要逻辑...--更新心跳MERGE INTOjob_heartbeatjhUSING (SELECT 'my_job'AS job_name FROMdual)srcON(jh.job_name =src.job_name)WHEN MATCHEDTHENUPDATESET last_heartbeat =SYSTIMESTAMPWHEN NOTMATCHED THENINSERT (job_name, last_heartbeat)VALUES(src.job_name,SYSTIMESTAMP);COMMIT; END; ```####步骤3:监控心跳创建一个监控作业(例如,每分钟运行一次),检查心跳表中的时间是否在预期范围内。如果某个作业的心跳超过阈值,则发送告警。 ```sqlDECLAREv_threshold INTERVAL DAYTO SECOND:= NUMTODSINTERVAL(5,'MINUTE');--阈值设为5分钟v_current_time TIMESTAMP :=SYSTIMESTAMP; BEGINFOR recIN (SELECT job_name,last_heartbeatFROM job_heartbeat)LOOPIF(v_current_time- rec.last_heartbeat) >v_threshold THEN--发送告警,例如发送邮件或记录到告警表DBMS_OUTPUT.PUT_LINE('Job' ||rec.job_name|| 'heartbeatexpired!');--这可以调用发送告警的过程ENDIF;ENDLOOP; END; ```###使用Oracle内置功能监控作业OracleScheduler提供了作业运行的历史和状态视图,如:- `DBA_SCHEDULER_JOBS`:查看作业的详细信息。 -`DBA_SCHEDULER_JOB_LOG`:查看作业日志。例如,查询作业的最后运行时间: ```sqlSELECT job_name,last_start_dateFROM dba_scheduler_jobsWHERE job_name ='MY_JOB'; ```###注意事项-自定义心跳表需要作业主动更新,因此要确保作业逻辑中包含更新语句。 -监控作业本身也需要高可用,避免监控失效。 -对于使用DBMS_JOB的旧式作业,同样可以使用类似的心跳机制。 ###引用说明在Oracle19c中,可插拔数据库(PDB)的使用与作业管理无关,但作业可以在PDB级别创建和运行[^1][^2]。上述心跳机制同样适用于PDB中的作业。 §§相关问题§§1.如何配置Oracle作业失败时的自动重试?2.如何监控Oracle作业的运行状态? 3.在OracleRAC环境中,作业心跳监控需要注意什么?</think>### Oracle 19c Job心跳配置与监控详解 在Oracle 19c中,Job心跳(Heartbeat)机制通常指通过定期更新状态信息来监控作业的存活情况。以下是配置和监控方法: #### 1. **心跳表配置** 创建专用心跳表记录作业状态: ```sql CREATE TABLE job_heartbeat ( job_name VARCHAR2(128) PRIMARY KEY, last_beat TIMESTAMP DEFAULT SYSTIMESTAMP, status VARCHAR2(20) CHECK(status IN ('ACTIVE','ERROR')) ); ``` #### 2. **DBMS_SCHEDULER作业配置** 在作业中集成心跳更新逻辑: ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'HEARTBEAT_JOB', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN -- 业务逻辑 UPDATE job_heartbeat SET last_beat = SYSTIMESTAMP WHERE job_name = ''HEARTBEAT_JOB''; COMMIT; END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=MINUTELY; INTERVAL=5', enabled => TRUE ); END; ``` > **关键参数**: > - `repeat_interval`:控制心跳频率(示例为每5分钟) > - `COMMIT`:确保心跳更新持久化[^1] #### 3. **监控方法** **实时状态检查:** ```sql SELECT job_name, last_beat, CASE WHEN SYSTIMESTAMP - last_beat > INTERVAL '10' MINUTE THEN 'DEAD' ELSE 'ALIVE' END status FROM job_heartbeat; ``` **告警配置(当心跳停止时):** ```sql CREATE OR REPLACE TRIGGER heartbeat_alert AFTER UPDATE ON job_heartbeat FOR EACH ROW BEGIN IF :NEW.status = 'ERROR' OR (SYSTIMESTAMP - :NEW.last_beat > INTERVAL '15' MINUTE) THEN DBMS_ALERT.SIGNAL('JOB_FAILURE', :NEW.job_name); END IF; END; ``` #### 4. **PDB环境注意事项** 在可插拔数据库(PDB)中部署时: ```sql ALTER SESSION SET CONTAINER = pdb8; -- 切换到目标PDB[^2] CREATE TABLE job_heartbeat ... ; -- 在PDB内创建心跳表 ``` #### 5. **增强监控视图** 结合Oracle内置视图: ```sql SELECT j.job_name, h.last_beat, j.state AS scheduler_state FROM dba_scheduler_jobs j JOIN job_heartbeat h ON j.job_name = h.job_name; ``` ### 最佳实践 1. **心跳频率**:根据业务关键性设置(通常5-15分钟) 2. **双保险机制**:同时使用心跳表 + `DBA_SCHEDULER_JOB_RUN_DETAILS` 3. **PDB隔离**:每个PDB维护独立心跳表[^2] 4. **自动恢复**:通过`DBMS_SCHEDULER.STOP_JOB`/`START_JOB`实现故障恢复 > **故障排查路径**: > 1. 检查`job_heartbeat`表更新时间 > 2. 查询`DBA_SCHEDULER_JOB_LOG`错误日志 > 3. 验证作业权限:`SELECT * FROM DBA_SCHEDULER_JOB_PRIVS`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值