一种表结构的变更方法及装置.pdf

上传人:li****8 文档编号:1664138 上传时间:2018-07-03 格式:PDF 页数:19 大小:1.40MB
返回 下载 相关 举报
摘要
申请专利号:

CN201310684340.6

申请日:

2013.12.13

公开号:

CN104714957A

公开日:

2015.06.17

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 17/30申请日:20131213|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

阿里巴巴集团控股有限公司

发明人:

林晓斌

地址:

英属开曼群岛大开曼资本大厦一座四层847号邮箱

优先权:

专利代理机构:

北京国昊天诚知识产权代理有限公司11315

代理人:

许志勇

PDF下载: PDF下载
内容摘要

本申请公开了一种表结构的变更方法及装置,用以解决现有技术中增加字段的方法的适用性较低,对数据操作指令的响应速度较低的问题。该方法创建与待增加字段的分表表结构相同的替换表,并在替换表中增加待增加字段,将该分表中的数据导入到替换表中,根据保存在日志文件中的数据操作记录,对导入数据后的替换表中的数据进行回放,使用回放后的替换表替换该分表。上述方法并不要求待增加字段的分表中的数据具有数据主键,因此可适用于分表数据不具有数据主键的场景,提高了在线变更表结构的适用性,而且,上述方法也无需同时对分表和替换表执行同一个数据操作,因此可有效提高数据库响应用户的数据操作指令的速度。

权利要求书

权利要求书
1.  一种表结构的变更方法,其特征在于,包括:
根据待增加字段的分表表结构,创建替换表,并在所述替换表中增加待增加字段;
将所述分表中的数据导入到所述替换表中;
根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作;
使用回放操作后的替换表替换所述分表。

2.  如权利要求1所述的方法,其特征在于,所述日志文件包括binlog日志。

3.  如权利要求1或2所述的方法,其特征在于,根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作,具体包括:
确定在将所述分表中的数据导入到所述替换表的导入过程中,保存在所述日志文件中的用户对所述分表的数据操作记录;
根据确定的所述数据操作记录,对导入数据后的替换表中的数据进行回放操作。

4.  如权利要求3所述的方法,其特征在于,所述日志文件中保存的各数据操作记录是按各数据操作记录生成的先后顺序依次存储在所述日志文件中的;
确定在所述导入过程中保存在日志文件中的用户对所述分表的数据操作记录,具体包括:
在所述导入过程开始前,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第一位置;
在所述导入过程结束后,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第二位置;
在所述日志文件中确定从所述第一位置到所述第二位置对应的第一子文 件;
根据所述分表的表标识,从所述第一子文件中提取包含所述分表的表标识的数据操作记录,作为确定的在所述导入过程中保存在所述日志文件中的用户对所述分表的数据操作记录。

5.  如权利要求4所述的方法,其特征在于,确定所述导入过程开始前所述日志文件中保存的最后一个数据操作记录所在的存储位置之前,所述方法还包括:
锁死所述分表;
确定所述导入过程开始前所述日志文件中保存的最后一个数据操作记录所在的存储位置之后,所述方法还包括:
解锁所述分表。

6.  如权利要求1或2所述的方法,其特征在于,根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作,具体包括:
将日志文件中保存的数据操作记录转换为执行语句,并对导入数据后的替换表执行所述执行语句。

7.  如权利要求1或2所述的方法,其特征在于,所述日志文件中保存的各数据操作记录是按各数据操作记录生成的先后顺序依次存储在所述日志文件中的;
使用回放操作后的替换表替换所述分表之前,所述方法还包括:
在所述回放操作的操作过程开始前,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第三位置;
在所述回放操作的操作过程结束后,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第四位置;
在所述日志文件中确定从所述第三位置到所述第四位置对应的第二子文件,并从所述第二子文件中提取包含所述分表的表标识的数据操作记录;
当所述第二子文件的大小不大于预设阈值时,锁死所述分表,并根据从所 述第二子文件中提取的数据操作记录,对经过所述回放操作后的替换表重新进行回放操作;
当所述第二子文件的大小大于预设阈值时,根据从所述第二子文件中提取的数据操作记录,对经过所述回放操作后的替换表重新进行回放操作,并针对上一次进行回放操作的操作过程重新确定第二子文件,直至确定的第二子文件的大小不大于预设阈值为止。

