数据库比较与同步软件的设计与实现

本文介绍了一款数据库比较与同步软件的设计思想、技术要点及使用方法,披露了其核心算法及性能指标,供IT技术人员借鉴参考。

1、开发背景

我是做软件开发的,在项目实施过程中,经常遇到系统对接问题,需要将一个系统的数据同步到另一个系统,即需要做数据库的同步。

搜遍了各大网络,未找到适合的解决方案。现有的数据库系统,大多数只支持同型数据库之间的同步,不支持异型数据库同步,而现实中的数据库种类很多,相互间都可能需要同步;其它同步软件又太复杂,需要配置的东西太多,不适合交付给普通客户使用。

干脆,自己动手开发了这款DBSync软件,用于各种数据库之间的比较与同步,且力求简单实用。

 

2、设计思想

传统的数据库同步,一般使用快照+事务日志的工作模式。用大白话来说,就是先把源数据整个复制到目标库,使得双方具有相同的起点;再启动监测程序,随时监测源数据的变化,一旦有更新操作(即事务),就将事务传递至目标库,在目标库中实施同样的更新,从而使得双方保持一致。

不同的数据库系统,事务日志的格式不同,按照这个模式设计的同步软件,只适用于同类型数据库的同步,如SQL Server到SQL Server,Oracle到Oracle等。DbSync采取不同的同步策略,不再卷入具体的事务,而是直接访问事务的结果,即直接访问数据,通过扫描比较双方数据,找到相互间的差异,再将差异部分同步过去。按照这个模式,DbSync就具有广泛的通用性,能用于各种数据库之间的同步。因为,无论什么样的数据库,也无论它怎么工作,最终的结果无非就是数据。

 

3、功能及技术要点

3.1使用ADO.Net的OleDbConnection连接数据库,因此能连接各数据源,包括Access、 SQL Server、Oracle、MySQL、DB2等常规数据库,也包括Excel、txt、csv等文件数据源。

3.2既支持相同类型数据库之间的同步,如Access到Access、SQL Server到SQL Server,又支持异型数据库之间的同步,如Excel到Access、Access到SQL Server、SQL Server到Oracle等。

3.3以任务为同步的基本单位,一个任务负责一对数据表之间的同步,多个数据表间的同步设置多个任务即可。

扫描二维码关注公众号,回复: 13266702 查看本文章

3.4任务采取线程的方式运行,可并发启动、执行多个线程,因此可并发执行多个同步任务。

3.5任务可设置为自动重复执行,只需预先设置好时间间隔,即可长期自动运行,从而实现无人值守同步。最短时间间隔可设置为1秒,几乎等同于实时同步。

3.6提供断点续传能力,当同步中断后,再次同步时能从中断位置继续同步,避免每次都从头开始。

3.7提供单独的数据比较功能,可对比两份数据,突出显示改动条目,修改情况一目了然。

 

4、使用方法

4.1主界面介绍

打开软件后进入主界面,显示同步任务列表,如下图所示:

图1:DBSync主界面

图1:DBSync主界面

说明:

●数据比较:Click任务列表中的“○”按钮,可比较双方数据,突出显示改动条目。

●数据同步:Click任务列表中的“►”按钮,立即开始同步。

●执行状态:实时显示同步进度信息,包括:已扫描的记录数、已同步(增删改)的记录数等。

●开始时间、结束时间、下次开始时间:显示每个任务执行的时间信息。

●日志:Click任务列表中的“查看”按钮,可查看该任务的操作历史、同步历史。

●设置:Click任务列表中的“修改”按钮,可修改任务设置。

4.2同步任务设置

软件预设了3个同步任务,用作示范。要同步自己的数据,您必须根据自己的需要设置任务,指定源数据表、目标数据表,以及同步方式、同步频度等。Click主界面上的“新增”按钮,即可新增一个同步任务,进入Step1。

Step1:选择源数据库、目标数据库

首先要指定源数据库、目标数据库,如下图所示:

图2:DBSync选择数据库

图2:DBSync选择数据库

说明:本界面的用途是设置源数据库及目标数据库的连接字符串,使得DBSync能连接双方数据库。其中,界面上打星号(*)的栏位是必填的。填写完成后,请Click标签2,进入Step2。

Step2:选择源数据表、目标数据表

图3:DBSync选择数据表

 

图3:DBSync选择数据表

说明:本界面的用途是选择源数据表及目标数据表。选择完成后,请Click标签3,进入Step3。

Step3:选择字段对应关系

图4:DBSync选择字段对应关系

图4:DBSync选择字段对应关系

 

