CN108647237A - 异构关系型数据库间的数据同步方法 - Google Patents
异构关系型数据库间的数据同步方法 Download PDFInfo
- Publication number
- CN108647237A CN108647237A CN201810295189.XA CN201810295189A CN108647237A CN 108647237 A CN108647237 A CN 108647237A CN 201810295189 A CN201810295189 A CN 201810295189A CN 108647237 A CN108647237 A CN 108647237A
- Authority
- CN
- China
- Prior art keywords
- database
- synchronous
- service
- trigger
- queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了异构关系型数据库间的数据同步方法,根据业务需求分别确定同步的源数据库、同步的目标数据库、数据库类型,以及涉及的数据库表;编写同步服务的功能代码,打包可部署的jar文件;在所述源数据库和目标数据库端分别架设Tomcat服务,部署搭建独立的消息队列服务queue,在源数据库中建立同步记录表;编写触发器脚本并在源数据库引擎中执行;定期查询同步记录表,批量获取未发出同步的记录并封装后投递到消息队列服务queue中;所述同步服务a在投递成功后,修改同步记录表;所述同步服务b定期从消息队列服务queue批量拉取同步记录,解析后执行实现同步。本发明的数据同步方法,可支持Sqlserver、Oracle与Mysql,采用关系数据库原生的触发器机制不需使用过多中间件或第三方软件。
Description
技术领域
本发明涉及数据库间数据同步技术,特别涉及数据库间的数据同步方法,适用于存在多个应用系统,各自采用不同的关系型数据库,且之间存在数据进行低延时同步应用。
背景技术
关系型数据库广泛地应用于海量的应用系统数据存储和查询,且有多种不同的实现。较为主流的关系型数据库包括Oracle、MS Sqlserver、Mysql,且各自拥有许多版本。
不同的关系型数据库之间,虽然结构类似,但在字段类型、值的存储、SQL语法方面仍存在着差异,不能直接通过简单的复制实现不同的关系型数据库之间数据同步。结构化查询语言SQL(Structured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
目前通常采用开源的工具框架解决上述问题,较有代表性的开源的工具框架为databus和otter。databus是LinkedIn开源的一款低延迟的分布式数据库同步系统,它提供可靠的数据捕获、流转和数据处理功能。其主要应用场景是跨部门之间或者跨机房之间进行数据库的数据订阅,支持Oracle和Mysql数据库。其主要原理是基于数据库日志进行分析和传输。otter是阿里巴巴基于canal的一款开源的分布式数据库同步系统,基于数据库增量日志解析,准实时同步到本机房或异地机房的Mysql/Oracle数据库。但是,这两种开源的工具框架都只支持Oracle和Mysql,对Sqlserver则不支持,无法满足与Sqlserver数据库进行同步的业务需求。此外,databus和otter作为开源框架,使用维护和升级存在一定的问题风险。
发明内容
本发明的目的在于实现支持包含Sqlserver在内的多个关系型数据库之间的数据同步,且利用数据库原生的机制,尽量少的使用第三方的工具和服务,同时实现较低的同步延时和严格的同步顺序。
本发明涉及的数据库为关系型数据库,是一种建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。为达成上述目的,本发明采用如下技术方案:
本发明提供了一种异构关系型数据库间的数据同步方法,是应用于目标数据库对源数据库进行同步,具体包括如下步骤:
步骤一,根据业务需求,分别确定同步的源数据库、同步的目标数据库、数据库类型以及涉及的源数据库的数据库表和目标数据库的数据库表;所述的数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系;
步骤二,编写同步服务的功能代码,并针对源数据库和目标数据库类型对SQL语法方面做针对性适配,并将同步服务的功能代码打包为可部署的jar文件;
步骤三,在所述源数据库架设Tomcat服务,以jar文件的形式部署同步服务a,所述同步服务a能够登录并访问所述源数据库;在所述目标数据库架设Tomcat服务,以jar文件的形式部署同步服务b,所述同步服务b能够登录并访问所述目标数据库;
步骤四,部署搭建独立的消息队列服务queue,所述同步服务a和所述同步服务b均能够访问所述消息队列服务queue;
步骤五,在源数据库中建立同步记录表;
步骤六,所述源数据库针对需要同步的数据库表,编写触发器脚本并在源数据库引擎中执行;
步骤七,所述同步服务a定期查询同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue的规定格式封装,封装后投递到消息队列中;
步骤八,所述同步服务a在投递成功后,在同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;本发明实施例中,为将同步记录表的sent字段值由0改为1,将同步记录表的synctime改为当前时间;
步骤九,所述同步服务b定期从消息队列服务queue批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在目标数据库执行,实现同步。
进一步的,上述异构关系型数据库间的数据同步方法的步骤S5中,所述同步记录表包括字段名称、字段类型、字段含义。
进一步的,上述异构关系型数据库间的数据同步方法中,按照具体业务情况,所述触发器为插入操作触发器、修改操作触发器、或删除操作触发器;目的是在数据发生插入操作、修改操作、或删除操作时,根据更新的数据内容,生成相应格式记录在同步记录表中。
进一步的,上述异构关系型数据库间的数据同步方法的步骤S2中,采用java语言编写同步服务的功能代码。
进一步的,上述异构关系型数据库间的数据同步方法还包括如下步骤:所述同步服务b完成同步后,从消息队列服务queue中删除已处理的同步记录。
以上为完成一轮单向的数据同步,同步服务a和b各自休眠一段时间后循环进行上述过程。
上述的异构关系型数据库间的数据同步方法只能实现单方向同步,为了实现双向同步,本发明还提供了另一种异构关系型数据库间的数据同步方法,可以实现第一数据库与第二数据库之间进行双向同步,具体实现方法包括如下步骤:
步骤一,根据业务需求分别确定第一数据库、第二数据库、数据库类型以及涉及的第一数据库的数据库表和第二数据库的数据库表;所述数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系;
步骤二,编写同步服务的功能代码,并针对第一数据库和第二数据库类型对SQL语法方面做针对性适配,并将同步服务的功能代码打包为可部署的jar文件;
步骤三,在所述第一数据库架设Tomcat服务,以jar文件的形式部署同步服务a,所述同步服务a能够登录并访问所述第一数据库;在所述第二数据库架设Tomcat服务,以jar文件的形式部署同步服务b,所述同步服务b能够登录并访问所述第二数据库;
步骤四,部署搭建独立的消息队列服务queue_a和queue_b,所述同步服务a和所述同步服务b均能够访问所述消息队列服务queue_a和queue_b;
步骤五,在所述第一数据库建立第一同步记录表;所述第一同步记录表包括字段名称、字段类型、字段含义;
在所述第二数据库建立第二同步记录表;所述第二同步记录表包括字段名称、字段类型、字段含义;
步骤六,所述第一数据库针对需要同步的第一数据库的数据库表,编写触发器脚本并在所述第一数据库引擎中执行;或所述第二数据库针对需要同步的第二数据库的数据库表,编写触发器脚本并在所述第二数据库引擎中执行;
步骤七,所述同步服务a定期查询第一同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue_a的规定格式封装,封装后投递到消息队列中;
或所述同步服务b定期查询第二同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue_b的规定格式封装,封装后投递到消息队列中;
步骤八,所述同步服务a在投递成功后,在所述第一数据库的第一同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;本发明实施例中,为将第一同步记录表的sent值由0改为1,将第一同步记录表的synctime改为当前时间;
或所述同步服务b在投递成功后,在所述第二数据库的第二同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;本发明实施例中,为将第二同步记录表的sent值由0改为1,将第二同步记录表的synctime改为当前时间;
步骤九,当第一数据库为源数据库,所述同步服务b定期从消息队列服务queue_a批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在第二数据库执行,实现同步;
当第二数据库为源数据库,所述同步服务a定期从消息队列服务queue_b批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在第一数据库执行,实现同步。
进一步的,上述异构关系型数据库间的数据同步方法还包括如下步骤:所述同步服务b完成同步后,从消息队列服务queue_a中删除已处理的同步记录;所述同步服务a完成同步后,从消息队列服务queue_b中删除已处理的同步记录。
若有第一数据库和第二数据库都需要更新同一张表的需求,即针对同一张数据库表做双向的数据同步,按照上述方案,对于需要双向同步的数据库表,在源数据库和目标数据库都会对该表添加触发器,则当通过同步服务对本地表进行数据更新时,会再次触发该表的相应触发器,从而形成无限的同步循环,造成数据库性能浪费和数据错误。此时需要做额外的处理,具体为如下:
在同步服务将接收到的数据同步更新到目标数据库表(本地数据库)前,利用会话变量、中间表查询标志方式,暂时关闭涉及数据库表的触发器,待完成数据写入后再将触发器恢复启用,达到避免循环同步问题的目的。在双向同步的场景中,两个数据库都会成为目标数据库。
这里用“本地”一词,是为了说明与相应同步服务在同一个部署环境中(例如同一台服务器,同一个局域网)。
进一步,还需要对触发器语句进行调整,增加对会话变量和中间表的引用判断。
在本发明一实施例中,若第一数据库或第二数据库为Mysql,采用session变量的方式控制触发器的工作,所述采用session变量的方式控制触发器的工作包括两部分:
(1)在Mysql端需要参与双向同步的数据库表的触发器语句中,增加对session变量的判断过滤;
(2)在同步服务的代码中,增加对相同session变量的定义,在将接收到的同步内容写入目标数据库的更新语句执行之前,加上对之前所命名session变量的修改并赋值为1,在执行后加上对该变量的修改并赋值为1以外的值,并且将上述更新操作封装为一个数据库事务进行执行。
在本发明一实施例中,若第一数据库或第二数据库为Sqlserver,可以通过同步标志表变量暂时屏蔽和恢复触发器,即在执行将接收到的同步内容写入源数据库的更新语句前后,分别加上对同步标志表某个字段值的修改,具体如下:
(1)新增一张同步标志表;
(2)在触发器语句中,加上对同步标志表的enableTrigger字段的查询和引用判断;
(3)同步服务的代码中,在将接收到的同步内容写入目标数据库的更新语句前,加
上对同步标志表的enableTrigger字段的修改并赋值为0,更新语句之后加上对同步标
志表的enableTrigger字段的修改并赋值为1,并将上述操作封装为一个事务执行。
本发明方法可以应用于异构关系型数据库间的数据同步,如高负载且相互联系的多个政务系统。本发明方法是利用数据库原生触发器机制,监控并记录发生变化的数据,利用消息队列等中间服务,实现源数据库与目标数据库业务上的解耦;利用数据库原生的事务特性,减小同步操作对数据库的资源开销,整体实现方案与业务的无关性,对应用系统本身功能不造成入侵和破坏,并可灵活扩展同步范围。与开源工具databus和otter相比,本发明的主要优点是可支持Sqlserver,同时功能可以按需求进行个性化调整,本发明的有益效果包括:
(1)利用关系数据库原生的触发器机制,不需使用过多中间件或第三方软件;
(2)较高的处理能力和较低的延时。在具体实践中,采用每5秒一次的同步频率,每次同步处理64条记录,即速度可达到46080条记录/小时,且同步最小延时为5秒;在数据库性能和负载允许的情况下,此处理速度也可进一步提高。
(3)可实现严格有序的数据同步,避免分布式消息队列服务乱序发送导致正确数据被覆盖的风险;
(4)可利用数据库原生的事务机制,减少对数据库的负载压力;
(5)与业务逻辑解耦,不需改动业务层面代码,可随时以较低的代价扩展同步范围(数据库表);
(6)同步发起端与同步接收端以异步的方式解耦,两端在业务处理上互不影响,发送端也不需等待接收端处理完即可持续发送,接收端也可以随时调整自身的接收处理逻辑。
附图说明
此处所说明的附图用来提供对发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为本发明一实施例的异构关系型数据库间的数据同步方法的流程步骤图;
图2为本发明另一实施的异构关系型数据库间的数据同步方法的流程步骤图。
具体实施方式
为了使本发明所要解决的技术问题、技术方案及有益效果更加清楚、明白,以下结合附图和实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
实施例1
本发明实施例提供了一种本发明提供了一种异构关系型数据库间的数据同步方法,是应用于目标数据库对源数据库进行同步,如附图1所示,具体包括如下:
步骤S11,根据业务需求,分别确定同步的源数据库、同步的目标数据库、数据库类型以及涉及的源数据库的数据库表和目标数据库的数据库表;所述的数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系;
步骤S12,采用java语言编写同步服务的功能代码,并针对源数据库和目标数据库类型对SQL语法方面做针对性适配,并将同步服务的功能代码打包为可部署的jar文件;
步骤S13,在所述源数据库架设Tomcat服务,以jar文件的形式部署同步服务a,所述同步服务a能够登录并访问所述源数据库;在所述目标数据库架设Tomcat服务,以jar文件的形式部署同步服务b,所述同步服务b能够登录并访问所述目标数据库;
步骤S14,部署搭建独立的消息队列服务queue,所述同步服务a和所述同步服务b均能够访问所述消息队列服务queue;
步骤S15,在源数据库中建立同步记录表,所述同步记录表包括字段名称、字段类型、字段含义;
步骤S16,所述源数据库针对需要同步的数据库表,编写触发器脚本并在源数据库引擎中执行;
步骤S17,所述同步服务a定期查询同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue的规定格式封装,封装后投递到消息队列中;
步骤S18,所述同步服务a在投递成功后,同步记录表将本次发出的同步记录表的sent值由0改为1,将同步记录表的synctime改为当前时间;
步骤S19,所述同步服务b定期从消息队列服务queue批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在目标数据库执行,实现同步。
进一步的,上述异构关系型数据库间的数据同步方法中,按照具体业务情况,所述触发器为插入操作触发器、修改操作触发器、或删除操作触发器;目的是在数据发生插入操作、修改操作、或删除操作时,根据更新的数据内容,生成相应格式记录在同步记录表中。
进一步的,上述异构关系型数据库间的数据同步方法还包括如下步骤:所述同步服务b完成同步后,从消息队列服务queue中删除已处理的同步记录。
以上为完成一轮单向的数据同步,同步服务a和b各自休眠一段时间后循环进行上述过程。
本发明实施例中,所述源数据库为Sqlserver,其同步记录表如表1所示;所述目标数据库为Mysql,其同步记录表如表2所示。
表1Sqlserver的同步记录表
表2Mysql的同步记录表
字段名称 | 字段类型 | 含义 |
id | int(10) | 自增的主键,代表同步记录的序号 |
operate | char(6) | 记录数据操作的类型 |
entity | varchar(100) | 数据库表的名称 |
sent | tinyint(1) | 是否已发出同步消息 |
addtime | timestamp | 同步记录生成的时间 |
synctime | timestamp | 同步记录发出的时间 |
content | text | 记录更新后的数据内容 |
实施例2
要在实施例1方法上需要同时实现第一数据库和第二数据库之间双向的同步,则在两端数据库都添加触发器。在此情况下可复用同步服务a和b,即同步服务a和b都各自周期性进行“从消息队列拉取”——“组装数据并写入”——“本地待同步消息查询”——“组装消息并投递”的流程。
本发明实施例提供了本发明还提供了另一种异构关系型数据库间的数据同步方法,可以实现第一数据库与第二数据库之间进行双向同步,如附图2所示,具体实现方法包括如下步骤:
步骤S21,根据业务需求分别确定第一数据库、第二数据库、数据库类型以及涉及的第一数据库的数据库表和第二数据库的数据库表;所述数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系;
步骤S22,编写同步服务的功能代码,并针对第一数据库和第二数据库类型对SQL语法方面做针对性适配,并将同步服务的功能代码打包为可部署的jar文件;
步骤S23,在所述第一数据库架设Tomcat服务,以jar文件的形式部署同步服务a,所述同步服务a能够登录并访问所述第一数据库;在所述第二数据库架设Tomcat服务,以jar文件的形式部署同步服务b,所述同步服务b能够登录并访问所述第二数据库;
步骤S24,部署搭建独立的消息队列服务queue_a和queue_b,所述同步服务a和所述同步服务b均能够访问所述消息队列服务queue_a和queue_b;
步骤S25,在所述第一数据库建立第一同步记录表;所述第一同步记录表包括字段名称、字段类型、字段含义;
在所述第二数据库建立第二同步记录表;所述第二同步记录表包括字段名称、字段类型、字段含义;
步骤S26,所述第一数据库针对需要同步的第一数据库的数据库表,编写触发器脚本并在所述第一数据库引擎中执行;或所述第二数据库针对需要同步的第二数据库的数据库表,编写触发器脚本并在所述第二数据库引擎中执行;
步骤S27,所述同步服务a定期查询第一同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue_a的规定格式封装,封装后投递到消息队列中;
或所述同步服务b定期查询第二同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue_b的规定格式封装,封装后投递到消息队列中;
步骤S28,所述同步服务a在投递成功后,在所述第一数据库的第一同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;将第一同步记录表的sent值由0改为1,将第一同步记录表的synctime改为当前时间;
或所述同步服务b在投递成功后,在所述第二数据库的第二同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;将第二同步记录表的sent值由0改为1,将第二同步记录表的synctime改为当前时间;
步骤S29,当第一数据库为源数据库,所述同步服务b定期从消息队列服务queue_a批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在第二数据库执行,并从消息队列服务queue_a中删除已处理的同步记录,实现同步;
当第二数据库为源数据库,所述同步服务a定期从消息队列服务queue_b批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在第一数据库执行,并从消息队列服务queue_b中删除已处理的同步记录,实现同步。
若有第一数据库和第二数据库都需要更新同一张表的需求,即针对同一张数据库表做双向的数据同步,按照上述方案,对于需要双向同步的数据库表,在源数据库和目标数据库都会对该表添加触发器,则当通过同步服务对本地表进行数据更新时,会再次触发该表的相应触发器,从而形成无限的同步循环,造成数据库性能浪费和数据错误。此时需要做额外的处理,具体为如下:
在同步服务将接收到的数据同步更新到本地数据库表前,利用会话变量、中间表查询标志方式,暂时关闭涉及数据库表的触发器,待完成数据写入后再将触发器恢复启用,达到避免循环同步问题的目的。
进一步,还需要对触发器语句进行调整,增加对会话变量和中间表的引用判断,具体如下:
若第一数据库或第二数据库为Mysql,采用session变量的方式控制触发器的工作,所述采用session变量的方式控制触发器的工作包括两部分:
(1)在Mysql端需要参与双向同步的数据库表的触发器语句中,增加对session变量的判断过滤,此处假定将该变量命名为@disable_triggers;
(2)在同步服务的代码中,增加对相同session变量的定义,在将接收到的同步内容写入源数据库的更新语句执行之前,加上对之前所命名session变量的修改并赋值为1(通过SQL语句“SET@disable_triggers=1;”),在执行后加上对该变量的修改并赋值为1以外的值例如NULL(通过SQL语句“SET@disable_triggers=NULL;”),并且将上述更新操作封装为一个数据库事务进行执行。
Sqlserver没有session变量的概念,若第一数据库或第二数据库为Sqlserver,可以通过语句禁用和启用触发器实现相同目的,即在执行将接收到的同步内容写入目标数据库的更新语句前,加上相应数据库表触发器的禁用命令(通过SQL语句“ALTERTABLEDISABLE TRIGGER xxx”,其中xxx为触发器名称),更新后加上相应触发器的启用命令(通过SQL语句“ALTER TABLE ENABLE TRIGGER xxx”,其中xxx为触发器名称)。但是这种方式中,禁用和启动触发器的操作比较耗时,会导致同步过程中数据库的锁表和阻塞,影响整体的数据库性能表现,所以本发明在实践中进行优化,并改为采用同步标志表的方式:
1)新增一张同步标志表hy_synctag,且只有一条记录,如表3所示结构如下:
表3同步标志表
字段名称 | 字段类型 | 含义 |
enableTrigger | tinyint | 是否需屏蔽触发器的标志位 |
remark | varchar(100) | 备注说明 |
2)在触发器语句中,加上对同步标志表的enableTrigger字段的查询和引用判断;
3)同步服务的代码中,在将接收到的同步内容写入目标数据库的更新语句前,加上对同步标志表的enableTrigger字段的修改并赋值为0(通过SQL语句“update hy_synctagset enableTrigger=0;”),更新语句之后加上对同步标志表的enableTrigger字段的修改并赋值为1(通过SQL语句“update hy_synctag set enableTrigger=1;”),并将上述操作封装为一个事务执行。
其中,步骤S26中,按照具体业务情况,所述触发器为插入操作触发器、修改操作触发器、或删除操作触发器。
进一步的,所述同步服务a或同步服务b完成同步后,在相应消息队列服务中删除已处理的同步记录。
上述两个实施例阐述的是单向同步的过程、双向同步的过程,而在实际应用中,这两种是可以合并应用的,实现复杂多样形式同步的需求。
上述说明描述了本发明的几个优选实施例,但应当理解本发明并非局限于上述几个实施例,且不应看作对其他实施例的排除。通过本发明的启示,本领域技术人员结合公知或现有技术、知识所进行的改动也应视为在本发明的保护范围内。
Claims (10)
1.一种异构关系型数据库间的数据同步方法,其特征在于,目标数据库对源数据库进行同步,包括如下步骤:
步骤一,根据业务需求,分别确定同步的源数据库、同步的目标数据库、数据库类型以及涉及的源数据库的数据库表和目标数据库的数据库表;
步骤二,编写同步服务的功能代码,并针对源数据库和目标数据库类型对SQL语法方面做针对性适配,并将同步服务的功能代码打包为可部署的jar文件;
步骤三,在所述源数据库架设Tomcat服务,以jar文件的形式部署同步服务a,所述同步服务a能够登录并访问所述源数据库;在所述目标数据库架设Tomcat服务,以jar文件的形式部署同步服务b,所述同步服务b能够登录并访问所述目标数据库;
步骤四,部署搭建独立的消息队列服务queue,所述同步服务a和所述同步服务b均能够访问所述消息队列服务queue;
步骤五,在源数据库中建立同步记录表;
步骤六,所述源数据库针对需要同步的数据库表,编写触发器脚本并在源数据库引擎中执行;
步骤七,所述同步服务a定期查询同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue的规定格式封装,封装后投递到消息队列中;
步骤八,所述同步服务a在投递成功后,在同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;
步骤九,所述同步服务b定期从消息队列服务queue批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在目标数据库执行,实现同步。
2.根据权利要求1所述的异构关系型数据库间的数据同步方法,其特征在于,
步骤五中,所述同步记录表包括字段名称、字段类型、字段含义。
3.根据权利要求1所述的异构关系型数据库间的数据同步方法,其特征在于,
按照具体业务情况,所述触发器为插入操作触发器、修改操作触发器、或删除操作触发器。
4.根据权利要求1所述的异构关系型数据库间的数据同步方法,其特征在于,
步骤二中,采用java语言编写同步服务的功能代码。
5.根据权利要求1所述的异构关系型数据库间的数据同步方法,其特征在于,
所述同步服务b完成同步后,从消息队列服务queue中删除已处理的同步记录。
6.一种异构关系型数据库间的数据同步方法,其特征在于,第一数据库与第二数据库之间进行双向同步,包括如下步骤:
步骤一,根据业务需求分别确定第一数据库、第二数据库、数据库类型以及涉及的第一数据库的数据库表和第二数据库的数据库表;
步骤二,编写同步服务的功能代码,并针对第一数据库和第二数据库类型对SQL语法方面做针对性适配,并将同步服务的功能代码打包为可部署的jar文件;
步骤三,在所述第一数据库架设Tomcat服务,以jar文件的形式部署同步服务a,所述同步服务a能够登录并访问所述第一数据库;在所述第二数据库架设Tomcat服务,以jar文件的形式部署同步服务b,所述同步服务b能够登录并访问所述第二数据库;
步骤四,部署搭建独立的消息队列服务queue_a和queue_b,所述同步服务a和所述同步服务b均能够访问所述消息队列服务queue_a和queue_b;
步骤五,在所述第一数据库建立第一同步记录表;在所述第二数据库建立第二同步记录表;
步骤六,所述第一数据库针对需要同步的第一数据库的数据库表,编写触发器脚本并在所述第一数据库引擎中执行;所述第二数据库针对需要同步的第二数据库的数据库表,编写触发器脚本并在所述第二数据库引擎中执行;
步骤七,所述同步服务a定期查询第一同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue_a的规定格式封装,封装后投递到消息队列中;
或所述同步服务b定期查询第二同步记录表,批量获取未发出同步的前若干条同步记录,将查询结果的operate、entity、content字段进行拼接,拼装为json形式的字符串;并将所述字符串依据消息队列服务queue_b的规定格式封装,封装后投递到消息队列中;
步骤八,所述同步服务a在投递成功后,在所述第一数据库的第一同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;
或所述同步服务b在投递成功后,在所述第二数据库的第二同步记录表中,将本次发出的同步记录标记为已发送并记录发送时间;
步骤九,当第一数据库为源数据库,所述同步服务b定期从消息队列服务queue_a批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在第二数据库执行,实现同步;
当第二数据库为源数据库,所述同步服务a定期从消息队列服务queue_b批量拉取同步记录,解析后转换为多个SQL语句,组合后以事务形式在第一数据库执行,实现同步。
7.根据权利要求6所述的异构关系型数据库间的数据同步方法,其特征在于,
在同步服务将接收到的数据同步更新到目标数据库表前,利用会话变量、中间表查询标志方式,暂时关闭涉及数据库表的触发器,待完成数据写入后再将触发器恢复启用。
8.根据权利要求7所述的异构关系型数据库间的数据同步方法,其特征在于,
对触发器语句进行调整,增加对会话变量和中间表的引用判断。
9.根据权利要求8所述的异构关系型数据库间的数据同步方法,其特征在于,
若第一数据库或第二数据库为Mysql,采用session变量的方式控制触发器的工作,所述采用session变量的方式控制触发器的工作包括两部分:
(1)在Mysql端需要参与双向同步的数据库表的触发器语句中,增加对session变量的判断过滤;
(2)在同步服务的代码中,增加对相同session变量的定义,在将接收到的同步内容写入目标数据库的更新语句执行之前,加上对之前所命名session变量的修改并赋值为1,在执行后加上对该变量的修改并赋值为1以外的值,并且将上述更新操作封装为一个数据库事务进行执行。
10.根据权利要求8所述的异构关系型数据库间的数据同步方法,其特征在于,
若第一数据库或第二数据库为Sqlserver,可以通过同步标志表变量暂时屏蔽和恢复触发器,即在执行将接收到的同步内容写入源数据库的更新语句前后,分别加上对同步标志表某个字段值的修改,具体如下:
(1)新增一张同步标志表;
(2)在触发器语句中,加上对同步标志表的enableTrigger字段的查询和引用判断;
(3)同步服务的代码中,在将接收到的同步内容写入目标数据库的更新语句前,加上对同步标志表的enableTrigger字段的修改并赋值为0,更新语句之后加上对同步标志表的enableTrigger字段的修改并赋值为1,并将上述操作封装为一个事务执行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810295189.XA CN108647237A (zh) | 2018-03-30 | 2018-03-30 | 异构关系型数据库间的数据同步方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810295189.XA CN108647237A (zh) | 2018-03-30 | 2018-03-30 | 异构关系型数据库间的数据同步方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108647237A true CN108647237A (zh) | 2018-10-12 |
Family
ID=63745205
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810295189.XA Pending CN108647237A (zh) | 2018-03-30 | 2018-03-30 | 异构关系型数据库间的数据同步方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108647237A (zh) |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109710688A (zh) * | 2018-11-26 | 2019-05-03 | 福建天泉教育科技有限公司 | 一种数据实时比对校验方法及消息中间件 |
CN109947444A (zh) * | 2019-02-18 | 2019-06-28 | 南京邮电大学 | 一种动态针对网元设备配置脚本更新组建的方法 |
CN110209741A (zh) * | 2019-06-14 | 2019-09-06 | 上海中通吉网络技术有限公司 | 异构数据源间的数据同步方法、装置和设备 |
CN110275893A (zh) * | 2019-06-11 | 2019-09-24 | 上海上湖信息技术有限公司 | 一种数据操作方法及装置 |
CN110941623A (zh) * | 2019-11-12 | 2020-03-31 | 北京达佳互联信息技术有限公司 | 数据的同步方法及装置 |
CN111061745A (zh) * | 2019-10-10 | 2020-04-24 | 望海康信(北京)科技股份公司 | 数据同步系统及方法 |
CN111143745A (zh) * | 2019-12-27 | 2020-05-12 | 中冶建筑研究总院有限公司 | 基于html的数据同步和交互的方法和系统 |
CN111339207A (zh) * | 2020-03-20 | 2020-06-26 | 宁夏菲麦森流程控制技术有限公司 | 一种多类型数据库之间同步数据的方法 |
CN111367995A (zh) * | 2020-02-10 | 2020-07-03 | 北京百度网讯科技有限公司 | 基于服务锁的数据同步方法及装置、电子设备与存储介质 |
CN112015821A (zh) * | 2020-09-08 | 2020-12-01 | 香港中文大学(深圳) | 一种数据库同步方法、终端以及存储介质 |
CN112163037A (zh) * | 2020-09-17 | 2021-01-01 | 彩讯科技股份有限公司 | 一种数据同步方法、装置、计算机设备及存储介质 |
CN112783980A (zh) * | 2021-02-01 | 2021-05-11 | 北京百度网讯科技有限公司 | 数据同步处理方法、装置、电子设备以及计算机可读介质 |
CN112905613A (zh) * | 2021-02-08 | 2021-06-04 | 中国工商银行股份有限公司 | 一种异构数据库的数据双向同步方法及装置 |
CN112988883A (zh) * | 2019-12-16 | 2021-06-18 | 中兴通讯股份有限公司 | 数据库的数据同步方法、装置以及存储介质 |
CN112988804A (zh) * | 2019-12-12 | 2021-06-18 | 陕西西部资信股份有限公司 | 数据传输方法及系统 |
CN113194124A (zh) * | 2021-04-19 | 2021-07-30 | 西安热工研究院有限公司 | 基于分布式实时数据库的dcs后台多节点间点目录同步方法 |
CN113486116A (zh) * | 2021-07-07 | 2021-10-08 | 建信金融科技有限责任公司 | 一种数据同步方法、装置、电子设备及计算机可读介质 |
CN114490882A (zh) * | 2022-04-15 | 2022-05-13 | 北京快立方科技有限公司 | 一种异构数据库数据同步分析方法 |
CN116723204A (zh) * | 2023-08-07 | 2023-09-08 | 南京国电南自轨道交通工程有限公司 | 一种分层系统之间大数据量实时数据的同步方法 |
CN116975159A (zh) * | 2023-09-25 | 2023-10-31 | 云筑信息科技(成都)有限公司 | 一种增量数据同步的处理方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105320680A (zh) * | 2014-07-15 | 2016-02-10 | 中国移动通信集团公司 | 一种数据同步方法及装置 |
CN106339498A (zh) * | 2016-09-05 | 2017-01-18 | 北京微播易科技股份有限公司 | 数据同步方法、装置和系统 |
CN106357452A (zh) * | 2016-09-29 | 2017-01-25 | 上海和付信息技术有限公司 | 一种单点异构数据存储的高可用框架系统及其实现方法 |
-
2018
- 2018-03-30 CN CN201810295189.XA patent/CN108647237A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105320680A (zh) * | 2014-07-15 | 2016-02-10 | 中国移动通信集团公司 | 一种数据同步方法及装置 |
CN106339498A (zh) * | 2016-09-05 | 2017-01-18 | 北京微播易科技股份有限公司 | 数据同步方法、装置和系统 |
CN106357452A (zh) * | 2016-09-29 | 2017-01-25 | 上海和付信息技术有限公司 | 一种单点异构数据存储的高可用框架系统及其实现方法 |
Non-Patent Citations (1)
Title |
---|
贞心真义: "SymmetricDS数据库双向同步开源软件入门", 《HTTPS://WWW.CNBLOGS.COM/JYH317/P/4259635.HTML》 * |
Cited By (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109710688A (zh) * | 2018-11-26 | 2019-05-03 | 福建天泉教育科技有限公司 | 一种数据实时比对校验方法及消息中间件 |
CN109947444A (zh) * | 2019-02-18 | 2019-06-28 | 南京邮电大学 | 一种动态针对网元设备配置脚本更新组建的方法 |
CN110275893A (zh) * | 2019-06-11 | 2019-09-24 | 上海上湖信息技术有限公司 | 一种数据操作方法及装置 |
CN110209741A (zh) * | 2019-06-14 | 2019-09-06 | 上海中通吉网络技术有限公司 | 异构数据源间的数据同步方法、装置和设备 |
CN111061745A (zh) * | 2019-10-10 | 2020-04-24 | 望海康信(北京)科技股份公司 | 数据同步系统及方法 |
CN110941623A (zh) * | 2019-11-12 | 2020-03-31 | 北京达佳互联信息技术有限公司 | 数据的同步方法及装置 |
CN112988804A (zh) * | 2019-12-12 | 2021-06-18 | 陕西西部资信股份有限公司 | 数据传输方法及系统 |
CN112988883B (zh) * | 2019-12-16 | 2023-03-10 | 金篆信科有限责任公司 | 数据库的数据同步方法、装置以及存储介质 |
CN112988883A (zh) * | 2019-12-16 | 2021-06-18 | 中兴通讯股份有限公司 | 数据库的数据同步方法、装置以及存储介质 |
CN111143745A (zh) * | 2019-12-27 | 2020-05-12 | 中冶建筑研究总院有限公司 | 基于html的数据同步和交互的方法和系统 |
CN111367995A (zh) * | 2020-02-10 | 2020-07-03 | 北京百度网讯科技有限公司 | 基于服务锁的数据同步方法及装置、电子设备与存储介质 |
CN111339207A (zh) * | 2020-03-20 | 2020-06-26 | 宁夏菲麦森流程控制技术有限公司 | 一种多类型数据库之间同步数据的方法 |
CN112015821A (zh) * | 2020-09-08 | 2020-12-01 | 香港中文大学(深圳) | 一种数据库同步方法、终端以及存储介质 |
CN112015821B (zh) * | 2020-09-08 | 2023-11-07 | 香港中文大学(深圳) | 一种数据库同步方法、终端以及存储介质 |
CN112163037A (zh) * | 2020-09-17 | 2021-01-01 | 彩讯科技股份有限公司 | 一种数据同步方法、装置、计算机设备及存储介质 |
CN112783980A (zh) * | 2021-02-01 | 2021-05-11 | 北京百度网讯科技有限公司 | 数据同步处理方法、装置、电子设备以及计算机可读介质 |
CN112783980B (zh) * | 2021-02-01 | 2024-05-10 | 北京百度网讯科技有限公司 | 数据同步处理方法、装置、电子设备以及计算机可读介质 |
CN112905613A (zh) * | 2021-02-08 | 2021-06-04 | 中国工商银行股份有限公司 | 一种异构数据库的数据双向同步方法及装置 |
CN113194124B (zh) * | 2021-04-19 | 2022-10-25 | 西安热工研究院有限公司 | 基于分布式实时数据库的dcs后台多节点间点目录同步方法 |
CN113194124A (zh) * | 2021-04-19 | 2021-07-30 | 西安热工研究院有限公司 | 基于分布式实时数据库的dcs后台多节点间点目录同步方法 |
CN113486116A (zh) * | 2021-07-07 | 2021-10-08 | 建信金融科技有限责任公司 | 一种数据同步方法、装置、电子设备及计算机可读介质 |
CN114490882A (zh) * | 2022-04-15 | 2022-05-13 | 北京快立方科技有限公司 | 一种异构数据库数据同步分析方法 |
CN116723204A (zh) * | 2023-08-07 | 2023-09-08 | 南京国电南自轨道交通工程有限公司 | 一种分层系统之间大数据量实时数据的同步方法 |
CN116723204B (zh) * | 2023-08-07 | 2024-02-09 | 南京国电南自轨道交通工程有限公司 | 一种分层系统之间大数据量实时数据的同步方法 |
CN116975159A (zh) * | 2023-09-25 | 2023-10-31 | 云筑信息科技(成都)有限公司 | 一种增量数据同步的处理方法 |
CN116975159B (zh) * | 2023-09-25 | 2024-02-23 | 云筑信息科技(成都)有限公司 | 一种增量数据同步的处理方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108647237A (zh) | 异构关系型数据库间的数据同步方法 | |
CN103067483B (zh) | 基于数据包的远程数据增量同步方法 | |
US8374966B1 (en) | In memory streaming with disk backup and recovery of messages captured from a database redo stream | |
CN110175213A (zh) | 一种基于SCN方式的Oracle数据库同步系统及方法 | |
CA2665951C (en) | Asynchronous information sharing system | |
US20220414090A1 (en) | Blockchain data index method, blockchain data storage method and device | |
US10635658B2 (en) | Asynchronous shared application upgrade | |
US7035879B2 (en) | System and method for synchronizing data of wireless devices | |
CN106415536B (zh) | 用于数据库管理系统间的可插拔数据库传输的方法及系统 | |
US9047392B2 (en) | System and method for conversion of JMS message data into database transactions for application to multiple heterogeneous databases | |
US6963880B1 (en) | Schema evolution of complex objects | |
US7783601B2 (en) | Replicating and sharing data between heterogeneous data systems | |
US7167874B2 (en) | System and method for command line administration of project spaces using XML objects | |
US20040015504A1 (en) | System and method for caching data for a mobile application | |
US20160292162A1 (en) | Streamlined system to restore an analytic model state for training and scoring | |
CN102103642B (zh) | 基于oltp的数据删除方法、系统及图形数据库服务器 | |
CN102193991B (zh) | 基于oltp的数据修改方法、系统及图形数据库服务器 | |
WO2004104739A2 (en) | Method and system for reducing information latency in a business enterprise | |
US20070130157A1 (en) | Techniques for performing file operations involving a link at a database management system | |
WO2021036684A1 (zh) | 分布式数据同步方法、装置、设备及可读存储介质 | |
CN104050276A (zh) | 一种分布式数据库的缓存处理方法及系统 | |
WO2020258666A1 (zh) | 一种分布式系统及数据处理方法 | |
US7281024B1 (en) | Approach for propagating changes from a database to a client | |
US20060026167A1 (en) | Systems and methods of utilizing and expanding standard protocol | |
CN109857808B (zh) | 基于中立数据结构的纵向数据同步系统及方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |