分布式异构数据库同步技术研究与实现

2015-12-21 11:33张振友孙燕
电脑知识与技术 2015年27期

张振友 孙燕

摘要:在分布式异构数据库中,存在的最大的问题就是异构数据库之间的一致性的问题,针对该问题,设计了一种基于XML的异构数据库同步系统,该系统以C#/XML为基础,结合触发器法、控制表法和时间戳法获取变更数据,并对触发器和控制表进行改进,采用XML技术,将得到的变更数据转化成XML文档,通过Web界面实现异构数据库之间的同步。

关键词:数据同步;异构数据库;C#/XML;Web;变更数据捕获

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2015)28-0016-04

Research and Implement of Distributed Heterogeneous Database Synchronization

ZHANG Zhen-you, SUN Yan

(School of Information Engineering, North China University of Science and Technology, Tangshan 063009, China)

Abstract: In a distributed heterogeneous database, the biggest problem is the problem of consistency between heterogeneous databases, to solve the problem, a XML-based heterogeneous database synchronization system is designed, the system based on C#/XML, combining the trigger method, control table method and the time stamp method to obtain the change data, and improved trigger and control table, the use of XML technology, change data will be converted into an XML document, realized the data synchronization between distributed heterogeneous databases through a Web interface.

Key words: data synchronization; heterogeneous database; C#/XML; Web; change data capture

在进几十年,计算机技术在不断地发展和进步,各行各业对于数据库的应用变得越来越广泛,技术也越来越成熟。由于企业的规模不断扩大,逐渐形成了分布式数据库的局面,因此许多领域当中均涉及异构数据同步的问题。因此,如何方便、快捷、安全、高效地实现分布式异构数据库之间的数据同步,是各个企业考虑的重要问题,也是当今信息技术发展的一个重要方向。

针对异构问题,人们采用了多种方法,如日志法、触发器法、API法[1]等。但是这些方法各有优缺点,单一的使用此方法难以满足用户多方面的需求。为此,本文提出了触发器、控制表和时间戳法相结合的变化捕捉方法,并且采用XML技术实现异构数据库数据同步。采用触发器捕获变更数据,并对触发器算法进行优化,为需要同步的数据库创建一个控制表,控制表中设置时间戳,当触发器捕获到变更数据后,将数据存放到控制表中。然后将捕获的变更数据转化成XML文档,通过Web分发到各个数据库中。在传送同步数据前,删除重复无用数据,传送最小的数据,从而降低传送时间,减少占用带宽。

1 分布式异构数据库与XML技术

分布式异构数据库是数据库技术与网络技术相结合的产物,是由多个数据库系统组合而成的,可以实现异构数据的传送、共享和透明访问。这些数据库系统在加入之前是独立的数据库,能够实现数据库系统的管理。

由于不同的数据库系统的数据类型、数据结构等的定义可能不同,在转换前,需解决的是两种模型之间存在的各种冲突[2]。XML简单易懂,具有自描述性,可以采用XML文档描述存放的是什么数据,如何存放这些数据。XML具有可扩展性和平台无关性,并且是纯文本文件等特点,能够有效地解决在异构数据库同步时出现的冲突,在数据交换中经常被使用。

XML文档与关系数据库之间的映射有两种方法:基于模板驱动的映射和基于模型驱动的映射[3]。其中基于模板驱动的映射是在XML文档中嵌套SQL语句,执行得到的结果。这是一种浅层的映射,只能从关系数据库到XML文档的映射。基于模型驱动的映射,是一种深层的映射。数据在数据库与XML文档之间进行转换时,不仅仅是在XML文档中嵌入SQL语句,而是用一个具体的模型实现的 [4]。

2 系统设计

本系统目标是对于异构数据库数据同步的关键技术进行研究,在实验环境下进行数据同步系统的设计和实现,对系统进行调试和试运行。主要研究数据源数据的一致性的解决方案和降低数据传输时间和提高同步效率。

系统基于B/S模式设计,采用ADO.net技术访问数据库,提供了Connection、Command、DataAdapter、DataReader、DataSet和DataTable等。允许程序员将SQL命令通过驱动程序发送给数据库,数据库执行后返回数据处理结果。本系统的同步传输模型如图1所示。

2.1 主数据库选取

主数据库是整个系统的中心,在更新操作中,将所有的更新数据传送到主数据库中,主数据库负责对数据的分析和处理。由于主数据库需要处理的任务很大,当不能在短时间内完成更新时,可能会得到过期的数据;并且当主数据库因故障不能够进行数据更新时,系统将无法正常进行,因此采用的是优化的中心数据库的方法,先选取异构数据库中的一个数据库作为主数据库,当主数据库发生故障时,在从数据库中选择一个数据相对完整的数据库作为主数据库继续处理数据。

2.2 数据库表设计

为了解决命名冲突设计了数据源表、全局表、数据源表和全局表映射表。

1)数据源信息表

该表中存放了异构数据库中的各个数据库的信息,主要用于异构数据库注册。系统的首要任务是管理可以进行数据同步的各个局部数据库的数据表,为此,需要将各个节点的数据库中用户关心的连接信息和数据库表的信息集成到全局数据库,全局数据库将这些信息存放全局数据库信息表中,实现局部的异构数据库注册。数据源信息表结构如表1所示。

2)全局表

由于各异构数据库的数据模式是不同的,如果同一个数据分别存储在不同数据库中,那么它的表现形式会不同。所以把各个节点数据库集成到同步系统中,通过建立全局数据库模式,用户可以有这样一种感觉,就是使用一个单一的数据库。全局表如表2所示。

3)映射表

映射表存储的是全局数据库与局部数据库之间的对应关系。如表3所示。将全局数据库与从数据库中的数据通过表进行对应。

2.3 变更数据捕获

不同的数据库支持不同的变更数据捕获方法。触发器[5]是数据库内部的一种机制,它的概念比较明了,对于导致数据库内容发生变化的事件(增加、删除或者修改),都可以自动采取相关的动作,通过触发器可以直接获取变更数据并且操作简单,而且现如今常用的数据库都支持触发器机制,使用效率很高;控制表法不需要对原有的系统表结构进行修改,但是要为每一个需要同步的表都要创建一个控制表,对于存在大量需要同步的数据表的数据库应用来说,会占用大量的内存空间;时间戳的方法需要在每个进行同步的表上添加一个时间戳,用来记录修改的时间,以便同步的时候判断是否为最新数据[6]。该方法虽然不会影响应用的运行效率,但是需要对原有的系统做非常大的调整,而且只能捕获到应用程序造成的数据的变化。因此,在触发器和控制表方法的设计思想的基础上,提出了一种改进的用于异构数据库同步的变更数据捕获方法——触发器法、时间戳法和控制表法相结合的方法。

该方法需要为每一个系统中的数据库创建一个控制表,控制表中存放的是控制字段,包括数据发生变化的时间、变更数据所在的表名、变更数据的主键值、同步标志等信息,然后对需要进行同步的表创建相应操作的触发器,当对表进行DML操作时,触发器被触发,将控制信息存放到控制表中。本系统设计的捕获数据的流程图如图2所示。

2.3.1 控制表结构设计

为了方便提取变更数据,在整个数据库中为所有需要进行同步的源数据库表只创建了一个控制表Change,用来存放控制信息。当执行增删改等DML操作时,触发器监测到发生的变化后,将变更数据保存到Change表中。

以SQL Server2008为例,Change表的字段如表4所示。

2.3.2 触发器捕获技术

不同的数据库系统对于触发器的定义是不同的,支持的触发器的类型也不相同[7]。其中以SQL server和Oracle的触发器为代表。

以SQL Server2008为例,为用户表UserInfor创建新增触发器代码如下。

create trigger tri_InsertUserInfor on UserInfor

for insert

as begin

insert into change

select getdate(),'','UserInfor',U_Id ,'insert','0' from inserted

end

上述代码是Insert触发器的执行过程,说明如下:

1)第一行说明要创建的触发器名称为tri_InsertUserInfor,源表名称为UserInfor。

2)第二行说明在执行insert插入操作时触发器触发。

3)第四行到第五行定义了触发器触发时的SQL语句。首先是将数据插入到Change表中,对应的值分别为当前时间、字段、发生变化的表名、发生变化的主键值、操作的类型和未同步标识。由于Change表中的主键是自增字段,在执行insert语句时,不需要指定主键。Getdate()是获取当前系统的时间,将修改的时间存储到Change表中,实现时间戳的概念。

有一张用户表,其字段信息如表5所示。

当执行Insert语句后,tri_InsertUserInfor捕获到插入语句,将数据存放到Change表中。

Insert语句代码如下:insert into userinfor values(newid() ,'张春芳','1987-01-10','女','15175500011','河北省唐山市路南区')

Change表中增加一条数据如图3所示。

2.4 数据转换

由于异构数据库间的功能属性和结构不同,可能采用了不同的数据结构、数据类型等。因此,在数据捕获后,需要针对这些差异,对数据进行转换。针对这些差异性,基于XML技术,声明源数据库与目标数据库之间的异构[8],以便实现数据转换。

2.4.1 关系数据库到XML文档的转换

实现关系数据库到XML文档映射的过程分为两步:一是对数据库中的数据的提取;二是通过XML Schema编写函数,将提取的数据通过写入文档的函数方法写入XML文档中。

1)提取数据库的数据

