1.本技术涉及涉及计算机
技术领域:
:,特别是涉及一种大表变更及清理方法。
背景技术:
::2.和传统企业级开发不同,互联网迭代变更比较频繁,数据库表数据量比较庞大,基本每周甚至每天都有上线、一月一次大的上线是很常见的事,对应着表结构变更和数据清理也是经常发生的,比如给表添加字段、加索引等。当数据量小的情况下,直接修改表结构都很快,然而,在数据量大的场景下,特别是千万级、亿级的大表,如果处理不当,这些操作往往会引发锁表的巨大隐患,特别是在生产环境中,一旦在变更表结构过程中,出现了长时间锁表,会导致用户产生的数据长时间无法正常变更到表中,进而导致服务功能异常,结果将是灾难性的。3.mysql执行表过程为根据原表创建临时表,对原表加排它锁,将变更应用到临时表然后复制数据到临时表,最后释放写锁并rename表。后面衍生出了一种基于触发器的变更方案pt-osc,利用触发器处理变更期间的dml操作,只需在数据拷贝完后才会对表加锁。4.通过加锁的方式实现表结构的变更,虽然能保证数据的一致性,但也有被其它锁阻塞的风险,而且这种方式如果应用的大表,容易造成大的主从时延。而利用触发器机制的pt-osc,虽然能减少加锁的时间,但由于触发器本身的缺陷,对主库的性能影响比较大。技术实现要素:5.本发明提供一种基于binlog的大表变更及清理方法,旨在解决线上大表ddl变更锁表时间长、数据负载高等问题,有效保证业务连续性。6.第一方面,一种基于binlog的大表变更及清理方法,包括以下步骤:7.(1)接收输入参数,所述输入参数包括数据库连接信息、表名、ddl命令和where条件;8.(2)校验所述输入参数;若参数校验不通过,则退出并打印相关日志;若校验通过,则根据ddl命令内容判断具体是在线ddl操作还是数据清理操作;9.(3)创建日志记录表和幽灵表;10.(4)如果步骤(2)中判断为在线ddl操作,则先将在线ddl操作语句应用到幽灵表,然后通过insertinto的方式从原表拷贝数据至幽灵表;如果步骤(2)中判断为数据清理操作,则将where条件拼接到insertinto的语句中,只拷贝符合where条件的数据,同时监听binlog日志批量解析dml事件;11.(5)监测到数据拷贝完成且没有新的binlog事件,进行原表和幽灵表的切换。12.进一步地,步骤(2)中校验所述输入参数,具体包括:对数据库联通性、账号权限和ddl命令语法的检查。13.进一步地,步骤(4)中所述从原表拷贝数据至幽灵表,其中根据输入的所述where条件,控制表数据复制的起点。14.进一步地,步骤(1)中所述输入参数还包括运行时参数,步骤(5)中所述进行原表和幽灵表的切换的过程中,使用socket监听请求,实现根据负载情况动态调整所述运行时参数。15.进一步地,所述运行时参数包括单次拷贝的行数。16.进一步地,步骤(2)中所述打印相关日志,是通过命令行输出报错。17.进一步地,在步骤(4)执行过程中,还定期打印进度日志,通过命令行输出进度信息。18.第二方面,一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述的基于binlog的大表变更及清理方法。19.第三方面,一种计算机可读存储介质,其上存储有计算机程序,处理器执行所述计算机程序时实现上述的基于binlog的大表变更及清理方法。20.本发明至少具有以下有益效果:21.本发明基于mysql内部机制,实现了对线上生产环境数据库大表(千万级记录以上)的快速ddl操作,将原表的变更应用到一个表结构完全相同的新表上,通过复制的方式将原表的数据拷贝至新表,复制数据时可指定where条件,控制表数据复制的起点,因而兼具了数据清理功能,同时监听binlog事件将原表的更新应用到新表,迁移过程中使用socket监听请求,可根据负载情况动态调整运行时参数,保证数据库的稳定性,最后进行原子性的新旧表切换,整个过程安全、可控,对原表排他锁持有时长通常低于3s,对数据库的影响较小。该方案解决了线上大表ddl变更锁表时间长、数据负载高等问题,有效的保证了业务连续性。附图说明22.图1为本发明一个实施例的基本流程示意图。具体实施方式23.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。24.在一个实施例中,如图1所示,一种基于binlog的大表变更方法包括以下步骤:25.(1)接收初始化输入参数,所述输入参数包括数据库连接信息、表名、ddl命令和where条件;如果不涉及数据清理(没有删除需求),则无需输入where条件;另外,还可输入单次拷贝的行数;26.(2)校验输入参数,主要是校验数据库连通性、账号权限、ddl命令语法等;若参数校验不通过,则退出并打印相关日志(通过命令行输出报错);若校验通过,则根据ddl命令内容判断具体是在线ddl操作(alter操作)还是数据清理操作;27.(3)创建日志记录表和幽灵表;28.(4)如果步骤(2)中判断为在线ddl操作,则先将ddl命令应用到幽灵表,通过insertinto的方式从原表(线上大表)拷贝数据至幽灵表,其中可根据输入的所述where条件,控制表数据复制的起点;如果步骤(2)中判断为数据清理操作,则将where条件拼接到insertinto的语句中,只拷贝符合where条件的数据(从而不符合where条件的数据就被清理掉了),同时监听binlog日志批量解析dml事件;期间定期打印进度日志(通过命令行输出进度信息);29.(5)监测到数据拷贝完成且没有新的binlog事件,进行原表和幽灵表的切换。若输入的参数还包括单次拷贝的行数,则进行原表和幽灵表的切换的过程中,还可使用socket监听请求,实现根据负载情况动态调整所述运行时参数。30.本实施例实现的表的切换是原子性切换,通过两个会话的操作来完成,原理是基于mysql内部机制:被locktable阻塞之后,执行rename的优先级高于dml,也即先执行renametable,然后执行dml。假设程序操作的会话是c10和c20,其他业务的dml请求的会话是c1-c9,c11-c19,c21-c29。31.具体内部运行步骤包括:32.1、会话c1..c9:对b表正常执行dml操作。33.2、会话c10:创建_b_del防止提前rename表,导致数据丢失。34.createtable`test`.`_b_del`(35.idintauto_incrementprimarykey36.)engine=innodb37.3、会话c10执行locktablesbwrite,`_b_del`write。38.4、会话c11-c19新进来的dml或者select请求,但是会因为b表上有锁而等待。39.5、会话c20:设置锁等待时间并执行rename40.setsessionlock_wait_timeout:=141.renametable`test`.`b`to`test`.`_b_20190908220120_del`,`test`.`_b_gho`to`test`.`b`42.c20的操作因为c10锁表而等待。43.6、c21-c29对于表b新进来的请求因为locktable和renametable而等待。44.7、会话c10通过sql检查会话c20在执行rename操作并且在等待mdl锁。[0045][0046]8、c10基于步骤7执行droptable`_b_del`,删除命令执行完,b表依然不能写。所有的dml请求都被阻塞。[0047]9、c10执行unlocktables;此时c20的rename命令第一个被执行。而其他会话c1-c9,c11-c19,c21-c29的请求可以操作新的b表。[0048]其中,创建_b_del表是为了防止cut-over提前执行,导致数据丢失,同一个会话先执行writelock之后还是可以drop表的,无论renametable和dml操作谁先执行,被阻塞后renametable总是优先于dml被执行。[0049]本发明实施例实现了对线上生产环境数据库大表(千万级记录以上)的快速ddl操作,将原表的变更应用到一个表结构完全相同的新表上,通过复制的方式将原表的数据拷贝至新表,复制数据时可指定where条件,控制表数据复制的起点,因而兼具了数据清理功能,同时监听binlog事件将原表的更新应用到新表,迁移过程中使用socket监听请求,可根据负载情况动态调整运行时参数,保证数据库的稳定性,最后进行原子性的新旧表切换,整个过程安全、可控,对原表排他锁持有时长通常低于3s,对数据库的影响较小。该方案解决了线上大表ddl变更锁表时间长、数据负载高等问题,有效的保证了业务连续性。[0050]与现有技术相比,本发明实施例的方案更具灵活性、稳定性,既可以用作大表变更,也可以用作数据清理,过程中可以观察数据库监控和日志输出动态调整参数,在实际生产环境使用过程中,对数据库性能影响较小,变更期间cpu上升5%-10%左右,平均锁表时间为1.23s,未对业务造成异常。[0051]应该理解的是,虽然图1的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制。例如,创建日志记录表和幽灵表的步骤可以在校验通过后即执行。[0052]在一个实施例中,还提供了一种计算机设备,该计算机设备可以是服务器。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储大表(尤其是千万级、亿级的大表)。该计算机设备的网络接口用于与外部的终端通过网络连接通信。上述计算机程序被处理器执行时实现上述的基于binlog的大表变更及清理方法的全部或部分流程。[0053]在一个实施例中,还提供了一种计算机可读存储介质,其上存储有计算机程序,处理器执行所述计算机程序时实现上述的基于binlog的大表变更及清理方法的全部或部分流程。[0054]以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。[0055]以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术专利的保护范围应以所附权利要求为准。当前第1页12当前第1页12