一种关系型数据库到非关系型数据库的同步方法和系统
【技术领域】
本发明涉及数据库领域,特别是涉及一种关系型数据库到非关系型数据库的同步方法和系统。
【背景技术】
在传统行业,目前对数据的存储一般都采用关系型数据库,如ORACLE,DB2等。然而随着业务的发展,系统功能的增多,系统架构变得越来越复杂,对数据的存储与需求也变得越来越多样性,非关系型数据库,如远程字典服务(Remote Dictionary Server,简写为Redis),MongoDB等也开始逐渐进入传统行业。
基于非关系型数据库的特点,比如Redis,使用频繁或者I/O量比较大的数据会被放入其中。但是这部分数据起初是放在原有的关系型数据库中,同时在传统行业,由于旧系统通常都比较庞大复杂,若对系统相关接口进行修改将会变得非常复杂,因此导致未来这部分本应放在Redis中的数据仍然会通过原有系统接口写入到关系型数据库中。这时,一方面为了适应新业务而采用非关系型数据库作为存储和管理数据的工具,另一方面为了兼容旧有系统而又必须采用关系型数据库,如何兼容数据在关系型数据库和非关系型数据库的存储便成为急需要解决的问题。由于关系型数据库和非关系型数据库在内部存储的数据模型不一样,因此,传统的数据同步工具无法解决此问题。
鉴于此,如何克服现有技术所存在的缺陷,解决关系型数据库和非关系型数据库之间数据同步时由于数据类型不兼容所导致的同步方式繁琐复杂,且无法实时完整的进行同步的现象,是本技术领域亟待解决的问题。
【发明内容】
针对现有技术的以上缺陷或改进需求,本发明解决了关系型数据库向非关系型数据库的数据同步问题。
本发明实施例采用如下技术方案:
第一方面,本发明提供了一种关系型数据库到非关系型数据库的同步方法,具体为:解析源端的关系型数据库的数据库日志,获取源端的关系型数据库中需要同步的事务的标记信息和变更数据信息;根据事务的变更数据信息生成相应的SQL语句;将事务的同步信息发送至目的端,同步信息包括事务的标记信息和相应的SQL语句;目的端按照接收到的事务的标记信息对事务进行分类,并按照事务分类对同步信息进行保存;将同步信息转换为通用数据交换格式的数据;使用转换后的通用数据交换格式的数据对目的端的非关系型数据库进行同步更新。
优选的,获取关系型数据库中需要同步的事务的标记信息和变更数据信息,还包括:对数据库日志中的信息进行筛选,去掉与事务无关的日志数据,筛选出与事务相关的日志数据。
优选的,根据事务的变更数据信息生成相应的SQL语句,具体为:通过事务的变更数据信息和数据库日志生成对应的事务的变化数据的事务逻辑信息;由事务逻辑信息生成相应的SQL语句。
优选的,将事务的同步信息发送至目的端,具体为:源端将同步信息打包为消息报文,并发送至目的端;目的端接收消息报文,并提取其中的事务的标记信息和相应的SQL语句。
优选的,按照事务分类对同步信息进行保存,具体为:在目的端建立同步信息缓存区,事务链表形式将接收到的同步信息存入同步信息缓存区中相应的事务链表中。
优选的:当目的端接收到的同步信息大小总和超过预设的缓存区大小阈值时,将部分同步信息以文件形式保存到本地磁盘中,以便于释放同步信息缓存区大小接收新的信息。
优选的:当目的端接收到的同步信息数量超过预设的缓存信息个数阈值时,目的端暂停接收同步信息;当同步信息缓存区中的事务数量下降到缓存信息个数阈值以下时,再开始接收同步信息。
优选的,使用转换后的通用数据交换格式的数据对目的端的非关系型数据库进行同步更新,具体为:获取通用数据交换格式的数据中的操作类型和涉及到的数据;判断目的端的非关系数据库的类型;根据非关系数据库的类型调用相应的接口进行同步更新。
优选的,根据非关系数据库的类型调用相应的接口进行同步更新,具体为:在目的端的非关系数据库中调用相应的接口,对非关系型数据库进行相应的事务操作;或,将接口进行封装,以动态库的形式向第三方应用提供二次开发接口。
另一方面,本发明提供了一种关系型数据库到非关系型数据库的同步系统:包括至少一个源端的数据库服务器和至少一个目的端的数据库服务器,源端的数据库服务器上部署源端的关系型数据库,目的端的数据库服务器上部署目的端的非关系型数据库,源端的数据库服务器和目的端的数据库服务器间通过数据通信相连;源端的数据库服务器中包括日志捕获模块、数据发送模块,其中,日志捕获模块完成权利要求1-9中任一项的源端的数据库日志信息获取相关步骤,数据发送模块完成权利要求1-9中任一项的源端同步数据发送相关步骤;目的端的数据库服务器中的数据接收模块、数据解析模块、消息封装模块,其中,数据接收模块完成权利要求1-9中任一项的目的端同步数据接收相关步骤,数据解析模块完成权利要求1-9中任一项的同步数据解析和保存相关步骤,消息封装模块完成权利要求1-9中任一项的将同步信息转换为通用数据交换格式的数据的步骤。
与现有技术相比,本发明实施例的有益效果在于:通过解析关系型数据库的日志,获取变化的数据,并将数据发送至目的端,目的端将数据封装成非关系型数据库支持的数据格式,然后通过数据库接口写入数据,从而实现数据同步。
本发明提供了一种关系型数据库到非关系型数据库的同步方法和系统,其目的在于通过将源端的关系型数据库中的数据变化转换为目的端的非关系型数据库可接受的数据形式,对非关系型数据库进行相应的事务操作,从而完成关系型数据库向非关系型数据库的数据同步。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种关系型数据库到非关系型数据库的同步方法的流程图;
图2为本发明实施例提供的另一种关系型数据库到非关系型数据库的同步方法的流程图;
图3为本发明实施例提供的一种关系型数据库到非关系型数据库的同步系统的系统结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明各实施方式的使用的数据库服务器,一般包括处理器、硬盘、内存、系统总线等,数据库服务器和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高,以适应数据库服务中数据量、安全性要求高、业务请求频繁等功能。其它可完成数据库部署,并且可以通过数据传输完成同步信息发送和接收的设备也可以作为本发明实施例中的数据库服务器使用。
本发明将通过以下具体实施例,展开阐述如何在不同应用场景中,克服相关技术问题。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
关系数据库中的数据库日志中,记录了数据库中的各种改变相关的数据,即数据库的变化数据,在本实施例中使用到的变化数据包括用于确定事务的标记信息和事务的变更数据信息。
事务的标记信息是指用于唯一确定某一事务的信息,比如:事务标识、事务开始时间、事务提交时间等信息,数据库操作中可以通过这些信息区分各个事务,对某个事务进行唯一标识。在实际场景中,事务标识可以是事务ID,事务开始时间和事务提交时间可以由与事务相关的时间戳中确定。在本实施例的一般应用场景中,为了识别简便,可以选择事务ID作为标记信息使用。
事务的变更数据信息是指每一个事务所涉及的数据变化的内容,即在某一事务中,关于数据表中的数据所发生的变化的信息。对于数据库事务来说,数据变化类型包括数据库模式定义语言(Data Definition Language,简写为DDL):create,alter,truncate和drop;以及数据操纵语言(Data Manipulation Language,简写为DML):insert,update和delete,举例来说,事务中数据表变更的信息可以是新建了一张表,或者某张表添加了一个字段或删除了一个字段,或者某一张数据表中第N行中的一个数据
“10”修改成了“11”,或者第M行中的数据“A”被删除,还可能是新增了一行数据等等。由此,通过用于确定事务的标记信息和事务的变更数据信息可以确定重做日志对应的事务的变化数据。
本实施例中的数据同步功能主要对应于上述DML操作,即数据的插入,更新以及删除操作。
实施例1:
在实际场景中,源端的关系型数据库中的数据库日志会记录一段时间内所提交的事务相关信息,其中会包含这些事务的变化数据,这些变化数据即对应该段时间内关系型数据库中数据所发生的变化。进行数据库同步时,在目的端的非关系型数据库中将这些变化全部一一重现后,即可在非关系型数据库中重现关系型数据库中的变化,实现数据同步。
如图1所示,本发明实施例提供的关系型数据库到非关系型数据库的数据同步方法具体步骤如下:
步骤101:解析源端的关系型数据库的数据库日志,获取源端的关系型数据库中需要同步的事务的标记信息和变更数据信息。
在进行数据同步时,首先需要获取源端的关系型数据库中的数据库日志中的变化数据作为数据库同步的依据。为了准确获取每一个作为变化数据的事务,需要获取每一个事务的唯一表示和变化的内容,因此需要获取事务的标记信息和变更数据信息。在本实施例的一般使用场景中,关系数据库的系统表中保存了事务中变化数据的行信息所对应的索引信息,通过查询系统表,可以确定变化数据对应的表名、列名、表模式名、数据类型等索引信息,通过这些索引信息可以快速定位到变化数据在数据库所有数据中的具体位置。
步骤102:根据事务的变更数据信息生成相应的SQL语句。
获取到事务的变化数据后,可以将事务中数据表变更的行信息和其对应的索引信息确定为事务的变更数据信息。最后,根据获取到的用于确定事务的标记信息和事务的变更数据信息,可以获知用于表示重做日志对应的事务的变化数据的产生何种类型的变化,即获知变化数据的事务逻辑信息。由此,通过事务逻辑信息可以快速确定数据库中位于哪个位置的数据发生了何种变化,进而根据这些数据信息生成与实际场景中所做操作相对应的SQL语句。具体的,可以根据数据的插入、更新和删除等事务逻辑,选择对应的insert,update和delete等操作语句,并将变化的具体数据作为SQL语句的参数。将变化数据转换为SQL语句,可以用较少的数据量准确的表示出造成关系型数据库中数据变化的事务,使得数据同步时,在信息准确完整的前提下,向目的端的非关系型数据库传输的数据量较小,减少数据传输时间,提高数据同步效率。
步骤103:将事务的同步信息发送至目的端,同步信息包括事务的标记信息和相应的SQL语句。
目的端的非关系型数据库在进行同步时,需要按照源端的变化进行相应的改变,因此可以根据源端变化数据生成的SQL语句进行变化。同时,为了保证变化的唯一性和准确性,还需要通过事务的标记信息进行确认。因此,需要将产生每一个变化数据的事务的标记信息和相应的SQL语句发送至目的端,这些信息在本实施例中合称同步信息。源端和目的端之间的数据通信可以根据应用场景中的具体数据连接方式确定,例如,使用Telnet、FTP、SMTP、HTTP、DNS等网络传输协议进行传输。为了保证传输的效率及准确性,可以在源端将同步信息打包成消息报文,再通过FTP协议进行数据传输至目的端,目的端对消息报文进行解包,即可获得同步信息。
步骤104:目的端按照接收到的事务的标记信息对事务进行分类,并按照事务分类对同步信息进行保存。
目的端收到同步信息后,提取出事物的标记信息和SQL语句。由于同一个事务可能包括多个SQL语句,因此需要按照事务的标记信息对相应的SQL语句进行分类保存,避免对应关系混乱造成的同步错误。在本实施例的一般应用场景中,可以使用事务链表的形式进行保存,事务链表中保存了未提交的事务,由数据库管理系统管理提交时间,避免了同步信息在不适当的时间提交导致的数据库错误。
步骤105:将同步信息转换为通用数据交换格式的数据。
非关系型数据库中不能使用SQL语句对数据进行操作,并且针对不同的非关系型数据库需要使用不同的接口进行操作。因此,为了满足不同类型的非关系型数据库数据同步的需要,本实施例中,将同步信息中的SQL语句先转换为通用数据交换格式的数据,而不直接转换为具体的某种非关系型数据库所使用的数据操作接口,可以提高本实施例提供的数据同步方法的通用性。在本实施例的具体应用场景中,通用数据交换格式可以选用JSON、XML、JXML等格式。为了简便、易解析及减少数据量,本实施例的一般应用场景中,使用JSON格式。
步骤106:使用转换后的通用数据交换格式的数据对目的端的非关系型数据库进行同步更新。
将同步信息转换为通用数据格式的数据后,目的端的数据库管理系统可以对数据进行解析,并根据应用场景使用这些数据进行同步。例如,在某些应用场景中,直接按照数据中心的数据变化类型和参数对目的端的非关系型数据库进行更新;在另一些应用场景中,将转换后的通用数据类型的数据作为动态库供第三方应用程序进行调用,以便于第三方应用程序获取数据进行二次开发。
使用本实施例提供的数据同步方法中,目的端根据同步信息中的SQL语句类型获取数据变化的类型,根据数据变化类型,将事务的同步信息转换为代表相同操作类型并包含相同参数的JSON数据格式语句。具体实例如下,在具体的使用场景中,JSON数据中的字段根据实际情况进行变化:
(1)插入和删除操作:
其中,消息格式的说明如下:
DatasetTable:表示事务中数据变化的表的表名。
Flag:表示操作类型。可根据数据变化类型选择:INS:插入;DEL:删除;UPD:更新。
UpdateFields:表示更新的新值。
Fields:更新时,表示旧值;插入和删除时,表示列值。
本实施例提供的关系型数据库到非关系型数据库的数据同步方法,通过解析源端的数据库日志获取源端的关系数据库的数据变化类型和变化值,再将变化类型和变化值转换为以SQL语句表示的同步信息传输至目的端,目的端收到同步信息后将其再次转变为通用数据交换格式的数据,目的端的非关系型数据库的管理系统通过通用数据交换格式的数据对非关系型数据库进行数据同步。该方法简单准确的将关系数据库中的数据变化转换为费关系数据库的数据库管理系统可以识别和使用的形式,实现了关系型数据库向非关系型数据库的数据同步。
实施例2:
在实施例1中提供的关系型数据库到非关系型数据库的数据同步方法基础上,不同的具体使用场景中,还可以将实施例1中提供的方法进行不同的适应性补充、改进或调整。
为了提高使用实施例1提供的数据同步方法的数据库系统的模块化程度,实施例1中的各步骤可使用单独的功能模块进行执行。在具体实时场景中,可使用日志捕获模块进行源端数据库日志的解析和SQL语句的生成、使用NET发送模块将同步信息发送至目的端、使用NET接收模块接收源端发送的数据、使用EXEC模块解析收到的同步信息、使用消息封装模块将同步信息转换为通用数据交换格式的数据。
在关系型数据库中,数据库日志不仅保存了数据库的添加、更改和删除等会产生数据变化的事务相关的数据,还保存了查询、存储等不会产生数据变化的事务无关的数据,这些事务无关的数据在进行数据同步时不需要被使用。因此,在某些具体实施场景中,如图2所示,为了提高数据同步的效率,减少不需要使用的数据的影响,在获取数据库日志中的数据时,可以增加筛选步骤,先对数据库日志中的信息进行筛选,判定每一条日志记录是否为事务相关的记录,仅对事务相关的数据进行解析及获取,筛除事务无关的信息。
在实施例1提供的数据同步方法中,同步信息中使用SQL语言来表示数据的变化内容。但是,目的端的非关系型数据库无法直接使用SQL语言进行数据操作来进行同步。所以,需要进行数据类型转换,将SQL语言转换为非关系型数据库的数据管理系统能够解析或识别的数据类型进行使用。同时,目的端接收到同步信息后,不一定可以立即响应同步请求,可能需要等待数据库管理系统在适当的时候对同步信息进行调用,以避免由于操作顺序错误导致的数据库错误或数据库中的数据错误。因此,可以在目的端建立同步信息缓存区,对接收到的同步数据进行缓存,再进一步的进行数据类型转换或等待数据库管理系统的调用。
在具有同步信息缓存区的应用场景中,为了避免接受消息过多导致缓存区溢出,可以采取一些方式对缓存区接收的数据量进行限制,以下简单列举一些常见的限制方式:
(1)建立同步信息缓存区时,预设缓存区大小阈值,当目的端接收到的同步信息大小总和,即已保存在缓存区中的同步信息大小总和超过缓存区大小阈值时,将一部分同步信息以文件形式保存到本地磁盘中,以不同的存储形式来释放缓存区的存储空间,以便于接收新的同步信息。
(2)建立同步信息缓存区时,预设缓存区可接收的缓存信息个数阈值,当目的端接收到的同步信息个数大于缓存信息个数阈值时,目的端暂停接收同步信息,并通知源端暂停发送同步信息,等待同步信息缓存区中的同步信息被处理一部分后,同步信息缓存区中的同步信息数量小于缓存信息个数阈值时,再继续进行同步信息接收。进一步的,在源端也可以建立同步信息发送缓存区,当暂停发送时,将同步信息存入同步信息发送缓存区,以避免因发送不及时导致的同步信息丢失或顺序错误。
以上限制方式可以根据实际应用场景的需求,在不产生冲突和错误的情况下择一使用,或组合使用。
目的端使用通用数据交换格式的数据对目的端的非关系型数据库进行同步更新时,可以根据实际应用场景选择直接更新,或封装为动态库供第三方应用程序进行调用,以JSON格式数据为例,具体实例如下:
(1)直接写入数据库的情况下,首先将JSON格式数据中的操作类型及涉及到的数据解析出来,比如实施例1中JSON语句例子中的Flag参数和Fields参数,然后判断目的端非关系型数据库的类型,如Redis,MongoDB等,从而调用数据库提供的相应的接口去操作数据,例如:
Redis的插入操作为:
redis.set("key","value")。
MongoDB的插入操作为:
db.classes.insert({"name":"c1","count":30})。
(2)作为动态库供外部程序使用的情况下,消息封装模块则会提供类似于如下的函数接口:
int GetInfo(byte[]msg_txt,int max_len,int[]out_len),其中参数msg_txt为符合JSON格式的同步信息缓冲区,第三方应用通过调用该函数即可获取数据。
通过本实施例中提供的补充和优化方法与实施例1中提供的数据同步方法选择性的结合使用,可以一步提高实施例1中提供的数据同步方法的同步准确性和同步效率。
实施例3:
在上述实施例1和实施例2提供的关系型数据库到非关系型数据库的数据同步方法的基础上,本实施例还提供了一种可用于实现上述方法的关系型数据库到非关系型数据库的数据同步系统。
如图3所示,是本发明实施例的系统结构示意图:
包括源端的数据库服务器1和目的端的数据库服务器2,数据库服务器1和数据库服务器2之间通过数据通信相连。在本实施例的具体使用场景中,数据通信方式一般使用较为灵活、传输速度可、且支持远程数据传输的网络通信方式连接,网络通信方式的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
源端的数据库服务器1中部署了关系型数据库11,还包括日志捕获模块12、数据发送模块13。其中,日志捕获模块12和数据发送模块13可以和关系型数据库11部署在同一台物理硬件设备上,也可以部署在多台物理硬件设备上,并通过远程连接对关系型数据库11进行操作。
目的端的数据库服务器2中部署了非关系型数据库21,还包括数据接收模块22、数据解析模块23、消息封装模块24。其中,数据接收模块22、数据解析模块23、消息封装模块24可以和非关系型数据库21部署在同一台物理硬件设备上,也可以部署在多台物理硬件设备上,并通过远程连接对非关系型数据库21进行操作。在本实施例的一些具体应用场景中,目的端的数据库服务器2中也可以不部署非关系型数据库21,而是将直接将同步信息封装为动态库,供第三方程序调用。
日志捕获模块12完成实施例1和实施例2中源端的数据库日志信息获取相关步骤。如实施例1中的步骤101和步骤102,及实施例2中数据库日志中获取需要同步的事务的标记信息和变更数据信息、生成SQL语句的相关步骤。
数据发送模块13完成实施例1和实施例2中的源端同步数据发送相关步骤。如实施例1的步骤103,以及实施例2中的同步数据打包和发送的相关部分。
数据接收模块22完成实施例1和实施例2中目的端同步数据接收相关步骤。如实施例1的步骤104,以及实施例2中目的端接受同步数据并解包的相关步骤。
数据解析模块23完成实施例1和实施例2中同步数据解析和保存相关步骤。如实施例1的步骤105,以及实施例2中对同步数据的分类保存、缓冲区限制等相关步骤。
消息封装模块24完成实施例1和实施例2中将同步信息转换为通用数据交换格式的数据的步骤。如实施例1的步骤105,以及实施例2中将同步消息转换为通用数据交换格式、封装为动态库等相关步骤。
本领域普通技术人员可以理解实施例1和实施例2的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,并可以通过硬件或软件方式封装为实施例3中描述的各功能模块,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。