`
zengjinliang
  • 浏览: 301991 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在Oracle中实现定时操作

阅读更多
众所周知,一般操作系统会提供定时执行任务的方法,例如: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数据库中实现定时操作。

    在Oracle中实现后台自动执行的定时操作

    JOB使用 在Oracle中实现后台自动执行的定时操作

    Oracle中通过命令行实现定时操作详解

    众所周知,一般操作系统会提供定时执行任务的方法,例如Unix平台上提供了让系统定时执行任务的命令Crontab。但是对于某些需求,例如一些对数据库表的操作,最为典型的是证券交易所每日收盘后的结算,它涉及大量的...

    linux下oracle数据库自动定时备份迁移

    Linux下Oracle数据库自动备份迁移 通过linux下Crontab实现定时任务,结合oracle自动备份脚本实现oracle数据库的备份操作,结合linux下Scp服务实现备份文件的异地存储,从而减少了人为备份的繁琐工作和服务器损坏造成...

    linux-oracle定时备份

    在linux操作系统下,使oracle实现定时备份,避免数据丢失

    oracle数据库操作可视化程序

    这是一个使用java编写的Oracle数据库操作可视化程序,对于任意一个oracle数据库,使用管理员账号登录之后,能对数据库进行可视化操作,可以实现用户交互,数据可视化,定时采样。

    SqlServer批量导入Oracle小工具

    SqlServer批量导入Oracle小工具,内附说明文档,操作简便,可以实现对数据的批量及自定义导入,经测试,无问题

    使用Oracle作为中间件编写存储过程,实现Sql Server到MySQL的数据同步

    通过使用Oracle作为中间容器编写存储过程,将Sql Server的数据实时同步到MySql,不直接在SqlServer中进行操作。 公司最近的项目要部署上线了,然后需要将甲方公司的ERP,OA,MES,PLM等系统的数据同步到我们的系统之中...

    OracleAutoBackup

     使用操作系统自带的计划任务功能,每天定时运行exp命令导出指定的Oracle数据库并压缩,然后按需删除 已过期的压缩的导出文件,以实现自动备份的功能。  通常,为了便于管理,在我们公司一个oracle用户有且仅有的...

    数据抽取方案之ORACLE透明网关安装及配置!

    使用该产品后,对于Oracle数据库而言,屏蔽了SQL Server的异构性,可直接在Oracle数据库中对SQL Server数据进行大多数操作。通过透明网关在出口退税审核系统和综合管理系统建立DB Link,可实现数据的定时抽取...

    税收征管信息查询系统数据抽取方案之ORACLE透明网关安装及配置

    使用该产品后,对于Oracle数据库而言,屏蔽了SQL Server的异构性,可直接在Oracle数据库中对SQL Server数据进行大多数操作。通过透明网关在出口退税审核系统和综合管理系统建立DB Link,可实现数据的定时抽取...

    ORACLE之常用FAQ V1.0(整理)

    [Q]怎么样在过程中暂停指定时间 5 [Q]怎么样快速计算事务的时间与日志量 5 [Q]怎样创建临时表 6 [Q]怎么样在PL/SQL中执行DDL语句 6 [Q]怎么样获取IP地址 7 [Q]怎么样加密存储过程 7 [Q] 7 [Q] 7 [Q]如果存在就更新,...

    医院计算机监护系统用户描述

    医院做为一个与人民生命健康密切相关的重要机构,势必要在各方面实现信息化,与此同时,对医疗卫生的要求也越来越高。以方便医护人员更好的了解病人的情况,给病人提供及时的治疗。本系统就是针对这方面的迫切需求而...

    基于SpringBoot+MyBatis+Shiro实现多数据库权限管理系统(数据结构课程设计)【100012773】

    实现功能:管理员管理、角色管理、部门管理,可操作本部门及子部门数据;菜单管理、定时任务、参数管理、字典管理、系统日志,没有数据权限;业务功能,按照用户数据权限,查询、操作数据【没有本部门数据权限,也能...

    SpringBoot API接口对数据库增删改查源码

    功能实现:- 实现双数据库同时使用(mysql和oracle)- 实现增删改查API- 实现token验证- 实现定时任务- 实现websocket服务端 讲解地址:https://blog.csdn.net/weixin_43151418/article/details/124986738

    dbsync2.rar

    数据同步工具是针对 ORACLE 数据表之间数据同步而开发的一款软件。...7) 以工作流的方式实现数据的同步(暂时未实现) ; 8) 支持常用的数据库记录操作(添加记录,修改记录,删除记录,执行存储过程)

    通过PLSQL Developer创建Database link,DBMS_Job,Procedure,实现Oracle跨库传输数据的方法(推荐)

    前一阵领导安排了一个任务:定时将集团数据库某表的数据同步至我们公司服务器的数据库,感觉比写增删改查SQL有趣,特意记录下来,希望能帮到有类似需求的小伙伴,如有错误也希望各位不吝指教 环境描述:  集团数据库:...

    java面试宝典

    167、Prototype如何实现页面局部定时刷新? 40 168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求? 41 171、AJAX都有哪些有点和缺点? ...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 oracle版本_spring3.0

    【源码】oracle版本_spring3.0 系统模块 1. 组织管理:角色管理,分角色组和成员,有组权限和成员权限。 2. 系统用户:对各个基本的组会员增删改查,单发、群发邮件短信,导入导出excel表格,批量删除 3. 会员管理:...

    asp.net知识库

    如何在Asp.Net1.1中实现页面模板(所谓的MasterPage技术) Tool Tip 示例(FILTER版) Tool Tip示例 (htc版) 一个.net发送HTTP数据实体的类 按键跳转以及按Enter以不同参数提交,及其他感应事件 动态控制Page页的...

Global site tag (gtag.js) - Google Analytics