众所周知,一般操作系统会提供定时执行任务的方法,例如:Unix平台上提供了让系统定时执行任务的命令Crontab。但是,对于某些需求,例如:一些对数据库表的操作,最为典型的是证券交易所每日收盘后的结算,它涉及大量的数据库表操作,如果仍然利用操作系统去定时执行,不仅需要大量的编程工作,而且还会出现用户不一致等运行错误,甚至导致程序无法执行。
一、分析问题
事实上,对于以上需求,我们可以利用数据库本身拥有的功能Job Queue(任务队列管理器)去实现。任务队列管理器允许用户提前调度和安排某一任务,使其能在指定的时间点或时间段内自动执行一次或多次,由于任务在数据库中被执行,所以执行效率很高。
任务队列管理器允许我们定制任务的执行时间,并提供了灵活的处理方式,还可以通过配置,安排任务在系统用户访问量少的时段内执行,极大地提高了工作效率。例如,对于数据库日常的备份、更新、删除和复制等耗时长、重复性强的工作,我们就可以利用任务队列管理器去自动执行以减少工作量。
目前,拥有此项功能的数据库有许多,最有代表性的是SQL Server 7.0、Oracle 8.0.5等。但是,要让任务队列管理器工作,还需要我们加以配置才能实现。SQL Server的功能配置是在一个图形化界面(GUI)中实现的,非常简单。利用OEM客户端管理工具,Oracle的配置也可以在一个图形界面中完成。然而大多数的用户更习惯于命令行的方式去操纵数据库。本文介绍如何通过命令行实现这种配置。
二、实现步骤
1.确保Oracle的工作模式允许启动任务队列管理器
Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以DBA的身份去执行如下命令:
svrmgrl> alter system enable restricted session;
或sql> alter system disenable restricted session;
利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。
2.确保Oracle的系统已经配置了任务队列管理器的启动参数
SNP的启动参数位于Oracle的初始化文件中,该文件放在$ORACLE_HOME/dbs路径下,如果Oracle的SID是myora8的话,则初始化文件就是initmyora8.ora,在文件中对SNP启动参数的描述部分如下:
job_queue_process=n
job_queue_interval=N
第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。
第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。
如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的话,N的配置也要相应地小一点。
3.将任务加入到数据库的任务队列中
调用Oracle的dbms_job包中的存储过程,将任务加入到任务队列中:
dbms_job.submit( job out binary_integer,
what in archar2,
next_date in date,
interval in varchar2,
no_parse in boolean)
其中:
●job:输出变量,是此任务在任务队列中的编号;
●what:执行的任务的名称及其输入参数;
●next_date:任务执行的时间;
●interval:任务执行的时间间隔。
下面详细讨论一下dbms_job.submit中的参数interval。严格地讲,interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。
将任务加入到任务队列之前,要确定执行任务的数据库用户,若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限;若没有,需要以DBA的身份将权利授予scott用户:
svrmgrl> grant execute on dbms_job to scott;
4.将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段
例如,我们已经建立了一个存储过程,其名称为my_job,在sql/plus中以scott用户身份登录,执行如下命令:
sql> variable n number;
sql> begin
dbms_job.submit(:n‘my_job;’,sysdate,
‘sysdate+1/360’);
commit;
end;
/
系统提示执行成功。
Sql> print :n;
系统打印此任务的编号,例如结果为300。
如上,我们创建了一个每隔4分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况:
sql> select job,next_date,next_sec,failures,broken from user_jobs;
执行结果如下:
job next_date next_sec failures broken
300 2000/10/10 11:45:15 0 N
这表示任务号为300的任务,下一次将在2000/10/10 11:45:15执行,此任务的执行失败记录为0次。注意:当执行job出现错误时,Oracle将其记录在日志里,失败次数每次自动加1。当执行失败次数达到16时,Oracle就将该job标志为broken。此后,Oracle不再继续执行它,直到用户调用过程dbms_job.broken,重新设置为not broken,或强制调用dbms_job.run来重新执行它。
除了以上我们讨论的submit存储过程之外,Oracle还提供了其他许多存储过程来操作任务。例如:dbms_job.change 、 dbms_job.what、dbms_job.interval可以用来修改提交的任务。要想删除该任务,只需运行dbms_job.remove(n)即可,其中n为任务号。
分享到:
相关推荐
在Oracle数据库中,实现后台自动执行的定时操作是一项关键技能,尤其对于那些需要定期执行的任务,比如数据备份、数据清理、统计报告生成等。本文将深入探讨如何在Oracle中通过JOB队列机制来实现这样的定时任务,...
在Oracle数据库中实现定时操作是通过Oracle的任务队列管理器(Job Queue)来完成的,这一功能使得数据库管理员能够预定义任务并在特定时间点或周期性执行,避免了手动操作和潜在的用户不一致问题。Oracle数据库的...
在 oracle 中,定时执行存储过程可以使用 DBMS_JOB 包来实现。通过创建任务,我们可以让 oracle 自动执行某些操作,而不需要人工干预。这种技术可以广泛应用于各个领域,例如数据备份、数据分析、报表生成等。
总之,结合任务计划和批处理文件,我们可以实现Oracle数据库的自动化定时备份,从而减少手动操作的繁琐和潜在错误。同时,确保对备份文件的管理和恢复策略也是数据库管理的关键部分。通过阅读`.mht`文件中的详细教程...
通过掌握上述要点,你可以有效地在Oracle数据库中创建和管理定时任务,以满足项目中的自动化需求。不过,要注意的是,Oracle的定时功能虽然强大,但在实际应用中,还需考虑任务间的依赖关系、资源管理以及错误处理...
在`syncData`方法中,我们将编写实现Oracle到MySQL数据同步的代码。数据同步通常涉及到数据库查询、数据转换以及数据插入等操作。这里我们可以使用JDBC或者ORM框架(如MyBatis)来操作数据库。 1. **Oracle数据库...
总的来说,Oracle Job Queue是Oracle数据库中实现定时任务的关键工具,它提供了丰富的配置选项和灵活的执行策略,对于优化数据库管理和提升业务效率具有重要作用。通过熟练掌握Oracle Job Queue的使用,可以更好地...
### Linux环境下Oracle数据库定时备份操作 #### 背景与目的 在企业级应用中,Oracle数据库作为核心数据存储系统,其数据的安全性和完整性至关重要。为了确保数据安全,定期进行数据库备份是必不可少的工作之一。在...
在Linux环境下,为了实现Oracle数据库的自动化备份管理,通常会借助于shell脚本来完成定时导出任务。以下是一个典型的Oracle定时导出脚本示例: ```bash #!/bin/bash echo 'exportdataoftest' date fmt=`date "+%Y-...
在这里,我们将深入探讨Oracle数据库的导出导入定时操作。 一、Oracle Data Pump简介 Oracle Data Pump是Oracle 10g及后续版本引入的新特性,它替代了早期的EXP和IMP工具,提供了更快的速度、更大的灵活性和更高的...
本教程将详细阐述如何利用Crontab来实现Oracle数据库的定时备份。 首先,我们需要理解Oracle数据库的备份类型。Oracle支持多种备份方式,如物理备份(如使用RMAN工具)和逻辑备份(如导出/导入)。在本教程中,我们...
Oracle数据库系统提供了强大的定时任务管理功能,这在企业级应用中极为重要,因为它们能够按照...在实际操作中,根据具体业务需求调整作业的执行时间和频率,以及存储过程中的更新逻辑,是实现高效数据库管理的关键。
在这个文件中,我们需要设置一些环境变量,例如 ORACLE_HOME、ORACLE_OWNER、ORACLE_SID 等。然后,我们可以使用 EXP 工具将数据库备份到一个文件中,例如 `full${DATE}.dmp`。最后,我们可以使用 FTP 工具将备份...
为了实现定时任务,你可以将这个BAT脚本添加到Windows的任务计划器中,设置合适的触发时间。这样,每当到了预定的时间,系统就会自动执行脚本,完成数据的导出和上传。 总的来说,这个任务涉及了Oracle数据库的查询...
在本文中,作者详细介绍了如何结合CRON进程和Oracle的EXP命令来实现定时备份。EXP是Oracle数据库提供的一种数据导出工具,可以将数据库对象(如表、索引等)及其数据导出到一个或多个文件中,作为备份。通过编写一个...
在实际操作中,通常会利用操作系统级别的定时任务服务(如 Windows 的 Task Scheduler 或 Linux 的 cron)来定期执行 Data Pump、SQL*Loader 和 RMAN 命令。这样可以确保在特定时间点进行数据库的自动备份,提高...
要实现定时导出,可以通过Scheduler创建一个作业,调用`expdp`(Oracle数据泵导出)命令,并设置作业的运行频率。例如: ```sql BEGIN DBMS_SCHEDULER.create_job ( job_name => 'weekly_backup', job_type => '...
在Linux环境下,远程定时备份Oracle数据库是一项至关重要的任务,它能确保数据的安全性和业务的连续性。Oracle数据库作为企业级的数据库管理系统,其备份与恢复策略...记得在实际操作中根据具体环境和需求进行调整。