在维护mysql的经验中,很多时候我们需要进行单表恢复,以应对误操作 或者sql注入引起的故障,本人也在实际的工作中遇到若干次开发误操作需要恢复数据的情况。
为了方便的恢复数据,所以写了一个逆向解析binlog的工具,能够方便的进行单表恢复操作。目前仅支持5.5,binlog格式必须为row格式
工具下载地址:,具体的限制以及使用方法请查看README
使用演示:
创建表unit.t1
-
create table t1(c1 int not null primary key,c2 varchar(50),c3 datetime)
插入部分数据:
-
unit> insert into t1 values (1,"xxxx",now());
-
Query OK, 1 row affected (0.00 sec)
-
-
unit> insert into t1 values (2,"a",now());
-
Query OK, 1 row affected (0.00 sec)
-
-
unit> insert into t1 values (3,"b",now());
-
Query OK, 1 row affected (0.00 sec)
-
-
unit> select * from t1;
-
+----+------+---------------------+
-
| c1 | c2 | c3 |
-
+----+------+---------------------+
-
| 1 | xxxx | 2015-06-10 20:33:34 |
-
| 2 | a | 2015-06-10 20:33:40 |
-
| 3 | b | 2015-06-10 20:33:46 |
-
+----+------+---------------------+
-
3 rows in set (0.00 sec)
这时候我们模拟一个误操作,删除所有的数据:
-
unit> delete from t1;
-
Query OK, 3 rows affected (0.00 sec)
查看binlog:
可以看到我们的insert操作和delete操作,在时间2015-06-10 20:35:52 我们做了delete误操作。现在我们要恢复到这个时间点
-
[root@centos mysql_6302_binlog]# python binlogback.py -f ./mysql-bin.000022 -B unit -m desc -t t1 -c "c1,c2,c3" --begin-datetime="2015-06-10 20:35:52"
-
#pos:5342
-
BEGIN;
-
insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 3, 'b', '2015-06-10 20:33:46');
-
insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 2, 'a', '2015-06-10 20:33:40');
-
insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 1, 'xxxx', '2015-06-10 20:33:34');
-
COMMIT
可以看到工具把delete语句按照反序转换成了insert语句,把生成的语句执行:
-
unit> BEGIN;
-
Query OK, 0 rows affected (0.00 sec)
-
-
unit> insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 3, 'b', '2015-06-10 20:33:46');
-
Query OK, 1 row affected (0.00 sec)
-
-
unit> insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 2, 'a', '2015-06-10 20:33:40');
-
Query OK, 1 row affected (0.00 sec)
-
-
unit> insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 1, 'xxxx', '2015-06-10 20:33:34');
-
Query OK, 1 row affected (0.00 sec)
-
-
unit> COMMIT;
-
Query OK, 0 rows affected (0.00 sec)
-
-
unit> select * from t1;
-
+----+------+---------------------+
-
| c1 | c2 | c3 |
-
+----+------+---------------------+
-
| 1 | xxxx | 2015-06-10 20:33:34 |
-
| 2 | a | 2015-06-10 20:33:40 |
-
| 3 | b | 2015-06-10 20:33:46 |
-
+----+------+---------------------+
-
3 rows in set (0.00 sec)
可以看到表t1已经恢复到了我们删除前的状态。
工具限制:
1、要恢复的表必须有主键,不然恢复可能会引起严重的数据错误
2、目前仅支持mysql5.5,以及5.5的衍生版本,只要binlog协议没有发生改变,原理上都适用
3、只支持row格式的binlog
4、time类型解析有问题,如果time类型的值小于“00:00:00”那么会解析出错误的值
5、因为工作时间问题,暂时没有支持设置binlog position来恢复数据,后续会支持
优点:
1、方便快捷,单表恢复
2、修复了5.5的mysqlbinlog工具的一些BUG
3、使用python,没有依赖,下载即可使用
该工具是博主最近研究binlog协议生产出来的一个小工具,欢迎大家试用,多提BUG,多多交流。代码没有经过
严格的构思,请勿吐槽代码水平
。
阅读(5142) | 评论(2) | 转发(0) |