【IT168 服务器学院】简介
本文首先简单介绍了Oracle 8的数据复制的基本概念,然后详细介绍了实现Oracle 8数据复制延迟事务队列转发的Oralce 8任务队列机制,包括“任务队列”子系统的安装,API编程接口DBMS_JOB包的介绍以及API过程中各参数的概念,任务队列的体系结构和运行环境,任务队列数据字典视图以及时间间隔(interval)参数的算法等。
一、Oracle 8数据复制
复制,顾名思义就是将数据库中的数据拷贝到不同物理地点的数据库中以支持分布式应用,它是整个分布式计算解决方案的一个重要组成部分。Oracle8的数据复制按功能主要分为三类:基本(简单)复制、高级复制和混合复制,而高级复制又可分为多主节点复制和可更新快照复制。图1是一个简单的Oracle数据复制示意图。
|
图1 Oracle 数据复制示意图
图1是Oracle数据复制的一个简单示意,并不代表任何的复制类型。在节点1如果需要复制的数据库表发生变化(插入、删除或者更新等),则Oracle采用某种内部机制将这种变化放在一个延迟事务队列(DEFTRAN)中。在一个特定的时间或者是某个特定时间间隔后,Oracle将延迟事务队列中的变化“推”到数据库节点2.如果在节点2上要复制的库表发生变化,也采用同样的机制。如果在传播过程中发生错误,则将该错误放在错误队列DEFERROR中。
Oracle对于存放在延迟事务队列中的事务是如何处理的呢?这就是Oracle的任务队列机制。Oracle的任务队列可以使我们定时或者以一定的时间间隔重复执行Oralce的PL/SQL程序(也就是所说的任务)。任务队列使用最多的地方就是Oracle的数据复制中的定时复制任务,Oracle任务队列子系统最早设计的目的就是为了定时刷新Oracle快照(Oracle简单复制)。当然,现在Oracle的定时任务机制已经不仅仅应用于数据复制,数据库管理员也常使用定时任务来作一些对数据库的日常维护任务,在实际应用中也可用来安排一些繁重的批处理任务在数据库系统不忙时执行,还可用于启动监听数据库管道的服务程序,用来响应用户会话的服务请求等等。下面将详细讨论Oralce 的定时任务机制。
二、定时任务简介
DBMS_JOB系统包是Oracle“任务队列”子系统的API编程接口。DBMS_JOB包对于任务队列提供了下面这些功能:提交并且执行一个任务、改变任务的执行参数以及删除或者临时挂起任务等。
DBMS_JOB包是由ORACLE_HOME目录下的rdbms/admin子目录下的DBMSJOB.SQL和PRVTJOB.PLB 这两个脚本文件创建的。这两个文件被CATPROC.SQL脚本文件调用,而CATPROC.SQL这个文件一般是在数据库创建后立即执行的。脚本为DBMS_JOB包创建了一个公共同义词,并给该包授予了公共的可执行权限,所以所有的Oracle用户均可以使用这个包。
下面几个数据字典视图是关于任务队列信息的,主要有DBA_JOBS, USER_JOBS和DBA_JOBS_RUNNING.这些字典视图是由名为CATJOBQ.SQL的脚本文件创建的。该脚本文件和创建DBMS_JOB包的脚本文件一样在ORACLE_HOME目录的rdbms/admin子目录中,同样也是由脚本文件CATPROC.SQL调用。
最后,要使任务队列能正常运行,还必须启动它自己专有的后台过程。启动后台过程是通过在初始化文件init*.ora(实例不同,初始化文件名也略有不同)中设置初始化参数来进行的。下面就是该参数:
JOB_QUEUE_PROCESSES = n
其中,n可以是0到36之间的任何一个数。除了该参数以外,还有几个关于任务队列的初始化参数,本文后面将会对其进行详细讨论。
DBMS_JOB包中包含有许多过程,见表1所示。
表1 DBMS_JOB包
名称 | 类型 | 描述 |
DBMS_JOB.ISUBMIT | 过程 | 提交一个新任务,用户指定一个任务号 |
DBMS_JOB.SUBMIT | 过程 | 提交一个新任务,系统指定一个任务号 |
DBMS_JOB.REMOVE | 过程 | 从队列中删除一个已经存在的任务 |
DBMS_JOB.CHANGE | 过程 | 更改用户设定的任务参数 |
DBMS_JOB.WHAT | 过程 | 更改PL/SQL任务定义 |
DBMS_JOB.NEXT_DATE | 过程 | 更改任务下一次运行时间 |
DBMS_JOB.INTERVAL | 过程 | 更改任务运行的时间间隔 |
DBMS_JOB.BROKEN | 过程 | 将任务挂起,不让其重复运行 |
DBMS_JOB.RUN | 过程 | 在当前会话中立即执行任务 |
DBMS_JOB.USER_EXPORT | 过程 | 创建文字字符串,用于重新创建一个任务 |