首页> 中国专利> 一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备、和可读存储介质

一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备、和可读存储介质

摘要

本发明公开了一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备和可读存储介质,所述的方法包括:接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求;对于允许的变更,初始化相关连接,并记录当前binlog的位置;在主库创建一张跟原表一结构相同的表二,对表二进行变更操作,变更操作完成,将数据复制到表二中;将主库中的表一锁定,并将表一的名称更改为其他名称,将表二的名称更改为表一名称;删除表一。

著录项

  • 公开/公告号CN113051265A

    专利类型发明专利

  • 公开/公告日2021-06-29

    原文格式PDF

  • 申请/专利权人 中信百信银行股份有限公司;

    申请/专利号CN201911371813.0

  • 发明设计人 徐瑞;

    申请日2019-12-27

  • 分类号G06F16/22(20190101);G06F16/23(20190101);G06F16/28(20190101);

  • 代理机构11354 北京市兰台律师事务所;

  • 代理人张峰

  • 地址 100029 北京市朝阳区安定路5号院3号楼8层

  • 入库时间 2023-06-19 11:39:06

说明书

技术领域

本发明涉及数据库技术领域,特别涉及一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备和可读存储介质。

背景技术

随着业务的发展,技术的不断更新,早期的系统需要做大量的变更,对于底层的数据库系统要求非常高。目前为止,企业常用的关系型数据库包括MySQL、Oracle、SqlServer等,由于MySQL开源、免费,得到广泛使用。而这些关系型数据库最常用的就是主-从架构,所谓的主-从架构是指同样的数据在主库和备库都有相同的备份。在公司发展初期,系统设计简单,数据量基数较小,基于MySQL的存储完全能够满足要求。后期随着业务发展,数据量持续增长,任何业务系统的变更都会涉及对表结构的操作,越来越影响性能,在并发量大的情况下,一条DDL(DDL,Data Definition Language数据库模式定义语言)有可能导致整个线上系统夯住,损失巨大。

基于此,MySQL官方从5.6版本起推出了online ddl,Percona公司推出了pt-online-schema-change等工具,这些工具的出现,很好的弥补了表结构变更锁表的情况,但是对于系统性能损耗较大,无法真正无感知的解决表结构变更对系统的影响。

急切需要一种方法来降低由于表结构变更所带来的损耗的问题,本方案就是基于此提出的。

发明内容

针对现有的表结构变更的技术,由于均是基于触发器实现的,在业务高峰期,触发器消耗大量cpu,有可能导致系统夯住。线上业务系统,尤其是核心区的生产环境系统,禁止创建触发器,因为触发器会降低系统性能,在大并发量的业务场景下,触发器会消耗大量CPU资源,CPU被过多占用,会对线上业务造成影响,严重情况下,能导致整个系统不可用,无法对外提供服务。金融行业无法承受造成的巨大影响,因此金融行业无法使用现有的表结构变更技术。

另外,现有技术在业务高峰期,有可能产生死锁,造成数据不一致。现有的表结构变更工具,在业务高峰期会产生死锁,因为对表数据的拷贝是通过replace into的方式实现的,在业务高峰期,会有大量的dml操作,原表上的数据库在拷贝到新表上时,由于insert和update会对同一行数据进行操作,在大并发量的情况下,会产生死锁,为了释放死锁,数据库系统会把事务权重较小的事务进行rollback,从而导致新表和旧表的数据不一致,这种问题对于强一致性要求高的金融行业是无法接受的。

有鉴于现有技术存在的诸多缺陷,本发明公开了一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备和可读存储介质。

本发明所公开的降低关系型数据库表结构变更所带来损耗的方法包括:

接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求;

对于允许的变更,初始化相关连接,并记录当前binlog的位置;

在主库创建一张跟原表一结构相同的表二,对表二进行变更操作,变更操作完成,将数据复制到表二中;

将主库中的表一锁定,并将表一的名称更改为其他名称,将表二的名称更改为表一名称;