说明:本界面的用途是选择字段对应关系,即:源字段以及对应的目标字段。如果您需要做增量同步,这里必须选择主键字段。主键字段是记录的唯一标志,它用于判别同步双方是否存在对应记录。选择完成后,请Click标签4,进入Step4。

Step4:选择同步方式及频度

图5:DBSync同步方式及频度

图5:DBSync同步方式及频度

说明:本界面的用途是选择同步方式及频度。

(1)同步方式:

●全部新增(Insert)至目标表:是指将源数据表中的数据全部Insert到目标数据表。

●仅同步增量数据:是指以主键字段为记录标识,查找相互间的差异,只同步差异部分(即增量部分),而相同部分不同步。

(2)执行频度:

●手动点击“开始”执行:是指每次同步都由用户Click任务列表中的“►”来执行。

●手动,然后自动重复执行:是指由用户Click“►”开始第一次执行,同步结束后,程序会按照预定时间间隔自动重复执行。只要程序不关闭,同步操作就会一直持续下去,从而实现无人值守同步。

(3)同步范围:

属于高级选项,可填写Select * From...Where... 形式的 SQL 语句,每次同步前会执行,用于进一步限定参与同步的数据范围。

(4)同步后处理:

属于高级选项,可填写 Update SQL 语句,每次同步后会执行,用于数据回写、数据转换、公式计算等额外任务。

4.3数据比较界面

设置好同步任务后,Click任务列表中的“○”按钮,进入扫描与比较界面,如下图所示:

图6:DBSync扫描与比较界面

图6:DBSync扫描与比较界面

说明:本界面的用途是比较双方数据,找出数据差异(即增量)。该界面不实施同步,仅展示增量数据,其中的红色部分为已修改字段,移动鼠标过去能显示修改前的原值。

 

5、具体设计与实现

5.1功能模块设计

DBSync功能模块设计

说明:

(1)同步设置模块,用于设置同步任务的具体要求,包括:源数据库、目标数据库,源数据表、目标数据表,设置同步方式、同步频度等。

(2)数据比较模块,根据同步任务信息,比较源数据与目标数据,向用户展示数据表之间的差异。

(3)数据同步模块,根据同步任务信息,执行数据同步,产生运行状态信息、日志信息。

(4)日志查询模块,根据日志信息,向用户展示同步日志。

(5)任务列表模块,根据同步任务信息、运行状态信息,显示任务列表,及各任务的当前执行状态。

5.2数据结构设计

(1)任务信息表(位于数据库DBSync.mdb)

(2)字段对应关系表(位于数据库DBSync.mdb)

(3)操作日志表(位于数据库DBSync.mdb)

(4)任务执行状态信息表(位于内存中)

5.3具体编程要点

开发环境:MS Visual Sudio 2017

编程语言:VB .Net

数据库:ASccess

关于各功能模块的实现方式,数据比较、数据同步模块,采用VB .Net Class,以便支持线程独立运行;其它模块主要作用是用户界面操作,因此采用VB .Net Form。

Class 和Form的编程本身没什么特殊性,这里不再具体讲解。本程序的主要技术点,在于主进程对线程的调度与交互,因此这里予以详解。其中,frmTaskList模块为主进程,负责任务列表的显示与维护,数据比较与同步的启动与中止,并实时显示同步状态与进度;clsTask为线程模块,负责具体的数据比较与同步。线程调用过程为:frmTaskList通过NEW Thread方法启动clsTask的Compare()或Sync()方法,执行数据比较或同步;完成后,clsTask Raise一个TaskEndEvent事件,该事件触发frmTaskList的回调TaskFinish ()函数,该函数再通过代理的形式调用RestoreTask ()过程,RestoreTask ()最终负责更新任务列表。主要代码框架如下:

'任务列表模块

Public Class frmTaskList

Delegate Sub TaskEndCallBack(ByVal TaskID As Long)

……

'数据比较或数据同步回调函数

Private Function TaskFinish(TaskID As Long)

'通过代理的形式调用RestoreTask

Me.Invoke(New TaskEndCallBack(AddressOf RestoreTask), TaskID)

End Function

 

任务完成后,任务列表的相关处理

Private Sub RestoreTask(TaskID As Long)

……

'比较、开始、修改按钮恢复正常,结束按钮恢掉

CompareButton.Enabled = True

StartButton.Enabled = True

StopButton.Enabled = False

ModifyButton.Enabled = True         

……

End Sub

      

‘Click同步按钮,启动线程执行同步

Private Sub cmdStartSync_Click(sender As Object, e As EventArgs) Handles cmdStartSync.Click

……

Dim Task As New clsTask

Dim TaskThread As New Thread(AddressOf Task.Sync)

