一种数据源的迁移方法及系统与流程

文档序号:16999419发布日期:2019-03-02 01:39阅读:165来源:国知局
一种数据源的迁移方法及系统与流程

本发明涉及数据库技术领域,具体而言,涉及一种数据源的迁移方法及系统。



背景技术:

随着大数据时代的到来,传统的关系型数据库已经满足不了众多企业的需求,因此越来越多的企业需要将在传统的关系型数据库中存储的数据迁移到大数据平台中。其中,存储过程(storedprocedure)是在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

sql本身是一种结构化查询语言,加上了一些控制(赋值、循环和异常处理等),但不是面向对象的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。另外,存储过程依赖特定的数据库,在大数据和开源环境下,无法移植到其他开源存储,存储一旦变更,原来的存储过程代码全部重写,无法复用,这给大数据环境下数据业务迁移带来了很大的工作量,从而增加了数据源迁移的时间和成本。



技术实现要素:

有鉴于此,本发明实施例的目的在于提供一种数据源的迁移方法及系统,以解决上述对数据源迁移所需大量的时间和成本的技术问题。

第一方面,本发明实施例提供了一种数据源的迁移方法,包括:

获取待迁移数据源的存储过程,所述存储过程包括1个或多个sql语句;

对所述sql语句进行解析,生成各sql语句对应的java语法,所述java语法为目标数据库可识别的语法;

根据对所述java语法将所述待迁移数据源存储至所述目标数据库。

进一步地,所述方法,还包括:

从目标数据库中获取所述待迁移数据源的存储结果,并通过jdbc协议将所述存储结果返回至客户端,其中,所述存储结果包括排序结果、聚合结果和结果集中的任意一个或其组合。

进一步地,所述对所述sql语句进行解析,包括:

解析所述sql语句,获取所述sql语句中的关键字;

将每个关键字封装成对应的中间对象;

将每个中间对象转换成所述java语法。

进一步地,在生成各sql语句对应的java语法之后,所述方法,还包括:

对所述java语法的性能进行优化处理。

进一步地,在生成各sql语句对应的java语法之后,所述方法,还包括:

根据所述java语法生成对应的二进制代码,并将所述二进制代码序列化到在磁盘中,以及缓存到内存中。

进一步地,所述对所述sql语句进行解析,包括:

利用antlr4的解析工具和visitor的解析方式对所述sql语句进行解析。

进一步地,在将所述二进制代码序列化到在磁盘中之后,所述方法,还包括:

若系统初始化,则从所述磁盘中对所述二进制代码进行反序列化操作,并将反序列化后的二进制代码缓存到所述内存中。

第二方面,本发明实施例提供了一种数据源的迁移系统,包括:

获取模块,用于获取待迁移数据源的存储过程,所述存储过程包括1个或多个sql语句;

解析模块,用于对所述sql语句进行解析,生成各sql语句对应的java语法,所述java语法为目标数据库可识别的语法;

存储模块,用于根据对所述java语法将所述待迁移数据源存储至所述目标数据库。

第三方面,本发明实施例提供一种电子设备,包括:处理器、存储器和总线,其中,

所述处理器和所述存储器通过所述总线完成相互间的通信;

所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行第一方面的方法步骤。

第四方面,本发明实施例提供一种非暂态计算机可读存储介质,包括:

所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行第一方面的方法步骤。

本发明实施例通过获取待迁移数据源的存储过程,对存储过程中的sql语句进行解析,生成对应的java语法,然后根据java语法对待迁移数据源进行存储,即便在底层数据存储变更后,存储过程业务代码仍然可以平稳过度到目标数据库中,减少二次开发所需的时间和成本。

本发明的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明实施例了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本发明实施例提供一种数据源的迁移方法流程示意图;

图2为本发明另一实施例提供的一种数据源的迁移方法流程示意图;

图3为本发明实施例提供的原始数据库的部分存储过程代码示意图;

图4为本发明实施例提供的解析后获得的java语法的代码示意图;

图5为本发明实施例提供的一种数据源的迁移系统结构示意图;

图6为本发明实施例提供的电子设备实体结构示意图。

具体实施方式

下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本发明的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

图1为本发明实施例提供一种数据源的迁移方法流程示意图,如图1所示,该方法包括:

步骤101:获取待迁移数据源的存储过程,所述存储过程包括1个或多个sql语句。

在具体的实施过程中,在对待迁移数据源进行迁移之前,客户端根据jdbc协议与该系统建立连接并创建存储过程,存储过程创建完成后,客户端可以对存储过程发起调用。系统首先获取待迁移数据的存储过程,其中,存储过程中包括一个或多个sql语句。

步骤102:对所述sql语句进行解析,生成各sql语句对应的java语法,所述java语法为目标数据库可识别的语法。

在具体的实施过程中,系统对数据源的存储过程进行解析,在解析之前,需要确定数据源采用哪个数据库厂商的sql语法规则,例如该数据源可以是oracle数据库的pl-sql语法规则;确定解析工具,完成对pl-sql语法及词法定义,解析工具可以采用antlr4;解析方式的确定,且解析方式可以采用visitor的遍历模式。在解析时分别对存储过程中的每一个sql语句进行解析,生成每个sql语句对应的java语法。如果生成的java语法是目标数据库不能识别的,则需要对java语法进行方言转换,若目标数据库可识别的语法包括hive、phoenix和mysql,则应当将sql语句分别转换成hive、phoenix和mysql。应当说明的是,在转换过程中,包括了数据类型转换、函数转换和特殊语法转换。

应当说明的是,antlr4解析语言熟练程度,能决定后续存储过程解析的开发效率和质量保证。

antlr是用java写的语言识别工具,它用来声明语言的语法,简称为“元语言”(meta-language)。

antlr语法识别一般分为二个阶段:

1)词法分析阶段(lexicalanalysis)

对应的分析程序叫做lexer,负责将符号(token)分组成符号类(tokenclassortokentype)。

2)解析阶段

根据词法,构建出一棵分析树(parsetree)或叫语法树(syntaxtree)。

遍历模式分为:

1)listener(观察者模式,通过结点监听,触发处理方法)

2)visitor(访问者模式,主动遍历)

步骤103:根据对所述java语法将所述待迁移数据源存储至所述目标数据库。

在具体的实施过程中,在生成java语法后,将java语法存储到系统的执行引擎中,执行引擎对java语法进行执行,即执行引擎根据预设规则将数据源存储至目标数据库中。其中,预设规则为:

(1)业务分析系统中,sql中ddl操作(insert、delete、update)和dml操作(create、alter、drop),数据源存入phoenix(hbase);

(2)业务分析系统中,sql中的查询操作(select),数据源存入spark(hive);

(3)如果数据源有mysql那么所有的操作ddl、dml、query全部存入mysql。

本发明实施例通过获取待迁移数据源的存储过程,对存储过程中的sql语句进行解析,生成对应的java语法,然后根据java语法对待迁移数据源进行存储,即便在底层数据存储变更后,存储过程业务代码仍然可以平稳过度到目标数据库中,减少二次开发所需的时间和成本。

在上述实施例的基础上,所述方法,还包括:

从目标数据库中获取所述待迁移数据源的存储结果,并通过jdbc协议将所述存储结果返回至客户端,其中,所述存储结果包括排序结果、聚合结果和结果集中的任意一个或其组合。

在具体的实施过程中,在将数据源从原始的数据库迁移到目标数据库之后,系统中的执行引擎调用存入目标数据库中的待迁移数据源,获得对应的存储结果,并通过jdbc协议将存储结果返回给客户端,从而完成一次从客户端调用到系统,最后返回存储结果给客户端的闭环流程。应当说明的是,存储结果包括排序结果、聚合结果和结果集。其中,排序结果、聚合结果和结果集实施根据客户端调用的查询语句确定的,如果客户端要查询某个表,则存储结果中包括该表的所有数据,即结果集;如果客户端还需要获得该表根据id进行排序的结果,则还会降该表根据id进行排序后的排序结果进行返回;如果客户端要对某个表或多个表的信息进行汇总,则会向客户端返回聚合结果。

在上述实施例的基础上,所述对所述sql语句进行解析,包括:

解析所述sql语句,获取所述sql语句中的关键字;

将每个关键字封装成对应的中间对象;