删除表一。

本发明所公开的降低关系型数据库表结构变更所带来损耗的装置包括:

变更请求接收模块,用于接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求;

初始化模块,用于对于允许的变更,初始化相关连接,并记录当前binlog的位置;

变更执行模块,用于在主库创建一张跟原表一结构相同的表二,对表二进行变更操作,变更操作完成,将数据复制到表二中;

更新模块,用于将主库中的表一锁定,并将表一的名称更改为其他名称,将表二的名称更改为表一名称;同时删除表一。

本发明所公开的降低关系型数据库表结构变更所带来损耗的计算机设备包括包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述的处理器执行所述计算机程序时实现上述任一项方法的步骤。

本发明所公开的降低关系型数据库表结构变更所带来损耗的计算机存储介质,其上存储有计算机程序,所述的计算机程序被处理器执行时实现上述任一项方法的步骤。

上述所公开的降低关系型数据库表结构变更所带来损耗的技术方案,能最大化的降低因为数据库表机构变更对系统带来的影响,降低了死锁或者宕机的风险。

附图说明

图1是本发明所公开的降低关系型数据库表结构变更所带来损耗的方法流程图;

图2是本发明所公开的降低关系型数据库表结构变更所带来损耗的装置模块图;

图3是本发明所公开的程序连接到从库的示意图;

图4是本发明所公开的程序连接到主库的示意图;

具体实施方式

为了对本发明所公开的降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备和可读存储介质有更加详细和深入的了解,在下面的内容中结合附图对具体的实施方式、所解决的具体技术问题和所取得的技术效果进行详细的说明。在不冲突的情况下,本发明的实施例以及实施例中的技术特征可以相互组合。

首先对本发明所公开的方案的原理进行说明:

当有程序需要连接到数据库对数据库进行变更,不管是连接到主库还是备库,数据库先核实该程序是否有权限进行变更,当确认没有变更的权限,直接结束该程序;当确认有变更权限时,预估该变更所需要的资源需求,当系统的资源能满足资源需求时,继续进行该变更流程。系统初始化该程序与数据库的连接,监听当前binlog,并记录变更前的binlog位置。然后,在主库上创建一个新的表,新创建的这个表的表结构跟主库中的原始表的表结构一致。在新创建的这个表中执行变更操作,变更操作执行完毕,将主库中原始表中的数据复制到新创建的表中。对于在主库中原始表中发生了变更的数据,会更新到新的binlog中,因为主库跟备库的对应关系,备库中的binlog也相应的发生了更新,通过解析备库中的binlog,将变更部分的数据更新到新创建的表中。当变更部分的数据更新到新创建的表中完成后,将主库中的原始表锁定,并将原始表的名称更改为其他名称,将新创建的这个表的名称更改为原始表的名称。在主库上创建所述的新的表的时候也可以再创建另外一个新的表,该另外一个新的表用于在变更出现异常时对变更进行校验。

本发明所公开的降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备和可读存储介质基于上述原理通过对新创建的表进行变更操作,在变更操作未完成前,需要用到相关表的业务通过访问原始表继续进行。通过这样的异步操作,将业务变更带给系统的不利影响降低到最低的程度。

如附图1所示,本发明所公开降低关系型数据库表结构变更所带来损耗的方法包含以下步骤:

101,接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求

102,对于允许的变更,初始化相关连接,并记录当前binlog的位置

103,在主库创建一张跟原表一结构相同的表二,对表二进行变更操作,变更操作完成,将数据复制到表二中

将主库中的表一锁定,并将表一的名称更改为其他名称,将表二的名称更改为表一名称;

删除表一

所述将数据复制到表二中将表一中的原始数据复制到表二中,新变化的数据通过解析备库中的binlog并应用到表二中来完成的。

所述的在主库创建一张跟表一结构相同的表二的同时,创建一张表三,在对表二进行变更操作的同时,将操作信息记录在表三中。