AddHandler Task.TaskEndEvent, AddressOf TaskFinish

……

End Sub

 

‘Click比较按钮,启动线程执行比较

Private Sub cmdStartCompare_Click(sender As Object, e As EventArgs) Handles cmdStartCompare.Click

……

Dim Task As New clsTask

Dim TaskThread As New Thread(AddressOf Task. Compare)

AddHandler Task.TaskEndEvent, AddressOf TaskFinish

……

End Sub

……

End Class

 

‘数据比较、数据同步模块

Public Class clsTask

Event TaskEndEvent(ByVal TaskID As Long)  '任务运行完成事件

……

‘执行数据同步

Public Sub Sync()

…….

‘通知任务完成

RaiseEvent TaskEndEvent(TaskID)

……

End Sub

‘执行数据比较

Public Sub Compare()

            …….

‘通知任务完成

RaiseEvent TaskEndEvent(TaskID)

…….

End Sub

         ……

End Class

 

6、核心算法及提速措施

数据库产品的一个重要指标就是速度,同步软件也不例外。同步一般分两个步骤:先快照或复制过去,再监测更新并同步更新。前者类似于文件复制,是最初的一次性的动作;后者是长期的随时要做的动作,因此,重点在于更新速度。

传统同步软件通过事务日志进行更新,虽然不通用,但速度快,几乎是实时同步的效果;DBSync使用扫描比较判断更新,虽然通用,但速度可能较慢。为此,DBSync提供一种机制,使得每次同步仅扫描比较增量数据,从而大幅提速。

为了深入理解提速原理,我们先了解一下扫描比较的核心算法:首先,DBSync会读取双方的数据,并按主键字段排序;然后,以主键字段值为记录标识,依次比较双方的记录。对于源数据表存在而目标表不存在的记录,视作新增增量;对于目标数据表存在而源数据表不存在的记录,视作删除增量;对于源数据表与目标数据表均存在的记录,则继续比较其它字段,其它字段有差异的,视作修改增量;无差异的,则为相同数据。

一般来说,同步是定期重复执行的,两次同步间的增量非常有限,绝大部分是未变化的相同数据。比如,一个记录数为百万级的数据表,如果每5秒同步一次,5秒内的增量是很少的,通常也就几十条记录,与百万级总量相比几乎是忽略不计的。因此,简单的全表扫描比较会浪费大量时间,提速思路就是排除相同数据的无意义比较,仅扫描比较增量数据。具体措施:

6.1在源数据库中创建一个表,用于记录每次同步的完成时间,例如:表名DBSync,含一个字段SyncDate,其中的SyncDate初始化为一个很小的值,如:1900-1-1

6.2对于新增、修改增量,单独用一个任务来执行,并在Step4设置回写SQL,向源数据库写入同步完成时间,如:UPDATE DBSync set SyncDate=getdate();再限定源数据范围,如:SELECT a.* FROM Customer AS a, DBSync AS b where a.CreateTime>=b.SyncDate or a.UpdateTime>=b.SyncDate。如下图所示:

图7:DBSync限定扫描范围

图7:DBSync限定扫描范围

这样,第一次同步会全表扫描比较,以后同步就根据SyncDate仅提取增量数据,扫描比较的数量就大幅减少,速度自然也大幅提升。

利用此方案,需要注意的是,源数据表必须有CreateTime、UpdateTime字段,分别记有数据的新增时间、修改时间。

6.3 对于删除增量,用另一个任务来执行。由于该任务只比较双方的主键,不比较其它字段,即使不限定数据范围,速度也很快。

 

7、性能测试报告

测试环境:最普通的电脑,双核CPU,E7500,主频2.75G,内存2G。

数据库情况:源数据库、目标数据库均为SQL Server,位于同一台电脑上;源数据表、目标数据表均为Customer表,均含10个字段、100万条数据;源数据表含有增、删、改数据各100条,共300条增量。

任务设置情况:按照上述提速策略,安排2个任务来进行,任务4用于同步源数据库中的新增、修改增量,任务5用于同步删除增量。

任务执行结果:截图如下:

图8:DBSync速度测试

图8:DBSync速度测试

说明:对于新增、修改增量的同步,4秒钟完成;对于删除增量的同步,6秒钟完成。

结论:DBSync的优点是支持各种数据库,简单易用。缺点是速度稍慢,记录数为百万级的数据库同步,一般需要数秒钟才能完成;千万级的,约1分钟才能完成;亿级的,约数分钟才能完成。另外,DBSync只同步数据,不同步索引、触发器、存储过程等其它设置。

 

 

猜你喜欢

转载自blog.csdn.net/bhguo/article/details/89489764