将每个中间对象转换成所述java语法。

在具体的实施过程中,以pl-sql语法为例,存储过程里有对数据的操作的ddl语句、dml语句和查询语句。但由于这些语句原本都是pl-sql的语法,如果要到执行引擎执行的话,需要解析和转方言后才能由执行引擎执行。解析和转方言包括以下内容:

(1)解析pl-sql语句,把每个关键字封装成中间对象。

(2)根据中间对象转方言,转成目标数据库能识别的方言。

(3)函数管理。pl-sql内置函数在执行里如果没有,需要开发内置函数,以适应pl-sql的调用和传参方式。

本发明实施例通过获取待迁移数据源的存储过程,对存储过程中的sql语句进行解析,生成对应的java语法,然后根据java语法对待迁移数据源进行存储,即便在底层数据存储变更后,存储过程业务代码仍然可以平稳过度到目标数据库中,减少二次开发所需的时间和成本。

在上述实施例的基础上,在生成各sql语句对应的java语法之后,所述方法,还包括:

对所述java语法的性能进行优化处理。

在具体的实施过程中,在生成java语法之后,为了提高java语法的性能,可以对java语法的性能进行优化处理。

在上述实施例的基础上,在生成各sql语句对应的java语法之后,所述方法,还包括:

根据所述java语法生成对应的二进制代码,并将所述二进制代码序列化到在磁盘中,以及缓存到内存中。

在具体的实施过程中,在生成java语法之后,需要对java语法进行动态执行,生成计算机可直接识别的二进制代码,并且将二进制代码序列化到磁盘中备用,同时,还将二进制代码缓存到内存中。

在上述实施例的基础上,在将所述二进制代码序列化到在磁盘中之后,所述方法,还包括:

若系统初始化,则从所述磁盘中对所述二进制代码进行反序列化操作,并将反序列化后的二进制代码缓存到所述内存中。

在具体的实施过程中,如果系统初始化或者重启后,之前缓存在内存中的二进制代码会被清除,但是存储在磁盘中的二进制代码会永久的存在,因此可以从磁盘中二进制代码进行反序列化,并将反序列化后的二进制代码再次缓存到内存中。

图2为本发明另一实施例提供的一种数据源的迁移方法流程示意图,如图2所示,包括:

步骤201:对存储过程进行解析;

步骤s202:根据步骤s101解析后,生成对应的java代码。其中包括过程控制语句、条件判断语句、循环语句、函数调用等。生成java代码后,需要动态执行,生成计算机可直接识别的二进制代码,序列化到磁盘中备用,同时二进制代码缓存到内存中。

步骤s203:根据步骤201解析后,生成sql对应的java中间对象,为下一步转方言的做好准备。此处生成java中间对象还有另一个目的,就是为以后解析其他数据库厂商的语法统一中间对象,这样为下一步转方言解耦,也就是说步骤s204执行优化(转方言)不用依赖数据源的语法规则,直接根据中间对象执行优化就可以,为以后解析其他数据库厂商做好预留准备。

步骤s204:根据步骤203生成的中间对象,转成底层数据存储能识别的方言。此步骤需要完成plsql—hive,plsql—phoenix,plsql—mysql的三种方言的转换。每种方言的转换都包括数据类型转换、函数转换和特殊语法的转换。

步骤s205:根据步骤204执行性能优化,会得到转方言后的sql语法,推送到执行引擎中去执行。

步骤s206:根据步骤s202序列化到磁盘中的二进制代码,反序列化后加载到内存中。

步骤s207:在步骤s205和s206会根据调用情况选择存储的数据源。包括如下内容:

业务分析系统中,sql中ddl操作(insert、delete、update)和dml操作(create、alter、drop)数据源选择phoenix(hbase);

业务分析系统中,sql中的查询操作(select)数据源选择spark(hive);

如果数据源有mysql那么所有的操作ddl、dml、query全部走mysql。

步骤s208:执行引擎调用数据源返回排序结果,通过jdbc协议返回给调用客户端。完成一次从客户端调用到中间件执行,最后返回结果给客户端的闭环流程。

步骤s209:执行引擎调用数据源返回聚合结果和结果集,通过jdbc协议返回给调用客户端。完成一次从客户端调用到中间件执行,最后返回结果给客户端的闭环流程。