所述记录在表三中的操作信息用于在表二的变更出现异常时对变更进行校验。

所述的接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求,当系统权限和资源配置情况不允许该变更请求时,直接退出。

如附图3所示,本发明所公开降低关系型数据库表结构变更所带来损耗的装置包含以下模块:

变更请求接收模块,用于接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求;

初始化模块,用于对于允许的变更,初始化相关连接,并记录当前binlog的位置;

变更执行模块,用于在主库创建一张跟原表一结构相同的表二,对表二进行变更操作,变更操作完成,将数据复制到表二中;

更新模块,用于将主库中的表一锁定,并将表一的名称更改为其他名称,将表二的名称更改为表一名称;同时删除表一。

所述将数据复制到表二中将表一中的原始数据复制到表二中,新变化的数据通过解析备库中的binlog应用到表二中来完成的。

所述的变更执行模块在主库创建一张跟表一结构相同的表二的同时,创建一张跟表三,在对表二进行变更操作的同时,将操作信息记录在表三中,所述记录在表三中的操作信息用于在表二的变更出现异常时对变更进行校验。

本发明所公开的降低关系型数据库表结构变更所带来损耗的计算机设备包括包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述的处理器执行所述计算机程序时实现上述任一项方法的步骤。

本发明所公开的降低关系型数据库表结构变更所带来损耗的计算机存储介质,其上存储有计算机程序,所述的计算机程序被处理器执行时实现上述任一项方法的步骤。

以下是本发明的具体实施例:

实施例一:如附图3所示,程序连接到从库上

第一步,接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求

第二步,对于允许的变更,初始化相关连接,并记录当前binlog的位置

第三步,在主库创建一张跟原表一结构相同的表二,对表二进行变更操作,变更操作完成,将数据复制到表二

第四步,将主库中的表一锁定,并将表一的名称更改为其他名称,将表二的名称更改为表一名称;

第五步,删除表一

上述的步骤通过运行下面的命令实现,在下面的命令信息中附上各个命令的说明:

运行命令--host=ip地址--port=端口号--user=用户名--password=密码--database=库名--table=表名--alter="执行的ddl语句"后面是执行时添加的参数

2019/11/17 18:39:07 binlogsyncer.go:79:[info]create BinlogSyncer withconfig{99999mysql false false}

创建数据库连接,连接到对应的从库上

2019/11/17 18:39:07binlogsyncer.go:246:[info]begin to sync binlogfrom position(ON.000021,2698308)

获取从库的binlog日志文件,并确定开始同步的binlog文件位置

2019/08/17 18:39:07binlogsyncer.go:139:[info]register slave formaster server

开启一个进程,作为主库上的从节点,注册到主库上

2019/08/17 18:39:07binlogsyncer.go:573:[info]rotate to(ON.000021,2698308)

滚动生成日志文件,持续同步binlog日志文件

# Migrating localhost:3306;inspecting localhost:3306;executing onlocalhost

# Migration started at Sat Aug 17 18:39:06+0800 2019

开始解析binlog日志文件,并把解析的sql语句持续应用到对应的主库的临时表上

Copy:0/2 0.0%;Applied:0;Backlog:0/1000;Time:1s(total),0s(copy);streamer:ON.000021:2700588;State:migrating;ETA:N/A

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:2s(total),1s(copy);streamer:ON.000021:2705274;State:migrating;ETA:due

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:2s(total),1s(copy);streamer:ON.000021:2705274;State:migrating;ETA:due

# Migrating localhost:3306;inspecting localhost:3306;executing onlocalhost

# Migration started at Sat Aug 17 18:39:06+0800 2019

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:3s(total),1s(copy);streamer:ON.000021:2710623;State:migrating;ETA:due

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:3s(total),1s(copy);streamer:ON.000021:2710623;State:migrating;ETA:due

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:4s(total),1s(copy);streamer:ON.000021:2714967;State:migrating;ETA:due

