mysql哪些支持数据回滚_一种支持MySQL快速回滚数据的方法与流程

本发明涉及数据库

技术领域:

:,尤其涉及一种支持mysql快速回滚数据的方法。

背景技术:

::在mysql数据库的生产运维过程中,误删除数据、误修改数据是经常发生的事情。数据对任何一个项目都是非常重要的财产,如何快速有效的回滚数据已经成为一种考验。一种快速的恢复方法是在系统层面,利用lvm的快照来获取某个时间点的数据。但是快照功能是基于特定的时间点的,不能最大限度的减小可能的数据丢失。更传统的恢复办法是利用备份重新搭建实例,再应用去除错误sql之后的binlog来尽可能的恢复数据。但是此方法费时费力,甚至需要停机维护,并不适合快速回滚数据。技术实现要素:本发明的目的就在于为了解决上述问题而提供一种支持mysql快速回滚数据的方法,通过解析数据库的归档二进制日志文件,反向生成可执行的回滚sql语句,可以实现快速的恢复误操作数据。本发明通过以下技术方案来实现上述目的:一种支持mysql快速回滚数据的方法,包括以下步骤:a.抽取数据库的归档日志,获取需要回滚的数据的event初始值和结束值;在数据库里误操作数据之后,在归档日志文件里会记录下所有的dml操作(即所有的增删改动作)。通过抽取数据库的归档二进制日志(即binlog文件),形成一个可读的数据库操作日志,这里面包含了已执行的误操作数据和sql语句。由此定位到误操作数据的范围,并获得需要回滚的数据的event(理解为一个独立单元的事务)初始值和结束值。event的位置均是由具体的file和position点位来确定的。b.在程序客户端伪装成一个slave,不断的获取数据库的重做数据流;对于数据库的主从架构,主库的数据会不断同步到从库,来达到从库数据一致性。由此可以用程序来实现一个客户端,把自己伪装成一个slave从库,不断的获取主库的binlog文件并解析。在步骤a中获得的event区间内,启动一个循环遍历获取binlog的event信息。若当前处理的event位置大于获取的结束值,则退出循环。通过event初始值和结束值,在循环体内获取到范围内的event数据。c.捕获dml事件,分别将insert/update/delete语句进行重新拼接;首先通过具体的数据库和表名称,来进行第一步过滤误操作的数据。在每一次循环的event事件中,对各种dml操作做不同的处理。把delete型的改写成insert型,insert型的改为delete型,update型的改前的值和改后的值调换。然后把改写后的语句拼接成可执行的sql,这些sql脚本就是对之前误操作的反向操作语句。把拼接好的回滚sql语句写入到一个临时文件,直到最后循环体结束。d.关闭临时文件,读取文件中回滚sql内容并输出;若当前处理的event位置大于获取的结束值,则退出循环,并关闭打开的临时文件。由此文件内已经写入了处理过的回滚sql语句,最后读取文件中回滚sql内容并输出。打印出的回滚sql语句可以直接在数据库的客户端执行,用于恢复范围内的误操作数据。本发明的有益效果在于:本发明的一种支持mysql快速回滚数据的方法,通过本方法直接生成了可执行的回滚sql语句,可以实现快速的恢复误操作数据;恢复过程不需要停机,操作简单方便且快速。附图说明为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要实用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本实施例的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1是pymysqlreplication第三方包获取event原理图。图2是binlogstreamreader实例生成回滚sql循环体流程。具体实施方式为使本发明的目的、技术方案和优点更加清楚,下面将对本发明的技术方案进行详细的描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所得到的所有其它实施方式,都属于本发明所保护的范围。在任一实施例中,如图1-2所示,本发明的一种支持mysql快速回滚数据的方法包括:步骤一,准备基础环境,初始化测试表。在本实例中,mysql数据库的版本是5.7.23,系统环境是centos7,python程序的运行版本是3.6.7。mysql需要打开binlog,并且设置binlog_format为row模式。创建一张测试表t_test,然后对测试表插入一条记录a,再修改这条数据a为b,再删除这条记录b。为便于操作,可以进行一次flushlogs,重新生成一个独立的日志文件。本实例需要把数据恢复到a。步骤二,获取回滚数据的event初始值和结束值。使用原生的mysqlbinlog客户端工具,把新生成的日志文件mysql-bin.000026,解析成可读的sql文本,所有的操作都在一个binlog文件中。在本实例中得到对t_test表的1条inserta,其position位置为113;1条updateatob,其position位置为118;1条deleteb,其position位置为125。本实例需要把数据恢复到a,则定义event初始值为118,结束值为125。步骤三,引入pymysqlreplication第三方包,创建一个binlogstreamreader类的实例。binlogstreamreader是pymysqlreplication包下的一个类。如图1所示,他把自己伪装成一个slave不断的从mysql数据库获取binlog并解析。在类的实例化中,把当前mysql的连接信息,以及在步骤二中获取的event初始值作为参数传进去,得到一个可迭代的binlogstreamreader对象。把实例对象定义为stream。步骤四,对stream对象做遍历获取binlogevent信息。使用for循环对stream对象进行遍历,本实例中循环开始的初始event在mysql-bin.000026文件的118position位置。如图2所示,循环开始对处理的event的log_pos做判断,如果大于125position的位置即退出循环。并获取binlogevent的table值,只过滤关于t_test表的操作。步骤五,捕获范围内误操作的dml语句,拼接成回滚sql。对每一次循环范围内的event做判断,如果属于deleterowsevent则标记为delete,如果属于updaterowsevent则标记为update,如果属于writerowsevent则标记为insert。通过回滚拼接,本实例在125位置得到一条insertb,在118位置得到一条updatebtoa。把得到回滚sql文本写入到临时文件f_tmp对象中。步骤六,读取临时文件中回滚sql内容并执行。读取文件对象f_tmp的内容,验证sql文本,在mysql客户端直接执行。经过重新insert和update的逆操作,t_test表的数据已经恢复到a。最后删除临时文件即可。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本

技术领域:

:的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合,为了避免不必要的重复,本发明对各种可能的组合方式不再另行说明。此外,本发明的各种不同的实施方式之间也可以进行任意组合,只要其不违背本发明的思想,其同样应当视为本发明所公开的内容。当前第1页1&nbsp2&nbsp3&nbsp当前第1页1&nbsp2&nbsp3&nbsp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值