异构数据库同步对变更数据的操作是根据控制表中的C_Operate字段的值来确定的,在实际的应用中,对需同步的表的操作可能存在插入、删除、更新三种情况,这三种对应的SQL语句结构都不相同。实现控制表中的控制信息的提取,文中概括了三种情况。

① 插入操作

在执行插入操作时,需要所有的字段对应值,因此在生成XML文档时需要将每个数据都插入。因为控制表中只存放控制信息,没有数据,需要将控制表与源表联立,获取数据信息。

提取同步数据代码如下:select a.* from userInfor a, change b where a.U_ID = b.C_Key and b.C_Operate='insert'

通过联立UserInfor表和Change表,将用户信息表中的每个字段作为一个节点名称,每个字段对应的值作为节点值,再从Change表中获取四个控制节点记录信息,控制节点的作用是根据源表信息在文件中找到对应的目标表的信息,从而达到同步的效果。其中一条插入数据操作最终生成的XML文档如下:

value

value

value

value

value

insert

UserInfor

HyperSyncSQL

SQLServer2008

其中标签表示每一行数据。中主要字段作用如下:

Username、Birthday、Gender、Telephone、Address分别对应同步数据表中相应的字段,保存变化的数据。

C_Operate用来记录本次数据变化的操作类型,如insert、delete和update。

C_Table用来记录本次操作的表名。

DBName用来记录操作的数据库名。

DBType用来记录操作的数据库类型。

② 更新操作

更新操作与插入操作类似。更新包括主键更新和非主键更新。上面介绍的控制表中有个字段C_Field,该字段的作用是存放主键更新操作时的更新前的主键值。

③ 删除操作

删除操作很简单,通常一条删除语句可以通过主键的唯一性即可删除一条记录,所以在设计XML文档时,可以直接将Change表中读取C_Key字段,不再需要和源表UserInfor关联。

2)将关系模式映射为XML Schema

将关系数据库中的关系模式映射为对应的XML Schema,为XML文档提供描述标准。程序中关系模式映射为XML Schema的主要代码[9]如下:

//创建新数据集

DataSet ds = new DataSet("XML");

//连接数据源

DbConnection conn = DBHelper.GetConn();

conn.Open();

string sql = "select * from userInfor";

//生成数据适配器

DbDataAdapter adapter_index = DBHelper.GetAdp(sql,conn);

//用适配器填充数据集

adapter_index.Fill(ds, "userInfor");

//在数据集中添加表与表之间的关系

ds.Relations.Add(……)

//生成XML文件

ds.WriteXml("..\\..\\userinforschema.xml", XmlWriteMode.WriteSchema);

2.4.2 XML文档到关系数据库的转换

该模块的功能是将源数据库中发来的XML文档解析成SQL语句,然后在目标数据库中执行,采用Linq to XML 操作XML文件。通过XElement类读取XML文件,使用XElement类中提供的Element和Elements方法定位到某个或某些元素,XAttribute类中提供的Attribute和Attributes方法定位到某个或某些属性,将XML中的元素和属性提取出来,还原SQL语句,连接目标数据库后执行,将变化数据反映到目标数据库当中。

public decryptXMLFile(string filePath)

{

publi XElement xmlDoc = XElement.Load(filePath);//通过文件路径加载XML文件

IEnumerable elementCollection = xmlDoc.Elements("root");//通过Element和Elements方法定位某个或某些元素;

}

3 结论

系统采用改进的基于触发器、控制表和时间戳的变更数据捕获方法和基于XML框架解决了多个异构数据库数据同步的问题,通过测试和使用,该方案的可靠性和稳定性得到了证明。该方案实用性强,实现了数据的共享和交换功能。

参考文献:

[1] 林源,陈志泊.分布式异构数据库同步系统的研究与应用[J].计算机工程与设计,2010,31(24):5278-5281.

[2] 申毅,武小年.分布式异构数据库数据同步系统的实现与优化[J].桂林电子科技大学学报,2014,34(4):285-289.

[3] 王玉标,饶锡如,何盼.异构环境下数据库增量同步更新机制[J].计算机工程与设计,2011(11):948-951.

[4] 杨鹏,杨海涛,王正华.异构数据库变化捕捉及同步策略[J].计算机工程,2008,34(16):53-55.

[5] 王军.基于XML的分布式异构数据库同步研究与设计[D].南昌大学,2007:11-13.

[6] 沈敏,许华虎,季永华,等.基于XML的分布式异构数据库数据同步系统的研究[D].计算机工程与应用,2005(5):2-5.

[7] 李佩.基于XML的异构数据库同步技术研究[D].曲阜师范大学,2010:5-12.

[8] 方焕.基于XML的分布式异构数据库同步系统设计与实现[J].广西通信技术,2014(4):21-25.

[9] 戴婉荣.基于分布式数据库的数据同步机制的研究与应用[D].武汉:武汉理工大学,2010:45-47.