摘要:差异数据捕获是数据库同步的基础,对其它环节的影响也非常大。差异数据捕获不仅要获得复制对象的变化序列或当前映像.还要在对等式复制时提供尽可能详细的控制信息。该文在分析目前常用的差异数据捕获方法之后,提出了一种时间戳与触发器相结合的设计方案并加以实现。
1 引言
近年来.分布式数据库的设计在国内许多系统中的应用日渐广泛,越来越多的政府机构、高校和企业构建了自己的数据中心。以集合单位内部各部门的数据.用以解决制约单位信息化建设的“信息孤岛”问题。而如何使各部门未来的变化信息能够及时反映到数据中心中,即数据同步问题。这一问题受到专家和商业界的广泛关注,数据库数据同步成为一个重要的研究方向。目前很多同步方案采用增量复制,即只关注差异数据,以便减少同步数据量,提高数据库同步中数据迁移的效率。差异数据捕获作为数据库同步的基础和前提,对其研究无论在理论上还是实际上都具有非常重要的意义,而不同的差异数据捕获方法又各具特色,分析系统特点选择相应的差异捕获方法至关重要。2 研究现状 目前常用的差异数据捕捉方法主要有快照法、日志法、API法、影子表法、控制表法、时间戳法和触发器法。 所谓快照(Snapshot)就是在某一时刻对数据库中数据进行一次“照相”,生成一个描述数据库中数据的瞬时状态的静态文件,最后可以在规定时间内复制到目标数据库。这种方法不依赖任何机制,不占用额外系统资源,但是因为它是对数据库的完整拷贝,因此效率很低且无法区分哪些具体项发生改变。SQL Server数据复制中的快照复制就是基于这种方法。 日志法就是通过分析数据库日志的这些信息来捕获复制对象的变化序列。大多数数据库都有日志,利用日志不仅方便而且也不会占用太多额外的系统资源。但是日志法也存在一些缺点:首先,一些数据库系统不公开其日志的格式,要开发一个基于日志的变化捕获程序非常困难;其次,不同数据库在具体细节上存在很大差异,会给异构数据库带来新的问题;最后,DBA 日常数据库管理工作已经非常繁重,而日志法无疑会加重这种负担。如SQLServer中的事务复制以及DB2和SyBase都采用这种方法。 API法就是在应用程序和数据库之间引人一类中间件,由它提供一系列API,在API上来完成应用程序对数据库修改的同时,记录下同步对象的变化序列。API法可以实现日志法的大多数优点,但是同时也有两个严重缺点:其一是对于不经过API的操作所引起的数据变化API无法捕获:其二是应用程序的可移植性差。 影子表法是初始化数据库时,为每一个同步对象表建立一个影子表,即作为一份当时的拷贝,以后通过比较当前的影子表与源表获取变化信息。这种方法适用范围广,容易移植,很适合解决异构数据库同步。但是占用空间大,不能获得中间操作信息和控制信息,并且每次捕获变化都要扫描源表和影子表,效率很低。 控制表法就是为每个要同步的源表创建一个控制表,控制表只包含源表的主键字段和一些控制信息字段(更新时间、更新类型等),当源表中的某条记录发生变化时,同时添加或修改控制表相应主键记录。控制表法可以获得同步对象的净变化,运行和数据传输的效率都很高,控制表占用存储空间小于影子表,易于管理,并且控制表中保存的更新时间,操作者等控制信息,弥补了解决同步冲突的不足。但是由于它一般要依赖触发器实现,因而在应用上有一定的局限性。如杨亚楠等提出的“基于SQL重现法”就是基于控制表机制。 时间戳法就是需要相关应用系统中的每个表中都有一个时间戳字段,以记录每个表的修改时间。这种方法不影响原有应用的运行效率,但却需要对原有系统做较大的调整,而且不能捕获到那些并非通过应用系统引起的操作数据变化。 触发器法就是为复制对象创建相应的触发器,当对复制对象进行修改、插入和删除等DML命令时,触发器被唤醒,将变化捕获。触发器法克服了快照法的主要缺点。极大地提高了效率。如果辅以其他机制,可以用于同步复制和对等式复制。但是触发器捕获法占用的系统资源比较多,对于复杂的复制任务需要非常复杂的配置和实施,管理非常不方便。这种方法一般适合在那些有多触发器机制的数据库系统中使用。 除了以上介绍的几种常用方法外,其它方法大都是在这些方法基础上进行优化和组合。如杨亚楠等提出的“基于SQL重现法”就是对控制表法的改进;王军提出了触发器与API相结合的方法 ;刘伟提出了触发器与控制表结合法陶等等。3 触发器与时间戳相结合的差异数据捕获方案设计与实现3.1触发器与时间戳结合法工作原理与技术特点 触发器与时间戳结合法核心思想是:为源数据库要同步对象表中加入时间戳字段.设计同步时间表、删除表、更新表。差异数据捕获时,如系统进行添加和修改操作,则在相应的数据表中用时间戳字段记录下数据修改时间,同时通过触发器把发生变化的表名插入到更新表中。系统进行删除操作时,在删除记录的同时,借助触发器把删除记录的主键和记录所在的表名添加到删除表中。差异数据捕获过程如图:
在进行差异数据提取时,可按照以下步骤进行:首先提取删除表所有数据:其次查询更新表以获知那些数据表存在更新:最后通过存在更新的数据表中时间戳字段与同步时间表中记录的最近次同步时间的比较,提取差异数据。差异数据提取过程如图:
3.2 系统设计 触发器与时间戳结合法设计包括数据库表结构的设计和触发器的设计。3.2.1 系统表结构设计 系统表主要包括: 1)数据表,在原有数据的基础上,为每个数据表添加时间戳字段,以记录数据变更时间。 2)同步时间表(SynaTime),用来记录最近一次同步时间。包括SynaTimeID和上次同步时间SynaTime两个字段,同步时间表主要是记录上次数据同步时间,以便和数据表中时间戳字段对比,判断数据在一定时间段内有没有发生变更。 3)删除表(DeleteInfo),用来记录删除的数据。包括表名(Table_name)和删除记录的主键(PID)及删除时间(Del_time)三个字段。 4)更新表(ExtUpTable),用来记录那些表存在更新。包括更新表ID(Up_TablelD)和更新表名(Table_name)两个字段。更新表的设计可以大大缩减差异数据提取时的扫描范围,提高数据提取效率。3.2.2 触发器设计 触发器是数据库内部提供的一个机制,它的概念比较明了,对于导致数据库表内容发生变化的任何事件,例如:insert,delete,update数据库服务器可以自动采取相关的动作,这些动作可能是insert,delete,update或者execute proceduret。使用触发器可以编写多个应用共享的SQL语句。当多个程序需要执行相同的数据库操作时,使用触发器便可减少代码的冗余度。当然触发器的作用远不止减少代码的冗余度,它在保持数据库的数据完整性起着巨大的作用。 SQL Server触发器在执行用到两个特殊的表,即删除操作产生的Deleted表,插入操作产生的Inserted表。Inserted表和Deleted表是两个逻辑表,它们存放于内存中,不存放在数据库中,由系统自动维护。这两个表的结构总是与触发器作用的数据表的结构相同。触发器工作完成后,与该触发器相关的这两个表也会自动删除。这两个表用来检查一些数据更新的影响并为触发器动作设置条件,这两个表称为触表器检查表,触发器检查表中的数据不能直接改变,但是能够使用Select语句来检测Insert、Update、Delete操作带来的影响。在Insert语句执行期间,插入的新行同时被加到inserted表和触发器表中,Inserted表中的行是触发器表中插入新行的副本。在Delete语句执行期间,被删除的行从触发器表移动到Deleted表中,Deleted表和触发器表通常没有相同的行。在Update语句执行期间,被删除的行从触发器表移动到Deleted表中,修改后的行被同时加到Inserted表和触发器表中。触发器的设计包括三种:插入触发、修改触发、删除触发。 1)插入、修改触发 CREATE TRIGGER[tri_InsUp]ON[dbo].[ProjectInfo] FOR INSERT,UPDATE AS BEGIN INSERT INTO ExtUpTable VALUES('1','Projectlnfo') END2)删除触发
CREATE TRIGGER[tri_Del_Projectlnfo]ON[dbo].[ProjectInfo] FOR DELETE AS BEGIN INSERT INTO Deletelnfo SELECT pid,TabID FROM deleted END4 结论 不同的差异数据捕获方法都有其相应的优缺点,依据系统及采用同步方案的特点选择相应的捕获方法至关重要。本文通过分析当前使用的变化捕获方法,设计出了触发器与时间戳相结合的差异数据捕获方式。触发器的适用弥补了时间戳法需要分别比较同步对象表是否发生变化造成效率低的不足。时间戳又弥补了触发器占用系统资源过多,配置和管理不便的弱点。该方案最终在“房地产估价系统”得到了验证,大大提高了数据库集成问题中变化捕获系统的效率,并且完全实现了分布式环境下的客户数据变化增量的提取。来源: