MySql 数据误删除恢复

在开发中,可能会遇到误删除数据库的问题,对于MySQL数据库来说,可以使用基于 binlog 的方式生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能。

在格式为 binlog 格式的日志模式下,不仅记录了数据库中曾经执行的增删改信息,而且包含了反向信息。比如当执行 delete from table where id = 1; 时,将会生成:

delete from table where pk_id = 1 and colum1 = 'value1' and other_columns = 'xx' where conditions

它不仅包括原始语句的Id,而且还包括中这一行所有的字段的信息。update操作也是同样的道理,执行 update 操作时,同样也会记录在更新之前的每一个字段的值。这样就可以利用这个日志来生成反向操作信息。

下图就是通过 MySql 自带的 mysqlbinlog 工具解析出来的 binlog 日志文件中的信息,可以看到其中的SQL语句信息。

图片描述

知道了 binlog 中的内容,就可以基于这个 binlog 来实现各种实用的功能,典型的就是误删数据的还原操作,
关于解析 binglop 的工具,比较知名的有大众点评网 DBA 写的 binlog2sql 工具。
binlog2sql需要语句pip安装,所以需要先安装pip
pip 安装参考:https://www.cnblogs.com/technologylife/p/5870576.html

binlog2sql下载以及安装:https://github.com/danfengcao/binlog2sql

图片描述

完成 binlog2sql 的安装之后,就可以使用它来实现数据的还原操作了,接下来我们将模拟一个误操作的恢复。

首先,自然是要开启 MySql 的 binlog,且日志格式为 row ;其次,建立测试表 test_binlog,并执行以下sql语句:

insert into test_binlog values (1,'aaa');
insert into test_binlog values (2,'bbb');
insert into test_binlog values (3,'vvv');
--以下误操作,更新了全部数据
update test_binlog set name = 'xxx';

通过 show master logs; 找到当前的 binlog 文件:

图片描述

接下来执行:

python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p’root’ -ddb01 -t test_01 –start-file=’binlog.000021′ 

通过 binlog2sql 来解析产生的 binlog 文件,解析出来的就是正常的 SQL 语句。
执行:

python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p’root’ -ddb01 -t test_01 –start-file=’binlog.000021′ -B

通过 -B 参数将生成反向 SQL。它生成的 SQL 语句的顺序和正常的 SQL 语句刚好相反,这样就可以用于误删数据的恢复。

更多 binlog2sql 使用方法请参考: 官方GitHub