在ORACLE
数据库中,执行计划任务的工具通常都是DBMS_JOB
包。这个包使用简单,历史悠久,目前还在广泛使用中。坦率地讲,这个包的功能满足了绝大部分应用的计划任务运行需要,所以生命力才这么强。
但是,我们这里还是要说一下它的不足之处。
(miki西游 @mikixiyou 文档:原文链接: http://mikixiyou.iteye.com/blog/1559145
)
在DBMS_JOB
使用中,我们需要知道每一次JOB
执行的时间,用于判断该JOB
调用的存储过程执行时间。这里你会说,这个在存储过程里也可以实现的,在存储过程中,执行前后加个时间戳记录到日志表中就可以实现。
是的。以前我们在处理这类需求时也是这么做的。
但从ORACLE 10.1
版本开始,ORACLE
开发了一个新的包DBMS_SCHEDULER
。这个包挺复杂的,以至于我在初次学习之后,就没再去用它了。功能太强大了,其实很多我们不需要的。
我们就有这个需求,看看DBMS_SCHEDULER
是如何解决的。
在SQLPLUS
中,使用DBMS_SCHEDULER.CREATE_JOB
创建计划任务,用于调度一个存储过程。
存储过程很简单,我为这个测试而创建的,就是向一张表里插入数据。
CREATE TABLE T1 AS SELECT SYSDATE AS AA FROM DUAL;
CREATE OR REPLACE PROCEDURE SP_TEST_T1 AS
BEGIN
INSERT INTO T1 SELECTD SYSDATE FROM DUAL;
COMMIT;
END;
这个存储过程没有输入输出参数,是为了JOB
调用方便。如果实际运行过程中有参数,我们就写一个存储过程封装它,再放入JOB
中调用。
例如:
CREATE PROCEDURE GATHER_GTJA_STATS
AS
BEGIN
SYS.DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME => 'GTJA',ESTIMATE_PERCENT => 30,METHOD_OPT => 'FOR ALL INDEXED COLUMNS SIZE AUTO',CASCADE => TRUE,OPTIONS => 'GATHER');
END;
使用DBMS_SCHEDULER.CREATE_JOB
创建一个JOB,
调用存储过程SP_TEST_T1
,执行间隔2
分钟。这里的JOB_NAME
名称可以自己定义,这个摆脱了DBMS_JOB
中JOB
号不能自定义的缺点。
EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => 'JOB_SP_TEST_T1',JOB_TYPE => 'STORED_PROCEDURE',JOB_ACTION =>'SP_TEST_T1' ,START_DATE => SYSDATE ,REPEAT_INTERVAL => 'FREQ=MINUTELY; INTERVAL=2');
该命令执行成功后,可以在*_SCHEDULER_JOBS
中看到JOB
的配置值。
SELECT * FROM DBA_SCHEDULER_JOBS;
SELECT * FROM USER_SCHEDULER_JOBS WHERE JOB_NAME='JOB_SP_TEST_T1';
使用该命令新建的JOB
,默认是不执行的,需要将其状态改成可执行状态。
EXEC DBMS_SCHEDULER.ENABLE(NAME => 'JOB_SP_TEST_T1');
可以删除重建它。
EXEC DBMS_SCHEDULER.DROP_JOB(JOB_NAME => 'JOB_SP_TEST_T1');
EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => 'JOB_SP_TEST_T1',JOB_TYPE => 'STORED_PROCEDURE',JOB_ACTION => 'SP_TEST_T1',START_DATE => TO_DATE('2012-06-12 15:30:00','YYYY-MM-DD HH24:MI:SS') ,REPEAT_INTERVAL => 'FREQ=DAILY');
这个创建过程而言,其实和DBMS_JOB
创建JOB
的差别不大,但DBMS_SCHEDULER
可配置的地方就太多了。执行时间间隔非常非常灵活,这里不做详述了,具体请看ORACLE
官方文档。
DBMS_SCHEDULER
针对每一次JOB
执行,都做了详细记录,因此,可以查询到每一次JOB
执行的时间了。
具体可以查看两类视图*_SCHEDULER_JOB_LOG
和*_SCHEDULER_JOB_RUN_DETAILS
。
SELECT * FROM DBA_SCHEDULER_JOB_LOG;
SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS;
如果嫌日志太多了,可以使用PURGE_LOG
去清理。
EXECUTE DBMS_SCHEDULER.PURGE_LOG;
这个DBMS_SCHEDULER
包的功能太多了,用起来也累,所以很多人还是选择DBMS_JOB
。
在
http://stackoverflow.com
看到关于这两个包的不同点的介绍,摘录下来,留着参考。
原始链接:http://stackoverflow.com/questions/8505799/job-vs-scheduler-oracle-10g
At first glance it looks like only other names with more human readable schedules fordbms_scheduler
, compared to dbms_job
. When looking slightly better, there are loads of differences, even in Oracle 10gR1. Currently we are in 11gR2. Every release dbms_scheduler
gets more enhancements, where dbms_job
has been static for many years.
Differences
- dbms_scheduler has logging
- dbms_scheduler has external jobs
- dbms_scheduler has job chains
- dbms_scheduler has job event handling (can raise and react upon events)
- dbms_scheduler has
resource manager
integration
- dbms_scheduler has human readable calendar syntax
- dbms_scheduler can combine different calendars in a new one
In 11g extra
- dbms_scheduler has remote external jobs
- dbms_scheduler has light weight jobs - generate many low overhead jobs in one tx
- dbms_scheduler can send mail on job completion
- dbms_scheduler jobs can have multiple targets
dbms_job can only run pl/sql type of jobs in the current database.
I hope this (in complete list) h
分享到:
相关推荐
在Oracle数据库管理中,有时我们需要停止正在运行的JOB,这可能是由于各种原因,如发现错误、优化性能或调整资源分配。本文将详细阐述如何在Oracle中查询并停止正在运行的JOB,包括关键步骤、涉及的表与视图以及具体...
在Oracle中,计划任务(也称为调度程序)是一项重要的管理功能,允许管理员安排数据库操作在特定时间自动执行,例如数据备份、统计信息收集、表空间的自动扩展等。本教程将通过实例深入探讨如何在Oracle中设置计划...
1. Oracle Job任务的概念:Oracle Job任务是指在数据库中执行的计划任务,可以是批量处理、数据导入导出、报表生成等。这些任务可以根据需要设置执行的时间和频率。 2. Oracle Job任务的类型:Oracle Job任务可以...
Oracle 中的 Job 是一个非常强大且灵活的功能,它允许开发者在数据库中执行计划任务,提高数据库的自动化程度和效率。那么,什么是 Oracle 中的 Job 呢? Oracle 中的 Job 是一个计划任务,它可以在指定的时间点或...
Oracle数据库中的定时任务(也称为作业或job)是Oracle系统中一个非常重要的子系统,它可以帮助用户自动执行一些常规性的任务,比如备份数据库、清理日志等。通过合理地利用Oracle定时任务,可以极大地提高系统的...
在本文中,我们将详细介绍如何使用 Oracle 的 DBMS_JOB 来实现任务计划管理。 任务计划管理的需求 在许多管理系统中,经常会遇到定时执行某项任务的情况。例如,对于数据库的日常备份等耗时长、重复性强的工作,就...
Oracle中的JOB是一个重要的后台机制,用于自动化执行定时任务。这些任务可以是数据库维护、数据清理、备份或者其他任何基于时间的数据库操作。Oracle数据库利用SNP(Scheduler)进程来管理和执行这些JOB。 SNP...
Oracle的定时任务,通常被称为“Jobs”,是数据库管理系统中的一个重要组成部分,主要用于自动化执行数据库操作,如数据备份、数据清理、报告生成等。Job界面管理工具则为这些任务提供了图形化的配置和管理界面,...
3. **事务管理**:Oracle支持分布式事务,XXL-JOB在处理多任务调度时,可能会利用Oracle的事务特性来确保数据的一致性。 4. **连接池配置**:使用合适的Oracle数据库连接池,如C3P0或DBCP,以提高数据库连接的复用...
在Oracle中,Job的实现依赖于Job Queue后台进程,该进程负责定时执行预定的数据库任务。 在Oracle中,一个Job由多个参数定义,每个参数描述了任务的不同方面: - JOBNUMBER:任务的唯一标示号,是任务在数据库中的...
在Oracle数据库系统中,"JOB"是用于调度和自动化任务执行的一种功能,它允许你在预定义的时间点运行存储过程、PL/SQL块或其他数据库操作。本文将深入探讨Oracle中的JOB创建,以及如何编写和使用相应的脚本来设定定时...
通过掌握上述要点,你可以有效地在Oracle数据库中创建和管理定时任务,以满足项目中的自动化需求。不过,要注意的是,Oracle的定时功能虽然强大,但在实际应用中,还需考虑任务间的依赖关系、资源管理以及错误处理...
Oracle 创建 Job 实例是指在 Oracle 数据库中创建一个计划任务,用于在特定的时间点执行特定的操作。以下是创建 Job 实例的详细过程和相关知识点: 一、创建 Job 实例 要创建一个 Job 实例,需要使用 dbms_job....
Oracle Job是Oracle数据库中的一个强大特性,主要用于在特定时间或间隔执行数据库操作,例如数据备份、维护任务或者定期的数据处理。以下是对Oracle Job使用方法和技巧的详细说明: 一、创建Oracle Job Oracle Job...
2. 配置中间层:在 Windows NT 或 Sun Solaris server 上安装 Oracle Management Server (OMS),用于提供访问 EM 库中的信息、分派控制台的请求、控制任务执行、监控事件等功能。 3. 配置第一层:在客户端上安装 EM ...
Oracle Job 提供了一种灵活的方式来自动化数据库维护任务,确保在特定时间执行关键操作,对于大型企业级应用和数据库管理系统尤其重要。了解并熟练使用 Job 功能,有助于提高数据库的效率和可靠性。
Oracle Job是Oracle的DBMS_SCHEDULER或之前版本中的DBMS_JOB包的一部分,它允许数据库管理员规划、监控和管理长时间运行的任务。 Oracle Job的创建通常涉及以下步骤: 1. **创建Job**:使用DBMS_SCHEDULER或DBMS_...
在 Oracle 中,可以使用 `DBMS_JOB` 包来提交和管理定时任务。以下是如何创建一个定时任务的例子: 1. **使用 `DBMS_JOB.SUBMIT` 方法**:这个方法允许你定义定时任务的基本属性,包括执行的存储过程、下一次执行的...
在Oracle数据库中,Job是一种用于调度定期任务的功能,常被用来自动化执行数据库管理中的各种任务,比如备份、清理临时表空间等。Job主要由`DBMS_JOB`包进行管理和控制,此包提供了提交(new job)、删除(delete job)...