一种支持异构分布式数据库的发布方法与流程

文档序号:33622564发布日期:2023-03-25 13:02阅读:34来源:国知局
1.本发明属于数据库运维
技术领域
:,具体涉及一种支持异构分布式数据库的发布方法。
背景技术
::2.在oracle数据库和分布式mysql数据库并存的异构数据库架构中,数据库管理人员需要同时发布oracle和分布式mysql数据库,然而由于异构数据库的sql转换难、分布式数据库的sql审核难的问题,给异构分布式数据库的同时审核及发布带来了困难。3.sql在异构数据库间转换的难点在于:其一是sql解析难,业界有类似的开源项目可以借助,如apachecalcite,java编写,然而这些开源技术相对复杂,对运维人员的使用门槛要求较高;或者采用正则方式解析,然而正则表达式相对复杂,且由于sql在异构数据库中的语法多种多样,写法又不固定,并不能满足所有数据库场景,维护十分麻烦;其二是市面上没有支持异构数据库间sql类型转换的规则;4.分布式数据库的sql审核难点在于:inception作为一款mysql的sql语句审核自动化运维工具,因其准确且自动化审核的优点,被广泛应用于mysql的sql语句审核。然而inception工具仅支持单实例mysql的语句审核,难以应对结构复杂的分布式数据库,因此inception不能适用于分布式数据库的sql审核。5.《基于分布式数据库的sql审核方法、装置和计算机设备》(202110947420.0)提出在响应于sql请求时,获取每个计算节点的系统资源数据集、数据库指标数据集和sql执行计划数据集;基于每个计算节点配置的sql审核模型,以及每个计算节点的系统资源数据集、数据库指标数据集和sql执行计划数据集,确定每个计算节点的sql执行时长;基于每个计算节点的sql执行时长确定审核结果,解决了分布式数据库的实时审核,且审核的可靠性和精确度高。然而该技术的sql审核时需所有计算节点都执行一遍sql再做汇总,无疑增加耗时,不利于复杂大型数据库的运维管理;其次,此技术只关注非数据定义语言(简称:ddl)的执行计划和执行时间,审核场景的局限性不能满足数据库管理人员日常运维需求;而且,由于ddl审核会破坏线上数据库的结构,并不能在线上库执行。6.综上所述,急需一种支持异构分布式数据库发布的方法,保证既能有效解决异构数据库间sql语句的便捷转换,又能高效地完成分布式数据库中的sql审核。技术实现要素:7.本发明为了解决oracle和分布式mysql数据库同时审核、发布的问题,提供一种支持异构分布式数据库的发布方法,实现oracle数据库和mysql数据库之间的sql语句互换,以及支持分布式数据库的sql语句审核。8.本发明的技术方案是,一种支持异构分布式数据库的发布方法,具体步骤包含基于元数据的异构数据库sql语句转换、分布式数据库的sql语句审核,所述基于元数据的异构数据库sql转换是指oracle数据库和mysql数据库之间的sql语句互换。9.本发明方案的具体步骤包含:10.步骤1:获取oracle数据库的元数据存入解析map表,所述解析map表是依照key-value结构构建的表,以元数据的属性名作为key值,以元数据的属性值作为value值;所述元数据是包含表字段、主键及索引的元数据,所述表字段元数据属性包括方案名、表名、表字段名、表字段类型、表字段长度、是否可空、字段默认值;所述主键的元数据属性包含主键名和表字段名称,所述索引的元数据属性包含:索引名和和表字段名称;11.步骤2:建立并存储oracle和mysql数据库的表字段类型间的映射关系,所述映射关系存入映射map表,所述映射map表是依照key-value结构构建的表;以oracle的表字段类型为映射map表的key,以mysql的表字段类型为映射map表的value;12.步骤3:生成mysql的表字段类型和表字段长度:利用步骤1中生成的oracle表字段类型和表字段长度,根据映射map表定义的表字段类型映射关系,获取对应的mysql数据库的字段类型;以所述oracle表字段长度作为mysql表字段长度;13.步骤4:获取构造mysql数据库对象的信息;从解析map表中获取表字段、主键、索引的元数据;将其中的表字段类型和表字段长度,按照步骤3替换为mysql的表字段类型和表字段长度;14.步骤5:获取oracle数据库的ddlsql语句的类型;根据ddlsql语句的句头标记符判断ddlsql语句的类型,若所述句头包含createtable、comment的标记符,所述语句类型为建表语句;若所述句头包含createindex的标记符,所述语句类型为建索引语句;若所述句头包含altertable的标记符,所述语句的类型为修改表语句;15.步骤6:生成mysql数据库的ddlsql语句;针对每条oracle的ddlsql语句,在执行步骤5时,获取ddlsql语句中的表名;依据表名,按照步骤4,从解析map中获取构造mysql数据库对象的信息;根据语句类型,调用相应mysql的ddlsql语句的语法格式模板,将表名和数据库对象的信息填入所述模板中的相应位置;16.步骤7:执行分布式数据库的mysqlsql语句审核;获取数据库方案的分片库和单库,分别建立数据库方案名与分片库、单库的映射关系;所述分片库由至少2个数据库分片组成;所述数据库分片是存储分片表数据的数据库;所述每个数据库分片存储的分片表数据的表结构都是相同的;所述单库是存储非分片表数据的数据库;获取数据库方案中各表的存储位置,所述存储位置包含分片库和单库,依据所述映射关系,对分片库和单库执行sql语句审核。17.在所述步骤2中,所述建立的映射关系包含:18.{varchar2:varchar,clob:text,char:char,number(10):bigint,number(2):tinyint,number(4):smallint,number(8):int,number:decimal,date:datetime,timestamp:datetime,clob:longtext,blob:longblob,raw:varbinary,binary_float:float,binary_double:double}。19.在步骤3中,所述表字段类型和表字段长度以伪代码形式表示;所述利用伪代码是指利用format函数获取生成的表字段类型和表字段长度;20.在步骤4中,所述表字段的元数据、主键的元数据及索引的元数据以伪代码形式标识;所述利用伪代码是指利用format函数获取生成的表字段的元数据、主键的元数据及索引的元数据。value结构构建的表;具体是:获取oracle脚本中的sql语句,在oracle的临时数据库中执行所述sql语句,生成oracle数据库对象的元数据;从oracle数据库的数据字典中获取包含表字段、主键及索引的元数据存入解析map表中,其中以元数据的属性名作为key值,以属性值作为value值;所述表字段元数据属性包括:方案名(owner)、表名(table_name)、字段名(column_name)、表字段类型(data_type)、字段长度(data_length)、是否可空(nullable)、字段默认值(data_default)、字段顺序号(column_id);所述主键的元数据属性包含:主键名(constraint_name)和对应的表字段名(column_name);所述索引的元数据属性包含:索引名(index_name)和和对应的表字段名(column_name);36.在本发明实施例中,获取存入解析map中元数据如下:37.keyvalue方案名(owner)schema_1表名(table_name)table_1字段名(column_name)id表字段类型(data_type)number字段长度(data_length)10是否可空(nullable)否字段默认值(data_default)null字段顺序号(column_id)1字段名(column_name)name表字段类型(data_type)varchar2字段长度(data_length)50是否可空(nullable)否字段默认值(data_default)‘system’字段顺序号(column_id)2主键名(constraint_name)pk_tab1表字段名(column_name)id索引名(index_name)idx_tab1表字段名(column_name);name38.步骤102:建立并存储oracle和mysql数据库的表字段类型间的映射关系,所述映射关系存入映射map表,所述映射map表是依照key-value结构构建的表;具体是:以oracle的表字段类型为映射map表的key,以mysql的表字段类型为映射map表的value。39.oracle数据库包含了22个数据表字段类型,mysql数据库包含了19个表字段类型,通过总结数据库实际应用中表字段类型使用频率,剔除不常用的字段类型,分别从oracle数据库和mysql数据库中总结出15个表字段类型,按照oracle数据库、mysql数据库的表字段类型兼容性,以及数据库开发规范,经技术人员探究发现,确定解析map中最终存储的映射关系包含:40.{varchar2:varchar,clob:text,char:char,number(10):bigint,number(2):tinyint,number(4):smallint,number(8):int,number:decimal,date:datetime,timestamp:datetime,clob:longtext,blob:longblob,raw:varbinary,binary_float:float,binary_double:double}。41.本发明中的映射关系为现有异构数据库之间的字段类型映射提供了依据,自此之前从未有完整统一准确的映射关系提供参考,此外映射关系在互联网业务的数据库中经过效果验证。42.步骤103:生成mysql的表字段类型(column_type)和表字段长度(column_length):获取步骤101中生成的oracle的表字段类型和表字段长度,根据映射map表定义的表字段类型映射关系,获取对应的mysql的表字段类型;以所述oracle的表字段长度作为mysql的表字段长度;本发明实施中,利用伪代码表示生成的mysql的表字段类型和表字段长度,伪代码如下:43."{}({})".format(column_type,column_length);44.步骤104:获取构造mysql数据库对象的信息,包含表字段、主键、索引的信息;具体是从解析map表中获取表字段、主键、索引的元数据;45.所述获取表字段的元数据包含表字段名称、表字段类型、默认值、是否为空的标记;其中的表字段类型替换为所述步骤103生成的表字段类型;46.所述获取主键的元数据包含主键名、表字段名称;47.所述获取索引的元数据包含索引名、表字段名称;48.在本发明实施例中,利用伪代码表示生成的mysql表字段。伪代码如下:49."{}{}{}{},".format(column_name,column_type,"default"+defaultifdefaultelse"",isnull);50.在本发明实施例中,利用伪代码表示生成的主键,伪代码如下:primarykey({column_name});51.在本发明实施例中,利用伪代码表示生成的索引语句,伪代码如下:key{index_name}({column_name});52.步骤105:获取oracle数据库的ddlsql语句,利用正则表达式,检索所述ddlsql语句的句头是否包含createtable、createindex、altertable、comment的标记符;根据所述标记符判断ddlsql的语句类型;所述语句类型包含建表语句、建索引语句、修改表语句;其中,句头包含createtable、comment的标记符,所述语句类型为建表语句;句头包含createindex的标记符,所述语句类型为建索引语句;句头包含altertable的标记符,所述语句的类型为修改表语句;53.在本发明实施例中,通过编写用于查询的数据脚本,以jdbc形式查询oracle数据库,获取oracle数据的ddlsql语句,具体的数据库脚本如下:54.[0055][0056]以检索建表的语句类型为例,在本发明实施例中,利用如下正则表达式判断oracle的ddlsql语句的句头是否包含createtable的标记符。[0057]//先去除sql的注释[0058]sql=remove_comments(sql)[0059]//再判断sql是否是建表语句[0060]sql.lstrip().startswith("createtable")[0061]返回true,则是建表语句,否则不是。[0062]步骤106:依据语句类型及数据库对象的信息,生成mysqldeddlsql语句;具体是:针对每条oracle的ddlsql语句,执行步骤105时,获取ddlsql语句中的表名;依据表名,按照步骤104,从解析map中获取构造mysql数据库对象的信息;根据语句的类型,调用相应mysql的ddlsql语句类型的语法格式模板,将表名和数据库对象的信息填入所述模板中的表名和数据库对象的位置。当存在包含标记符comment的语句类型时,删除生成的修改表语句;这是由于oracle的建表语句的句头包含create、comment,但mysql的建表语句的句头仅有create;在oracleddlsql语句转化生成为mysqlddlsql语句的过程中,不仅会将oracle建表语句全部以create开头呈现,其中comment开头的语句又会以alter修改表的语句类型呈现,因此为避免重复,删除生成的建表语句;[0063]在本发明实施例中,获取到1条oracle的ddlsql的语句,如下:createtableschema_1.table_1[0064]([0065]idnumber(10)notnull,[0066]namevarchar2(50)default‘system’,[0067]constraintpk_tab1primarykey(id)[0068]);[0069]commentonschema_1.table_1.nameis‘姓名’;[0070]createindexschema_1.idx_tab1onschema_1.table_1(name);[0071]经语句类型判断,句头包含createtable,确定本条语句为建表语句。根据表名,按照步骤4,从解析map中获取构造数据库对象的信息,包含表字段、主键、索引的的元数据;并以伪码形式表示生成的表字段、主键、索引的元数据;[0072]“[0073]idbigintnotnull,[0074]namevarchar(50)nulldefault‘system’,[0075]primarykey(id),[0076]keyidx_tab1(name)[0077]”[0078]对应oracle建表的语句类型,获取mysql的建表语句的语法格式模板如下:[0079]createtable表名[0080](字段名,字段类型)[0081]将伪代码标识的表名和数据库对象的信息,填入mysql的建表语句的语法格式模板,如下:[0082]createtabletable_1[0083]([0084]idbigintnotnull,[0085]namevarchar(50)nulldefault‘system’,[0086]primarykey(id),[0087]keyidx_tab1(name)[0088]);[0089]步骤107:执行sql语句的去重和校验,具体包含:判断新建的表或表结构修改后,所有字符型字段长度的总和是否超过65535字节,如果超过则选取一个字节长度最长的表字段,将所述表字段的字符类型转换成text类型。由于mysql数据库限定,表中字符型字段长度总和不能超过65535字节。因此以表为单位,获取表中所有字符型的字段长度的总和,若超过65535字节;获取字节长度最长的字段,将其字段类型由字符型转为text类型。[0090]单条语句修改了多个字段,则合并多个字段并生成alter语句;,从而减少sql执行次数,缩短sql发布时间。本发明实施例中,依据语句类型及数据库对象的信息,生成mysqldeddlsql语句,语句如下:[0091]altertabletable_1addsexvarchar(50)notnull;[0092]altertabletable_1addscoredecimal(10,0)null;[0093]合并后的语句如下:[0094]altertabletable_1addsexvarchar(50)notnull,addscoredecimal(10,0)null;[0095]步骤108:待异构数据库间的sql转换结束后,执行分布式数据库的sql语句审核,具体步骤包含:[0096]步骤8-1:建立数据库方案与分片库的映射关系,所述映射关系是指分片库中第一个数据库分片与数据库方案的映射关系;所述分片库由至少2个数据库分片组成;所述数据库分片是存储分片表数据的数据库;所述每个数据库分片存储的分片表数据的表结构都是相同的;由于数据库分片的表结构都相同,因此任选一个数据库分片执行sql语句审核即可;为了提高选取数据库分片的效率,本发明定义选取第一个数据库分片执行sql语句审核;在实际实施中,一个数据库方案中包含多个表,一个表会被拆分为多个分片表数据,分片表数据会存储在由多个数据库分片组成的分片库中;分片库中的数据库分片是按照顺序编排,因此第一个数据库分片是固定的,而且选取容易。[0097]步骤8-2:判断数据库方案的表的存储位置:以数据库方案为单位,获取数据库方案的表的存储位置;若获取到的表的存储位置的个数多于1个,则所述数据库方案的表存储在分片库中;执行步骤8-3;若获取到的表的存储位置只有1个,判定所述表未经分片,则所述数据库方案的表存储在单库中;所述单库是存储非分片表数据的数据库,执行步骤8-4[0098]步骤8-3:根据数据库方案与分片库的映射关系,根据映射关系记录的数据库分片名,提取分片库中的第一个数据库分片;利用inception工具执行对所述第一个数据库分片执行sql语句审核;[0099]步骤8-4:根据预设的数据库方案名与单库的映射关系,利用inception工具对所述单库执行sql语句审核;[0100]步骤8-4:汇总分片库和单库的审核结果,所述审核结果包含审核成功和审核失败;若任一个数据库的审核结果是审核失败,则判定分布式数据库的sql审核失败。[0101]本发明不区分分布式环境中的数据类型是半结构化和非结构化数据,也不管分布式数据库的分片方式是垂直分片还是水平分片,通过利用数据库元数据及数据类型映射关系,完成ddlsql语句在异构数据库之间的转换生成;在执行数据库审核时,虽然inception工具是sql语句自动化审核工具,但这个工具在实际应用中,难以应对结构复杂的分布式数据库,更不能支持异构数据库,为了达到分布式数据库使用inception工具这一目的,从分片库中任选一个数据库分片进行审核,减少了审核分片库内所有数据库分片的繁琐操作,也增加了inception工具在分布式数据库中易用性。[0102]图2为本发明实施例中异构分布式数据库环境下sql发布系统架构图,具体包含相连的临时数据库、线上数据库、数据库发布平台;所述临时数据库部署为oracle数据库;所述线上数据库部署为异构分布式数据库,包含oracle数据库和mysql数据库;所述mysql数据库部署为分布式数据库,由多个分片库和单库组成;所述数据库发布平台包括依次连接的预处理模块、sql转换模块、sql校验模块和审核模块;[0103]所述预处理模块执行sql转换前的预处理程序,用于获取oraclesql文本,审核所述文本中的sql语句;待审核通过后,进行后续的sql转化;[0104]所述sql转换模块用于将oracle的sql语句转化为mysql的sql语句;所述sql转换模块在临时数据库中执行oracle的sql语句,基于生成的元数据,构造生成mysql的sql语句;[0105]所述sql校验模块用于针对生成的mysql的sql语句执行去重及校验处理;[0106]所述审核模块以数据库方案为单位,针对mysql分布式数据库中分片库和单库,执行sql语句审核,并将审核结果输出。[0107]本发明所达到的有益效果:[0108]1)本发明通过对oraclesql语句的执行,基于生成的元数据,按照表字段类型的映射关系,执行oraclesql语句解析及向mysqlsql语句的自动转换;转换过程以更便捷的方式实现,不需依赖于繁杂的开源技术及正则方式解析语法,不仅降低运维人员的使用门槛,也提高了异构数据库间的转换效率和准确度;[0109]2)本发明在分布式数据库的sql审核时,通过建立数据库方案与表存储位置的映射关系,以存储位置区分分片库和单库的sql审核,并以分片库中第一个数据库分片的审核结果作为分片库审核结果,不仅解决现有sql审核工具不适用分布式数据库的审核劣势,也简化了分布式数据库的繁琐的审核流程,减少了出错率。[0110]以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1