对于MySQL数据库误删数据的恢复,可以在MySQL中使用类似于闪回的SQL语句或者基于binlog生成反向操作来实现。它是MySQL非常有用的功能。原理不难理解。基于MySQL行格式的binlog记录了SQL的历史增删改查信息,并据此解析出相应的SQL语句(反向SQL语句用于回滚)。在格式为binlog,格式为row的日志方式下,binlog中的内容记录了数据库中已经执行过的增删改信息,都包含反向信息。例如执行deletefromtablewherepk_id=1;根据主键删除一条记录对应的binlog中的sql语句为:deletefromtablewherepk_id=1andname='xxx'andother_column='xxx';where条件不仅是原始语句的Id,还包括对该行所有字段的更新操作,不仅记录了更新操作,还记录了更新前更新记录中各个字段的值。这样,这个日志就可以用来生成反向操作信息了。下面是使用mysqlbinlog工具解析出来的MySQL中一个典型的binlog日志文件的部分内容,可以清楚的看到执行的sql语句的信息。话说回来,对于MySQL中一些基于binlog的应用,比如复制或者数据库恢复,其实是通过重复执行某个数据库历史上执行过的增删改查SQL语句来实现的。题外话:MySQL的binlog记录事务语句的功能,基本相当于SQLServer的事务日志。但是,对于SQLServer的事务日志的二进制内容,微软官方并没有提供解析的方法。在MySQL中,可以通过mysqlbinlog来解析这个日志的内容。下面是MySQL自带的mysqlbinlog工具解析出来的binlog日志文件中的信息,可以在里面看到SQL语句信息。知道了binlog的内容,就可以基于binlog实现各种实用的功能了。典型的例子就是误删数据的恢复操作。比如苏家小洛同学自己用Python来处理这个分析功能。众所周知的类似功能是大众点评DBA写的binlog2sql工具。binlog2sql需要statementpip安装,所以需要安装pippip安装参考:https://www.cnblogs.com/technologylife/p/5870576.htmlbinlog2sql下载安装:https://github.com/danfengcao/binlog2sqlbinlog2sql之后是完成后,可以用它来恢复数据,如下模拟误操作的恢复。在启用binlog且日志格式为row的测试数据下,针对测试表test_01,执行如下sql语句:insertintotest_01values(1,'aaa');insertintotest_01values(2,'bbb');insertintotest_01values(3,'vvv');--下面误操作更新了所有数据updatetest_01setname='xxx';通过showmasterlogs找到当前的binlog文件;sql语句的执行情况保存在当前的binlog中。binlog2sql的目标就是这个文件。参考下图,可以找到执行:pythonbinlog2sql.py-h127.0.0.1-P3306-uroot-p'root'-ddb01-ttest_01–start-file='binlog.000021'(更多参数以及用法,参考下面的链接),使用binlog2sql解析当前的binlog文件,解析出来的SQL语句就是正常的SQL语句的执行(insertinsertinsertupdate(3Linerecord))Execution:pythonbinlog2sql.py-h127.0.0.1-P3306-uroot-p'root'-ddb01-ttest_01–start-file='binlog.000021'-B,通过-B参数生成反向运行信息加上参数-B解析出来的SQL语句正好和上面的SQL语句相反,包括顺序,也就是逆序生成反向操作。原来的操作是insertinsertinsertupdateupdateupdatee.逆向操作是updateupdateupdatedeletedeletedelete。这样就可以根据具体情况拦截生成的反向sql语句,恢复错误的操作。上面的操作注意安装的binlog2sql的路径问题,如果路径No,找不到binlog2sql.py,则无法执行上面的命令。更多binlog2sql参数、使用和限制参考官方GitHub:https://github.com/danfengcao/binlog2sql