8.  一种表结构的变更装置,其特征在于,包括:
创建模块,用于根据待增加字段的分表表结构,创建替换表,并在所述替换表中增加待增加字段;
导入模块,用于将所述分表中的数据导入到所述替换表中;
回放模块,用于根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作;
替换模块,用于使用回放操作后的替换表替换所述分表。

9.  如权利要求8所述的装置,其特征在于,所述日志文件包括binlog日志。

10.  如权利要求8或9所述的装置,其特征在于,所述回放模块具体用于,确定在将所述分表中的数据导入到所述替换表的导入过程中,保存在所述日志文件中的用户对所述分表的数据操作记录,根据确定的所述数据操作记录,对导入数据后的替换表中的数据进行回放操作。

11.  如权利要求10所述的装置,其特征在于,所述日志文件中保存的各数据操作记录是按各数据操作记录生成的先后顺序依次存储在所述日志文件中的;
所述回放模块具体用于,在所述导入过程开始前,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第一位置;在所述导入过程结束后,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第二存储位置;在所述日志文件中确定从所述第一位置到所述第二位置对 应的第一子文件;根据所述分表的表标识,从所述第一子文件中提取包含所述分表的表标识的数据操作记录,作为确定的在所述导入过程中保存在所述日志文件中的用户对所述分表的数据操作记录。

12.  如权利要求11所述的装置,其特征在于,所述装置还包括:
锁控制模块,用于在所述回放模块确定所述导入过程开始时所述日志文件中保存的最后一个数据操作记录所在的存储位置之前,锁死所述分表;在所述回放模块确定所述导入过程开始时所述日志文件中保存的最后一个数据操作记录所在的存储位置之后,解锁所述分表。

13.  如权利要求8或9所述的装置,其特征在于,所述回放模块具体用于,将日志文件中保存的数据操作记录转换为执行语句,并对导入数据后的替换表执行所述执行语句。

14.  如权利要求8或9所述的装置,其特征在于,所述日志文件中保存的各数据操作记录是按各数据操作记录生成的先后顺序依次存储在所述日志文件中的;
所述装置还包括:
确定模块,用于在所述替换模块使用回放操作后的替换表替换所述分表之前,确定在所述回放操作的操作过程开始前,所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第三位置;确定在所述回放操作的操作过程结束后,所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第四位置;在所述日志文件中确定从所述第三位置到所述第四位置对应的第二子文件,并从所述第二子文件中提取包含所述分表的表标识的数据操作记录;
判断模块,用于判断所述第二子文件的大小是否不大于预设阈值;
锁控制模块,用于在所述判断模块的判断结果为是时,锁死所述分表;
所述回放模块还用于,在所述判断模块的判断结果为是时,根据从所述第二子文件中提取的数据操作记录,对经过所述回放操作后的替换表重新进行回 放操作;在所述判断模块的判断结果为否时,根据从所述第二子文件中提取的数据操作记录,对经过所述回放操作后的替换表重新进行回放操作,并指示所述确定模块针对上一次进行回放操作的操作过程重新确定第二子文件,直至确定的第二子文件的大小不大于预设阈值为止。

说明书

说明书一种表结构的变更方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种表结构的变更方法及装置。
背景技术
MySQL是一种小型关系型数据库管理系统,MySQL中通常包括多个分库,每个分库中又包括多个分表,分表用于记录数据。随着业务的发展,在MySQL中,分表的表结构变更操作已经成为经常执行的操作之一。
表结构变更分为两种,一种是在分表中增加索引,另一种是在分表中增加字段。由于MySQL自身的特性,增加索引的操作是可以在线执行的,而增加字段的操作却不能在线执行。在对一个分表增加字段时,需要重建整张分表,重建过程中需要将该分表全程锁死,也即,重建过程中用户不能对该分表进行任何操作(包括数据插入、数据更新、数据删除等操作),而重建分表的过程往往需要数小时甚至更长的时间,因此,基于该分表的线上业务是几乎无法接受的。由此可见,在实际应用中,如何在线对分表增加字段是一个亟待解决的问题。
下面举例说明在现有技术中的在线增加分表字段的方法。
假设要对分表A增加字段,待增加字段为字段x,则现有技术中在线增加分表A字段的方法如图1所示。
图1为现有技术中在线增加分表A字段的过程,具体包括以下步骤:
S101:创建一个新的分表,记为分表B。
其中,创建的分表B的表结构与分表A的表结构相同。
S102:在分表B中增加字段x。
S103:创建另一个新的分表,记为dk表。
S104:将分表A中的数据全部导入到分表B中,并在导入的过程中,将用户对分表A执行的数据插入操作和数据更新操作也同时对分表B执行,将用户对分表A执行的数据删除操作对应的数据主键记录在dk表中。
其中,在将对分表A执行的数据更新操作也同时对分表B执行时,具体是对分表A执行update语句,并同时将对分表A执行的update语句转换为replace语句对分表B执行。
S105:导入结束后,根据dk表中记录的数据主键,将导入数据后的分表B中该数据主键对应的数据删除。
S106:使用删除数据后的分表B替换分表A。
由上述图1所示的过程可以看出,步骤S105中得到的分表B就是对分表A增加了字段x的分表,后续可使用通过步骤S105得到的分表B支持原来的分表A所支持的线上业务。上述对分表A增加字段的过程不需要锁死分表A,整个过程中用户均可对分表A执行数据插入、数据更新、数据删除等操作,因此实现了可以在线对分表A增加字段。
然而,由于如图1所示的方法需要通过dk表记录用户对分表A执行的数据删除操作对应的数据主键,这就要求分表A中的数据具有数据主键,如果分表A中的数据没有数据主键,则图1所示的方法并不适用,因此,上述方法仅适用于分表中的数据具有数据主键的场景,对于分表中的数据不具有数据主键的场景则并不适用,也就是说,现有技术中在线对分表增加字段的方法的适用性较低。
而且,由图1所示的步骤S104可见,在将分表A的数据导入到分表B的过程中,所有对分表A执行的数据操作也要同时对分表B执行,这就意味着同一个数据操作要被同时执行两次,这样也会降低数据库对用户的数据操作指令的响应速度。
发明内容
本申请实施例提供一种表结构的变更方法及装置,用以解决现有技术中在线对分表增加字段的方法的适用性较低,对用户的数据操作指令的响应速度较低的问题。
本申请实施例提供的一种表结构的变更方法,包括:
根据待增加字段的分表表结构,创建替换表,并在所述替换表中增加待增加字段;
将所述分表中的数据导入到所述替换表中;
根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作;
使用回放操作后的替换表替换所述分表。
本申请实施例提供的一种表结构的变更装置,包括:
创建模块,用于根据待增加字段的分表表结构,创建替换表,并在所述替换表中增加待增加字段;
导入模块,用于将所述分表中的数据导入到所述替换表中;
回放模块,用于根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作;
替换模块,用于使用回放操作后的替换表替换所述分表。
本申请实施例提供一种表结构的变更方法及装置,该方法创建与待增加字段的分表表结构相同的替换表,并在替换表中增加待增加字段,将该分表中的数据导入到替换表中,根据保存在日志文件中的数据操作记录,对导入数据后的替换表中的数据进行回放,使用回放后的替换表替换该分表。上述方法并不要求待增加字段的分表中的数据具有数据主键,因此可适用于分表数据不具有数据主键的场景,提高了在线变更表结构的适用性,而且,上述方法也无需同时对分表和替换表执行同一个数据操作,因此可有效提高数据库响应用户的数据操作指令的速度。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为现有技术中在线增加分表A字段的过程;
图2为本申请实施例提供的表结构的变更过程;
图3为本申请实施例提供的表结构的详细变更过程;
图4为本申请实施例提供的表结构的变更装置结构示意图。
具体实施方式
由于在MySQL中,数据库根据用户发送的数据操作指令对数据进行操作时,会生成相应的数据操作记录保存在日志文件中,而日志文件中保存的数据操作记录还可以通过解析工具转换为执行语句,通过执行语句的执行则可回放用户操作数据的过程,因此,为了提高表结构变更方法的适用性,并提高数据库相应数据操作指令的速度,本申请实施例将待增加字段的分表中的数据导入到替换表中后,根据日志文件中保存的数据操作记录,对替换表回放导入过程中用户对分表中的数据的操作过程,以实现除增加了待增加字段以外,分表与替换表完全一致的目的,从而实现在线对分表增加字段,而且不要求分表中的数据具有数据主键,适用性较高,也不同时对分表和替换表执行同一数据操作,提高了数据库相应数据操作指令的速度。
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图2为本申请实施例提供的表结构的变更过程,具体包括以下步骤:
S201:根据待增加字段的分表的表结构,创建替换表,并在替换表中增加待增加字段。
在本申请实施例中,要在一个分表中增加字段时,同样要根据该待增加字段的分表的表结构,创建一个相同表结构的替换表,再在创建的该替换表中增加待增加字段。
例如,一个分表的表结构如表1所示。
商品标识卖家标识价格ID1卖家1XID2卖家2Y
表1
表1所示的分表中的字段包括商品标识、卖家标识、价格,如果要在如表1所示的分表中增加待增加字段“保质期”,则先创建一个与表1所示的分表的表结构相同的替换表,创建的替换表如表2所示。
商品标识卖家标识价格      
表2
需要说明的是,上述创建的如表2所示的替换表的表结构与表1所示的分表的表结构是相同的,但创建的替换表中并不包含表1所示的分表中的数据,如表1中的ID1、ID2、卖家1等。
创建了如表2所示的替换表后,可在替换表中增加待增加字段“保质期”,增加了待增加字段的替换表如表3所示。
商品标识卖家标识价格保质期        
表3
由表3可以看出,表3就是在表2的基础上增加了待增加字段“保质期”而得到的。
S202:将分表中的数据导入到替换表中。
在本申请实施例中,可通过全量导入的方法将分表中的数据全部倒入到增加了待增加字段后的替换表中。
继续沿用上例,得到如表3所示的替换表后,可将如表1所示的分表中的数据全量导入到表3中,得到的替换表如表4所示。
商品标识卖家标识价格保质期ID1卖家1X ID2卖家2Y 
表4
S203:根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作。
本申请实施例中所述的日志文件包括binlog日志。
由于将分表中的数据导入到替换表的导入过程需要一定的时间,而本申请实施例中为了实现在线增加分表字段,在导入过程中并未将分表锁死,因此,整个导入过程中用户仍可对该分表进行操作,如增加数据、更新数据、删除数据等。
但是,在导入数据时,导入到替换表中的数据是导入过程开始时该分表中的数据,在导入过程中,分表中发生改变的数据是不能导入到替换表中的,而由于日志文件中保存了用户对分表的数据操作记录,因此,本申请实施例中在将分表中的数据导入到替换表的导入过程结束后,可确定在该导入过程中保存在日志文件中的用户对该分表的数据操作记录,并根据确定的数据操作记录,对导入数据后的替换表中的数据进行回放操作,使替换表中除了新增的待增加字段以外,其他数据均与该分表保持一致。
继续沿用上例,假设在将分表中的数据导入到替换表中的导入过程开始 时,分表中的数据如表1所示,而在导入过程中,用户对如表1所示的替换表进行了数据插入操作,插入数据后的分表如表5所示。
商品标识卖家标识价格ID1卖家1XID2卖家2YID3卖家3Z
表5
对比表5与表1可以看出,在导入过程中,用户对表1插入了商品标识为“ID3”所在的一行数据,而由于将分表的数据导入到替换表中时,导入的数据是导入过程开始时如表1所示的分表中的数据,因此,导入过程结束后,得到的替换表是如表4所示的替换表,得到的替换表中并不包括新插入的“ID3”所在的一行数据。
由于日志文件中保存了所有用户进行的数据操作记录,因此,为了使替换表与分表保持一致(新增的待增加字段“保质期”除外),可在日志文件保存的数据操作记录中,确定将分表的数据导入到替换表的导入过程中用于对该分表的数据操作记录。
继续沿用上例,由于用户在将分表的数据导入到替换表的导入过程中对如表1所示的分表添加了商品标识为“ID3”所在的一行数据,因此,binlog日志中会保存用户添加该数据的数据操作记录,从而binlog日志解析工具确定出导入过程中用户对该分表的数据操作记录,确定出的数据操作记录即为:用户在如表1所示的分表中添加了商品标识为“ID3”所在的一行数据。再根据确定的数据操作记录对如表4所示的替换表进行回放操作,回放操作后的替换表如表6所示。
商品标识卖家标识价格保质期ID1卖家1X ID2卖家2Y 
ID3卖家3Z 
表6
由表6可以看出,除新增的字段“保质期”以外,如表6所示的替换表中的数据与表5所示的分表中的数据完全一致。
需要说明的是,binlog日志会记录用户对哪个分库中的哪个分表进行了何种数据操作,因此,可根据如表1所示的分表的表标识,通过binlog日志的解析工具确定出在导入过程中用户对如表1所示的分表的数据操作记录。目前的诸如MySQLbinlog等日志解析工具只能对binlog日志进行库级别的识别,但由于MySQLbinlog是一个开源的日志解析工具,因此,可在MySQLbinlog日志解析工具中增加识别binlog日志中的表标识的功能,用以识别binlog日志中包含该分表的表标识的数据操作记录,则识别出的数据操作记录就是用户对该分表的数据操作记录,后续根据识别出的数据操作记录对替换表中的数据进行回放操作,即可实现替换表的数据与分表的数据一致。
S204:使用回放操作后的替换表替换该分表。
具体的,使用回放操作后的替换表替换该分表的方法可以为:将该替换表的表标识修改为该分表的表标识,并将该分表删除或禁用。
由于对替换表中的数据进行回放操作后,替换表中的数据已经与分表中的数据一致(如上例中表6和表5所示),因此,可使用回放操作后的替换表替换分表,也即,使用回放操作后的替换表支持原来该分表所支持的线上业务。
由于在上述如图2所示的表结构变更方法中,通过将待增加字段的分表中的数据导入到替换表中,再通过日志文件中的数据操作记录对替换表中的数据进行回放,实现了新增待增加字段后的替换表中的数据与该分表中的数据的一致,全程无需锁死该分表,因此实现了在线对该分表增加字段。而且,由于回放操作是根据日志文件中保存的数据操作记录进行的,不要求该分表中的数据具有数据主键,因此本申请实施例提供的表结构变更方法可适用于分表数据不具有数据主键的应用场景,适用性较高。另外,本申请实施例提供的表结构变 更方法无需同时对分表和替换表执行同一个数据操作,因此,也可有效提高数据库响应用户的数据操作指令的速度。
进一步的,由于日志文件在保存数据操作记录时,也会保存相应数据操作的操作时刻信息(例如以时间戳的方式保存操作时刻信息),因此,在上述图2所示的步骤S203中,确定在导入过程(将分表中的数据导入到替换表中的导入过程)中保存在日志文件中的用户对该分表的数据操作记录的方法可以为:确定导入过程开始时的开始时刻以及导入过程结束时的结束时刻,确定从该开始时刻到该结束时刻的时间段,根据该分表的表标识,在日志文件中确定操作时刻信息落入该时间段内的数据操作记录,作为确定的在导入过程中保存在日志文件中的用户对该分表的数据操作记录。
但是,考虑到在实际应用中,日志文件记录的操作时刻信息大多是秒级别的,而在数据库中1秒的时间内用户对同一个分表执行的数据操作就会有成百上千次,因此,为了提高确定导入过程中产生的数据操作记录的准确性,本申请实施例中通过日志文件中保存数据操作记录的位置来确定导入过程中产生的数据操作记录。具体的,由于日志文件(例如binlog日志)中保存的各数据记录是按各数据记录生成的先后顺序依次存储在日志文件中的,因此,在确定导入过程中保存在日志文件中的用户对该分表的数据操作记录的方法具体为:在导入过程开始前,确定日志文件中保存的最后一个数据操作记录所在的存储位置,作为第一位置,在导入过程结束后,确定日志文件中保存的最后一个数据操作记录所在的存储位置,作为第二位置,在该日志文件中确定从该第一位置到该第二位置对应的第一子文件,根据该分表的表标识,从第一子文件中提取包含该分表的表标识的数据操作记录,作为确定的在该导入过程中保存在日志文件中的用户对该分表的数据操作记录。
例如,在导入过程开始前,日志文件中保存的最后一个数据操作记录所在的存储位置是第N个存储位置,在导入过程结束后,日志文件中保存的最后一个数据操作记录所在的存储位置是第M个存储位置,则日志文件中从第N个 存储位置到第M个存储位置对应的第一子文件中保存的所有包含该分表的表标识的数据操作记录,就是在该导入过程中产生的用户对该分表的数据操作记录,后续可根据这些数据操作记录对替换表进行回放操作。
进一步的,由于在实际应用中,确定上述第一位置的时刻是在导入过程开始之前,也即,确定第一位置的时刻不可能与导入过程开始的时刻完全一致,因此,即使确定第一位置的时刻到导入过程开始的时刻这段时间很短,也有可能发生在这段时间里又有用户对该分表进行数据操作的情况。
例如,确定第一位置的时刻是15:05:00,而导入过程开始的时刻是15:05:01,二者只差1秒,而如果在这1秒的时间里又有用户对该分表进行数据操作,假设该数据操作为插入了数据i,则由于将该分表的数据导入到替换表中的数据实际上是将该分表在导入过程开始时(也就是15:05:01,而不是15:05:00)的数据导入到替换表中,因此最终导入到替换表中的数据会包含用户插入的数据i。但由于确定第一位置的时刻是15:05:00,因此后续确定的导入过程中保存在日志文件中的对该分表的数据操作记录中就会包含插入该数据i的数据操作记录,从而在后续的回放操作中,又会对替换表进行插入数据i的回放操作,显然,这就会导致重复操作。
因此,为了避免回放操作中出现重复操作的情况,本申请实施例中,在确定第一位置(即,导入过程开始前日志文件中保存的最后一个数据操作记录所在的存储位置)前,还要锁死该分表,并在确定第一位置后,解锁该分表。由于确定第一位置这一过程只需要毫秒级别的时间,因此锁死该分表的时间也在毫秒级别,对于该分表所支持的线上业务而言是完全可以接受的。
另外,在图2所示的步骤S203中,根据日志文件中保存的数据操作记录对导入数据后的替换表中的数据进行回放操作的方法可以为:将日志文件中保存的数据操作记录(即,确定的在将分表中的数据导入到替换表的导入过程中,保存在日志文件中的用户对该分表的数据操作记录)转换为执行语句,并对导入数据后的替换表执行该执行语句。例如,对于binlog日志来说,MySQLbinlog 等日志解析工具可直接将binlog日志中的数据操作记录转换成执行语句,只要在对转换的执行语句进行执行时,将执行的对象由该分表修改为替换表,即可对该替换表执行转换的执行语句,达到替换表中的数据与该分表的数据一致的目的。
进一步的,考虑到对替换表进行回放操作的操作过程也需要一段时间,而在这段时间内如果用户又对该分表进行了数据操作记录,则回放操作后的替换表中的数据仍不能与该分表的数据一致,而由于使用替换表替换该分表的前提条件是替换表与分表中的数据完全一致,因此,为了进一步保证替换表中的数据与分表中的数据一致,本申请实施例中在根据日志文件中第一位置到第二位置的数据操作记录对替换表进行回放操作之后,在使用替换表替换该分表之前,还要重复的根据日志文件中保存的数据操作记录对替换表进行若干次回放操作。
具体的,由于日志文件中保存的各数据操作记录是按各数据操作记录生成的先后顺序依次存储在日志文件中的,因此,本申请实施例中在该回放操作的操作过程(即,根据日志文件中第一位置到第二位置的数据操作记录对替换表进行回放操作的操作过程)开始前,确定该日志文件中保存的最后一个数据操作记录所在的存储位置,作为第三位置,在该回放操作的操作过程结束后,确定该日志文件中保存的最后一个数据操作记录所在的存储位置,作为第四位置,在该日志文件中确定从该第三位置到该第四位置对应的第二子文件,并从该第二子文件中提取包含该分表的表标识的数据操作记录;当该第二子文件的大小不大于预设阈值时,锁死该分表,并根据从该第二子文件中提取的数据操作记录,对经过该回放操作后的替换表重新进行回放操作;当该第二子文件的大小大于预设阈值时,根据从该第二子文件中提取的数据操作记录,对经过该回放操作后的替换表重新进行回放操作,并针对上一次进行回放操作的操作过程重新确定第二子文件,直至确定的第二子文件的大小不大于预设阈值为止。其中,上述预设阈值可以根据需要进行设定,如设定为1000字节。
下面继续以表4、表5和表6进行说明。在导入数据后得到如表4所示的替换表后,由于用户在导入过程中又在分表中添加了商品标识为“ID3”所在的一行数据,添加数据后的分表为表5所示的分表,因此,本申请实施例中确定日志文件中导入过程开始前的第一位置到导入过程结束后的第二位置对应的第一子文件,该第一子文件中就包括用户在该分表中插入的“ID3”所在的一行数据的数据操作记录,从而,根据日志文件中的第一位置到第二位置对应的第一子文件中保存的数据操作记录对如表4所示的替换表进行回放操作,得到了如表6所示的替换表。而如果用户在该回放操作的操作过程中又对如表5所示的分表进行了数据操作,那么将会导致操作后的分表与得到的如表6所示的替换表中的数据不一致,因此,可在进行上述回放操作的操作过程开始前,确定日志文件中保存的最后一个数据操作记录所在的存储位置,即第三位置,在进行上述回放操作的操作过程结束后,确定日志文件中保存的最后一个数据操作记录所在的存储位置,即第四位置,并确定日志文件中第三位置到第四位置对应的第二子文件,该第二子文件中保存的包含该分表的表标识的数据操作记录,就是用户在上述回放操作的操作过程中对该分表进行数据操作的数据操作记录。从而,可再次根据第二子文件中保存的包含该分表的表标识的数据操作记录对如表6所示的替换表再次进行回放操作。
类似的,再次进行回放操作的过程中可能又会有用户对该分表进行操作,因此,可针对上一次进行的回放操作重新确定第三位置和第四位置,基于重新确定的第三位置和第四位置重新确定第二子文件,并基于重新确定的第二子文件中保存的数据操作记录对替换表再次进行回放操作。这样,替换表中的数据与该分表中的数据就会越来越接近,当确定的第二子文件的大小不大于预设阈值(如1000字节)时,则可锁死该分表,即,暂时禁止用户对该分表进行操作,并基于确定的第二子文件中保存的数据操作记录对替换表进行最后一次回放操作,最后一次回放操作结束后得到的替换表就与当前锁死的该分表中的数据完全一致,从而可使用得到的替换表替换该分表。
图3为本申请实施例提供的表结构的详细变更过程,具体包括以下步骤:
S301:根据待增加字段的分表表结构,创建替换表,并在替换表中增加待增加字段。
S302:锁死该分表,确定日志文件中保存的最后一个数据操作记录所在的存储位置,作为第一位置,并解锁该分表。
S303:将该分表中的数据导入到替换表中。
S304:确定日志文件中保存的最后一个数据操作记录所在的存储位置,作为第二位置,在日志文件中确定从第一位置到第二位置对应的第一子文件,从第一子文件中提取包含该分表的表标识的数据操作记录。
S305:根据从第一子文件中提取的数据操作记录,对导入数据后的替换表进行回放操作。
S306:确定上一次回放操作的操作过程开始前,日志文件中保存的最后一个数据操作记录所在的存储位置,作为第三位置,确定上一次回放操作的操作过程结束后,日志文件中保存的最后一个数据操作记录所在的存储位置,作为第四位置。
S307:在日志文件中确定从第三位置到第四位置对应的第二子文件,并从第二子文件中提取包含该分表的表标识的操作记录。
S308:判断第二子文件的大小是否不大于预设阈值,若是,执行步骤S309,否则执行步骤S311。
S309:锁死该分表,根据从该第二子文件中提取的数据操作记录,对经过回放操作后的替换表重新进行回放操作。
S310:使用回放操作后的替换表替换该分表。
S311:根据从该第二子文件中提取的数据操作记录,对经过回放操作后的替换表重新进行回放操作,并返回步骤S306。
以上为本申请实施例提供的表结构的变更方法,基于同样的思路,本申请实施例还提供一种表结构的变更装置,如图4所示。
图4为本申请实施例提供的表结构的变更装置结构示意图,具体包括:
创建模块401,用于根据待增加字段的分表表结构,创建替换表,并在所述替换表中增加待增加字段;
导入模块402,用于将所述分表中的数据导入到所述替换表中;
回放模块403,用于根据日志文件中保存的数据操作记录,对导入数据后的替换表中的数据进行回放操作;
替换模块404,用于使用回放操作后的替换表替换所述分表。
所述日志文件包括binlog日志。
所述回放模块403具体用于,确定在将所述分表中的数据导入到所述替换表的导入过程中,保存在所述日志文件中的用户对所述分表的数据操作记录,根据确定的所述数据操作记录,对导入数据后的替换表中的数据进行回放操作。
所述日志文件中保存的各数据操作记录是按各数据操作记录生成的先后顺序依次存储在所述日志文件中的;
所述回放模块403具体用于,在所述导入过程开始前,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第一位置;在所述导入过程结束后,确定所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第二存储位置;在所述日志文件中确定从所述第一位置到所述第二位置对应的第一子文件;根据所述分表的表标识,从所述第一子文件中提取包含所述分表的表标识的数据操作记录,作为确定的在所述导入过程中保存在所述日志文件中的用户对所述分表的数据操作记录。
所述装置还包括:
锁控制模块405,用于在所述回放模块403确定所述导入过程开始时所述日志文件中保存的最后一个数据操作记录所在的存储位置之前,锁死所述分表;在所述回放模块403确定所述导入过程开始时所述日志文件中保存的最后一个数据操作记录所在的存储位置之后,解锁所述分表。
所述回放模块403具体用于,将确定的所述数据操作记录转换为执行语句,并对导入数据后的替换表执行所述执行语句。
所述日志文件中保存的各数据操作记录是按各数据操作记录生成的先后顺序依次存储在所述日志文件中的;
所述装置还包括:
确定模块406,用于在所述替换模块404使用回放操作后的替换表替换所述分表之前,确定在所述回放操作的操作过程开始前,所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第三位置;确定在所述回放操作的操作过程结束后,所述日志文件中保存的最后一个数据操作记录所在的存储位置,作为第四位置;在所述日志文件中确定从所述第三位置到所述第四位置对应的第二子文件,并从所述第二子文件中提取包含所述分表的表标识的数据操作记录;
判断模块407,用于判断所述第二子文件的大小是否不大于预设阈值;
锁控制模块405,用于在所述判断模块407的判断结果为是时,锁死所述分表;
所述回放模块403还用于,在所述判断模块407的判断结果为是时,根据从所述第二子文件中提取的数据操作记录,对经过所述回放操作后的替换表重新进行回放操作;在所述判断模块407的判断结果为否时,根据从所述第二子文件中提取的数据操作记录,对经过所述回放操作后的替换表重新进行回放操作,并指示所述确定模块406针对上一次进行回放操作的操作过程重新确定第二子文件,直至确定的第二子文件的大小不大于预设阈值为止。
具体的上述如图4所示的表结构的变更装置可以位于MySQL的数据库服务器中。
本申请实施例提供一种表结构的变更方法及装置,该方法创建与待增加字段的分表的表结构相同的替换表,并在替换表中增加待增加字段,将该分表中的数据导入到替换表中,根据保存在日志文件中的数据操作记录,对导入数据 后的替换表中的数据进行回放,使用回放后的替换表替换该分表。上述方法并不要求待增加字段的分表中的数据具有数据主键,因此可适用于分表数据不具有数据主键的场景,提高了在线变更表结构的适用性,而且,上述方法也无需同时对分表和替换表执行同一个数据操作,因此可有效提高数据库响应用户的数据操作指令的速度。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

一种表结构的变更方法及装置.pdf_第1页
第1页 / 共19页
一种表结构的变更方法及装置.pdf_第2页
第2页 / 共19页
一种表结构的变更方法及装置.pdf_第3页
第3页 / 共19页
点击查看更多>>
资源描述

《一种表结构的变更方法及装置.pdf》由会员分享,可在线阅读,更多相关《一种表结构的变更方法及装置.pdf(19页珍藏版)》请在专利查询网上搜索。

本申请公开了一种表结构的变更方法及装置,用以解决现有技术中增加字段的方法的适用性较低,对数据操作指令的响应速度较低的问题。该方法创建与待增加字段的分表表结构相同的替换表,并在替换表中增加待增加字段,将该分表中的数据导入到替换表中,根据保存在日志文件中的数据操作记录,对导入数据后的替换表中的数据进行回放,使用回放后的替换表替换该分表。上述方法并不要求待增加字段的分表中的数据具有数据主键,因此可适用于。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1