本发明实施例通过获取待迁移数据源的存储过程,对存储过程中的sql语句进行解析,生成对应的java语法,然后根据java语法对待迁移数据源进行存储,即便在底层数据存储变更后,存储过程业务代码仍然可以平稳过度到目标数据库中,减少二次开发所需的时间和成本。

本发明实施例以某市联通运营商营销价值系统由传统的oracle系统升级成大数据系统为例。运营商的营销价值系统从营销方案的事前预演到事中监控最后到事后评估,对营销全生命周期进行管控,对运营商的营销方案和效果提供数据支撑。

随着时间的积累,业务数据越来越多,每天500百兆的数据要入库,传统的oracle在常年累月的大数据下,已经出现了性能瓶颈。所以,考虑把传统的oracle升级为大数据hadoop+hive+spark的架构来存储数据,充分利用hadoop的数据节点可以低成本的动态添加来解决数据日益增长的问题。

那么在升级成大数据的过程中除了把数据从oracle迁移到大数据,还需要把原来的业务代码也迁移到可在大数据运行的业务代码,原关系型数据库的业务代码好多是存储过程,问题就变成如何让原oracle数据库中的存储过程改造成能在大数据平台下运行的代码就至关重要了。本发明就能很好的解决这个问题。

图3为本发明实施例提供的原始数据库的部分存储过程代码示意图,图4为本发明实施例提供的解析后获得的java语法的代码示意图,经过此发明的解析,生成如图4的java代码。包括以下解析:

图3中存储过程的创建包括4个形参(v1是入参,v2、v3、v4是出参),解析成图4的java代码时由arr.add(v1);arr.add(v2);arr.add(v3);arr.add(v4);返回给调用方。

图3中存储过程的打印函数dbms_output.put_line('valueofv2:'||v2);解析成图4的java语法_logger.info(”valueofv2:”+v2);

图3中存储过程的赋值语句v4:=0.11/2,解析成图4的java语法的v4=0.11/2;

图3中存储过程的字符串连接符||,解析成图4的java语法的字符串连接符+。

应当给说明的是,将存储过程中的参数解析为java语法的过程是预先约定好的。

图5为本发明实施例提供的一种数据源的迁移系统结构示意图,如图5所示,该系统包括:获取模块501、解析模块502和存储模块503,其中,

获取模块501用于获取待迁移数据源的存储过程,所述存储过程包括1个或多个sql语句;解析模块502用于对所述sql语句进行解析,生成各sql语句对应的java语法,所述java语法为目标数据库可识别的语法;存储模块5003用于根据对所述java语法将所述待迁移数据源存储至所述目标数据库。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法中的对应过程,在此不再过多赘述。

综上所述,本发明实施例通过获取待迁移数据源的存储过程,对存储过程中的sql语句进行解析,生成对应的java语法,然后根据java语法对待迁移数据源进行存储,即便在底层数据存储变更后,存储过程业务代码仍然可以平稳过度到目标数据库中,减少二次开发所需的时间和成本。

图6为本发明实施例提供的电子设备实体结构示意图,如图6所示,所述电子设备,包括:处理器(processor)601、存储器(memory)602和总线603;其中,

所述处理器601和存储器602通过所述总线603完成相互间的通信;

所述处理器601用于调用所述存储器602中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:获取待迁移数据源的存储过程,所述存储过程包括1个或多个sql语句;对所述sql语句进行解析,生成各sql语句对应的java语法,所述java语法为目标数据库可识别的语法;根据对所述java语法将所述待迁移数据源存储至所述目标数据库。

本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:获取待迁移数据源的存储过程,所述存储过程包括1个或多个sql语句;对所述sql语句进行解析,生成各sql语句对应的java语法,所述java语法为目标数据库可识别的语法;根据对所述java语法将所述待迁移数据源存储至所述目标数据库。

本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:获取待迁移数据源的存储过程,所述存储过程包括1个或多个sql语句;对所述sql语句进行解析,生成各sql语句对应的java语法,所述java语法为目标数据库可识别的语法;根据对所述java语法将所述待迁移数据源存储至所述目标数据库。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。

所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1