3 实施过程
实施过程如图 3 所示。包括捕捉程序与实施程序两个部分。
图 3 “基于 SQL 重现的数据复制”实施过程
( 1 )捕捉程序
捕捉程序就是捕捉源数据库发生的更改的程序。
在建立复制环境之后,需要利用捕捉程序去捕捉源数据库发生的更改,且将更改临时存放于变更轨迹表中。
“基于 SQL 重现法”捕捉数据的机制是依靠触发器来实现。具体捕捉步骤如图 4 所示,当源表发生修改、插入和删除操作时,触发器被启动,调用相应的存储过程,将源表发生的操作还原为 SQL 语句(比如,源表为 tb_Employee ,它所对应的目标表为 TGtb_Employee ,向源表 tb_Employee 中插入一条记录,如 insert into tb_Employee values(?,?,?,?) ,那么还原后的 SQL 语句可能为 insert into TGtb_Employee values(?,?,?,?) ,这里用的是可能这个词,是因为目标表不一定包含源表的所有列,有可能只是其中的几列,如果只选择源表的几列数据,那么还原后的 SQL 语句就只包含这几列数据),向该源表对应的变更轨迹表中插入变更时间和还原后的 SQL 语句。

图 4 捕捉过程
存储过程处理过程如图 5 所示。

图 5 存储过程工作流程
Figure 5 Work Flow of Stored Procedure
( 2 )实施程序
实施程序就是定期运行,将变更轨迹表中的数据实施到目标数据库中的程序。
因为基于异步的复制本身是需要一个外界的实施过程来进行数据分发的,所以,需要一个单独的服务器,也就是“实施服务器”来做这个工作。
实施程序负责分发数据,“基于 SQL 重现法”数据复制技术的数据分发采用“拉式”模型,即复制过程由目标服务器启动,向源服务器请求变更数据。实施程序采用 JAVA 语言开发,与源数据库、目标数据库之间通过 JDBC 连接。捕捉程序将源表发生的更改临时存放于变更轨迹表中,到复制时间实施程序通过 JDBC 连接源数据库,从变更轨迹表中读出源数据库的更改,然后通过 JDBC 连接目标数据库,将更改实施于目标数据库。
实施程序通常运行在目标服务器上,但它也可以运行在可以连接到源和目标服务器的网络上的任一服务器上。多个实施程序实例可以运行在相同或不同的服务器上。
实施程序通过全更新或差别更新拷贝从源表拷贝数据到目标表中。
( 1 )在初始化过程中,实施程序进行全更新拷贝,此时,实施程序执行以下任务:
1) 删除目标表中的所有行
2) 从源表中读取所有行
3) 拷贝这些行到目标表中
( 2 )在进行差别更新拷贝时,实施程序只拷贝更改的数据到目标表中。此时实施程序执行以下任务,如图 6 所示:

图 6 实施程序工作流程
Figure 6 Work Flow of Apply Program
其中,( 1 )( 2 )( 3 )分别代表:
(1) 实施程序提取变更数据;
(2) 将变更数据应用于目标表;
(3) 删除对应变更轨迹表中的信息。
4 技术特点
“基于 SQL 重现法”数据复制技术具有完全异构、 DBMS 无关性、通用性以及可靠性等特点,下面逐一介绍。
( 1 )完全异构
完全异构意味着复制能够在所有数据库至少是所有与 RDB (关系数据库, Relational Database )兼容的数据库之间进行。“基于 SQL 重现法”数据复制技术通过 JDBC 连接各种数据库,只要能找到合适的 JDBC ,就可以做到所有数据库之间的复制。所以说,“基于 SQL 重现法”数据复制技术是完全异构的。
( 2 ) DBMS 无关性
目前的许多复制方案,特别是数据库产商提供的数据复制方案,都依赖于与产商自己的 DBMS 核心关系紧密的实现技术,而“基于 SQL 重现法”数据复制技术采用 JAVA 技术开发,使用 JDBC 接口连接各种数据库, JAVA 本身是一种跨平台的技术, JDBC 作为一种标准得到了和 ODBC 一样的尊重,各大数据库厂商都制作了符合 JDBC 标准的驱动,这样利用这些接口,就不用考虑太多底层的 DBMS 的特性,可以透明地操作各种 DBMS 。比如,连接各个数据库的类 Databasemetadata ,使用 JAVA 语言编写,通过 JDBC 连接各种数据库,对不同类型的数据库的连接、访问、执行过程、查询等等,对于应用来说都是一样的,所以可以做到 DBMS 无关。所以说“基于 SQL 重现法”数据复制技术是与 DBMS 无关的。
( 3 )通用性
“基于 SQL 重现法”数据复制技术,捕获的变化是以 SQL 语句形式出现的,可以给任何数据库做复制。如果不用 SQL 语句,就必须在实施程序里写对应的数据库 DML 操作,而这样一来,实施程序就必须知道是哪种数据库,因为不同的数据库的 DML 语句不尽相同。直接存储成 DML 的 SQL 的话, Trigger 可以把这种差异封装起来,这样实施程序面对的是比较一致的界面,所以实施程序本身可以移植,而 Trigger 本身就是不可移植的对象,由它进行封装是有好处的,可以让实施程序面对一个一致的接口,从而实施程序可以有更好的可移植性。“基于 SQL 重现法”数据复制技术实施程序做的事情就是从源库读取 SQL 语句,在目标数据库执行此 SQL 语句。
( 4 )可靠性
“基于 SQL 重现法”数据复制技术只复制数据库中修改的数据,因此可以明显降低网络的负荷。“基于 SQL 重现法”数据复制技术将变化应用于目标库的动作与删除变更轨迹表中的内容的动作包裹在一个事务里,当网络或目标数据库出现故障时,变化应用于数据库的动作不会成功,整个事务回滚,变更轨迹表中的内容不会被删除,假定在网络或目标数据库出现故障时原有数据未受到破坏,而在故障恢复时,可以手工启动复制过程提交变更轨迹表中的内容;或者当到达复制时间时,重新提交变更轨迹表的内容。这种方式使得此复制技术具有很高的可靠性。
5 原型实现
为了验证“基于 SQL 重现法”复制技术的可行性及技术特点,作者开发了原型系统 Replicator ,本节将进行详细介绍。
( 1 )实验环境
实验环境如下:
DBMS : IBM DB2 8.1 , ORACLE9i , SYBASE11.9
OS : RedHat 7.3 , Windows 2000 , NT
网络:局域网( TCP/IP 100Mbps )
硬件: PC 机( PentiumIV 1.7G , 512M RAM , 80GHD ), PC 机( PentiumIV 2.0G , 256M RAM , 80GHD ), PC 机( PentiumIV 1.7G , 512M RAM , 80GHD )
( 2 )实验测试
原型实现后,对数据复制功能进行了测试。
具体运行环境如( 1 )所描述,并尽量把其它程序和进程关闭使其占用最小资源。测试结果如表 1 :
其中每条记录大小 100 字节,涉及了各种常见数据类型(字符、整数、浮点数、时间 / 日期、大对象等);其中约有 50 %的记录发生改变。
表 1 测试结果
Table 1 Test Result
记录数
|
时间使用( S )
|
内存使用( M )(取运行过程中最大的内存损耗量)
---|---|---
1000
|
58
|
16
5000
|
295
|
16
10000
|
592
|
16
测试结果表明,随着记录数的增长,“基于 SQL 重现法”数据复制技术时间复杂度呈线性增长(即 O(N) , N 为记录数),空间复杂度(主要为内存损耗)基本上保持常量(即 O(1) )。
由于时间及其它客观条件的限制, Replicator 还存在一些不足,需要在以后提高和完善。主要有:
( 1 )多样性
尽管实验环境包含了主要的异构形式,它们具有很强的代表性,但两种环境所涉及的情况毕竟有限。
( 2 )效率问题
在每张源表上加 trigger 对已有应用势必带来一定的效率问题,并给数据库管理带来了工作量,如何控制 trigger 的数量以及变更轨迹表控制信息的内容是提高效率、简化管理的主要考虑的方向。
( 3 )实时性
目前“基于 SQL 重现法”数据复制技术采用的是事后读取控制信息进行复制的方法,因而不能实现实时复制,这对实际应用带来了局限性。
** 参考文献 ** ** **
1 者敬 著 . 开放式异构数据库复制框架的研究与实现 中国期刊网 2002.4
2 王婉非,张志浩 分布式数据库系统的复制机制及应用 计算机工程与科学 2003
3 吉增瑞 分布式数据库系统一致性方法 计算机工程与科学 2002
4 林怀忠 数据复制与一致性 2002
5 葛卫民 基于 ORACLE 高级复制的分布式数据库系统应用研究 数据库与信息处理 2003
7 <SPAN style="FONT-SIZE: 12pt; FONT