• MySQL数据闪回工具——Flashback

    背景

    你愿意,或者不愿意,数据库误删除都有可能会发生。或许有一天,你正悠闲的在工位上看报喝茶,然后你的Leader突然紧急的告诉你:

    大兄弟,开发同学不小心将线上数据库的一张表误删除了,体现你价值的时候来了,不管你用什么办法,尽快给我恢复。

    仿佛一头冷水浇到头上,你心里顾不得咒骂那个可怜的开发同志,这时候你往往得热火朝天的干起来,进行传统的全量+增量恢复操作。  如果数据量大的话这个步骤得好半天,如果运气不好的话,比如某开发误删除了表的一部分,而删除完以后线上还是不断的又写入了很多数据,这种情况的话可能更复杂。老板的电话一个接一个,不断的问好了没有。。。。。。。

    言归正传,下面就介绍一款工具:基于mysqlbinlog的flashback数据闪回工具,专门用于误删除案例的快速修复。

    Flashback

    其实,这个系列的工具原理十分简单。它依赖于ROW模式下的binlog特性,记录了所有DML语句的改变值。 所以,反其道而行,比如:将insert 转化为对应的 delete, 将delete 转化为对应的insert,将update再update回去。 以此来实现误删除的回滚操作。

    听起来很简单,那你自己怎么不写一个呢 ?   呃,很多东西其实听起来都简单,但是做起来真心不容易,我们还是来看看下面两位大神的作品吧:

    项目一:mysqlbinlog_flashback

    项目作者:赖亿@58到家

    github项目地址:https://github.com/58daojia-dba/mysqlbinlog_flashback

    项目介绍:产生在线mysqlbinlog的回滚的sql,现在已经在阿里的rds上,db为utf8字符集的生产环境下使用。其他环境没有在生产环境下使用,请小心。

    项目使用反馈:laiyi@daojia.com


    项目二:binlog2sql 

    项目作者:曹单锋

    github项目地址:https://github.com/danfengcao/binlog2sql

    项目介绍:从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。

    项目反馈:danfengcao.info@gmail.com

    两个软件的使用上都比简单,都是在 https://github.com/noplay/python-mysql-replication 项目基础上进行的二次开发。github上面对应的项目里面都有安装和使用方式,也比较简单。

    这两款工具开发时侧重点不同,所以使用中也需要注意一下:

    • mysqlbinlog_flashback 更便重于阿里云 RDS环境的使用。
    • binlog2sql  便重于通常MySQL的处理。从代码上来看,该项目更简洁一点。

    本人在测试环境中体验后,感觉binlog2sql工具简洁一些,使用方便简单,而且文档可阅读性也更高一些。但是需要以下条件满足才行:

    MySQL server必须设置以下参数

    user需要的最小权限集合


    具体的安装使用参考github地址即可,这里没必要过多讨论,日后如果在生产环境有实践的话,会记录进来。