增量数据已经应用到对应的临时表上,数据同步完成

2019/08/17 18:39:11binlogsyncer.go:107:[info]syncer is closing...

连接到从库上的进程开始关闭

2019/08/17 18:39:11binlogsyncer.go:122:[info]syncer is closed

连接到从库上的进程已经关闭成功

# Done

执行结束

实施例二:如附图4所示,程序连接到主库上

第一步,接收变更请求信息,根据系统权限和资源配置情况判断是否允许该变更请求

第二步,对于允许的变更,初始化相关连接,并记录当前binlog的位置

第三步,在主库创建一张跟原表一结构相同的表二,对表二进行变更操作,变更操作完成,将数据复制到表二

第四步,将主库中的表一锁定,并将表一的名称更改为其他名称,将表二的名称更改为表一名称;

第五步,删除表一

上述的步骤通过运行下面的命令实现,在下面的命令信息中附上各个命令的说明:

运行命令--host=ip地址--port=端口号--user=用户名--password=密码--database=库名--table=表名--alter="执行的ddl语句"后面是执行时添加对应的参数

2019/08/17 18:39:07 binlogsyncer.go:79:[info]create BinlogSyncer withconfig{99999 mysql false false}

创建数据库连接,连接到对应的主库上

2019/08/17 18:39:07 binlogsyncer.go:246:[info]begin to sync binlogfrom position(ON.000021,2698308)

获取主库的binlog日志文件,并确定开始同步的binlog文件位置

2019/08/17 18:39:07 binlogsyncer.go:139:[info]register slave formaster server

开启一个进程,作为主库上的从节点,注册到主库上

2019/08/17 18:39:07 binlogsyncer.go:573:[info]rotate to(ON.000021,2698308)

从主库上获取binlog日志文件,滚动生成日志文件,持续同步binlog日志文件

# Migrating localhost:3306;inspectinglocalhost:3306;executing onlocalhost

# Migration started at Sat Aug 17 18:39:06+0800 2019

开始解析binlog日志文件,并把解析的sql语句持续应用到对应的主库的临时表上

Copy:0/2 0.0%;Applied:0;Backlog:0/1000;Time:1s(total),0s(copy);streamer:ON.000021:2700588;State:migrating;ETA:N/A

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:2s(total),1s(copy);streamer:ON.000021:2705274;State:migrating;ETA:due

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:2s(total),1s(copy);streamer:ON.000021:2705274;State:migrating;ETA:due

# Migrating localhost:3306;inspecting localhost:3306;executing onlocalhost

# Migration started at Sat Aug 17 18:39:06+0800 2019

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:3s(total),1s(copy);streamer:ON.000021:2710623;State:migrating;ETA:due

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:3s(total),1s(copy);streamer:ON.000021:2710623;State:migrating;ETA:due

Copy:2/2 100.0%;Applied:0;Backlog:0/1000;Time:4s(total),1s(copy);streamer:ON.000021:2714967;State:migrating;ETA:due

增量数据已经应用到对应的临时表上,数据同步完成

2019/08/17 18:39:11 binlogsyncer.go:107:[info]syncer is closing...

连接到主库上的进程开始关闭

2019/08/17 18:39:11 binlogsyncer.go:122:[info]syncer is closed

连接到主库上的进程已经关闭成功

# Done

通过具体实施方式的说明,应当可对本发明为达成预定目的所采用的技术方案及功效得以更加深入且具体的了解,然而所附图示仅提供参考与说明之用,并非用来对本发明加以限制。同时在不冲突的情况下,实施例和实施例中的特征可以相互组合。

本领域内的技术人员应明白,本发明实施例可提供为方法或计算机程序等产品,因此,本发明可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。

本发明是参照本发明实施例的方法和计算机程序产品的流程图和/或方框图来描述的。应理解为可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的组合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或者其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框和/或多个方框中制定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设别上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供货用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号