基于binlog恢复工具mysqlbinlog_flashback
简介

mysqlbinlog_back.py 是在线读取row格式的mysqld的binlog,然后生成反向的sql语句的工具。
一般用于数据恢复的目的。 所谓反向的sql语句就是如果是insert,则反向的sql为delete。
如果delete,反向的sql是insert,如果是update, 反向的sql还是update,但是update的值是原来的值。
这个项目需要安装

yum update nss     或者yum update openssl

yum install python-pip(how to do it?
pip install pymysql

官方地址
https://github.com/58daojia-dba/mysqlbinlog_flashback

使用限制
1.支持mysql版本为MySQL 5.5 and 5.6.因为底层使用的是python-mysql-replication包。

2.数据库必须是row格式的。

3.反向生成的表必须有主键。

4.日志必须在主库存在

5.反向生成的mysql数据类型列出在下面。没有列出的类型没有经过严格的测试,也许有问题

6.支持的类型

允许解析的字段类型,不在里面的会报错
ALLOW_TYPE={ "varchar":True, "char":True, "datetime":True, "date":True, "time":True, "timestamp":True, "bigint":True, "mediumint":True, "smallint":True, "tinyint":True, "int":True, "smallint":True, "decimal":True, "float":True, "double":True, "longtext":True, "tinytext":True, "text":True, "mediumtext":True }

使用:
环境: 5.5.24 
database:scheduler
table:user

表结构:
mysql> show create table user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户唯一标志符 UID',
  `username` varchar(64) DEFAULT NULL COMMENT '用户名,不区分大小写',
  `email` varchar(128) DEFAULT NULL COMMENT '注册邮箱,不区分大小写',
  `cell_phone` bigint(11) DEFAULT NULL COMMENT '手机号码',
  `password` char(32) NOT NULL COMMENT '密码hash值',
  `school_code` bigint(20) unsigned DEFAULT NULL COMMENT '学校代码',
  `register_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '注册时间',
  `usertype` int(5) NOT NULL DEFAULT '1' COMMENT '1为微信关注用户,2为微信登录app的用户,3为APP端微信登录的微信用户',
  `state` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1<0: UID是否有效 1<1: 是否设置用户名密码 1<2: 是否认证邮箱 1<3: 是否认证手机号码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

今天客服反馈有个用户使用手机号登陆不了,查看是由于程序BUG导致在用户登陆表里面的手机号是错误的值,
拿到用户真实的手机号之后,我们的初级DBA小明上线手一滑执行了

mysql> update user set cell_phone=15811111111;
Query OK, 10000 rows affected (0.08 sec)
Rows matched: 10000  Changed: 10000  Warnings: 0

当发现的时候已经来不及了,数据瞬间就被更改了
mysql> select * from user  limit 10;
+-----+----------+-------+-------------+----------------------------------+-------------+---------------------+----------+-------+
| id  | username | email | cell_phone  | password                         | school_code | register_time       | usertype | state |
+-----+----------+-------+-------------+----------------------------------+-------------+---------------------+----------+-------+
|   1 | NULL     | NULL  | 15811111111 | bc41014a6785b133a3c4fe29c1fc181e |           1 | 2014-02-26 18:09:44 |        3 |     1 |
| 664 | NULL     | NULL  | 15811111111 | 2b7dc70e9ef4aec3b36d9ed01f6c3917 |           1 | 2014-02-26 23:08:14 |        3 |     1 |
| 666 | NULL     | NULL  | 15811111111 | 19c0f7f7008765f55cfd64af4b7b7009 |           1 | 2014-02-26 23:08:15 |        3 |     1 |
| 670 | NULL     | NULL  | 15811111111 | 86b28ea44b6e4bc0b7d5c5010d288f1c |           1 | 2014-02-26 23:08:17 |        3 |     1 |
| 681 | NULL     | NULL  | 15811111111 | db79ffb99fafbf059d525c93e7c1e38c |           1 | 2014-02-26 23:08:26 |        1 |     1 |
| 682 | NULL     | NULL  | 15811111111 | aa237deac77a9b5c652e14b888aefccf |           1 | 2014-02-26 23:08:28 |        1 |     1 |
| 685 | NULL     | NULL  | 15811111111 | dae5acb6bd5de68011dd55f1b4d31303 |           1 | 2014-02-26 23:08:29 |        1 |     1 |
| 687 | NULL     | NULL  | 15811111111 | 05319ba2ec8767c80e68408eaeccd773 |           1 | 2014-02-26 23:08:31 |        1 |     1 |
| 689 | NULL     | NULL  | 15811111111 | 1dfda975919441990949918ceb25d7b6 |           1 | 2014-02-26 23:08:32 |        1 |     1 |
| 695 | NULL     | NULL  | 15811111111 | 8f13c73164f32794a2efb6f5b43194e8 |           1 | 2014-02-26 23:08:36 |        1 |     1 |
+-----+----------+-------+-------------+----------------------------------+-------------+---------------------+----------+-------+

这个时候记得赶紧加一个全局读锁,防止有新的写入发生 flush tables with read lock;

使用mysqlbinlog_back.py工具进行回滚
python mysqlbinlog_back.py --help 查看下参数使用说明

mysqlbinlog  -v -v --base64-output=decode-rows mysql-bin.000006 >6.sql、
 
# at 700692
#170221 15:26:27 server id 1003306  end_log_pos 700765  Query   thread_id=83    exec_time=0     error_code=0
SET TIMESTAMP=1487661987/*!*/;
BEGIN

### UPDATE scheduler.user
### WHERE
###   @1=1 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2=NULL /* LONGINT meta=192 nullable=1 is_null=1 */
###   @3=NULL /* LONGINT meta=384 nullable=1 is_null=1 */
###   @4=13930226699 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @5='bc41014a6785b133a3c4fe29c1fc181e' /* STRING(96) meta=65120 nullable=0 is_null=0 */
###   @6=1 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @7=1393409384 /* TIMESTAMP meta=0 nullable=0 is_null=0 */
###   @8=3 /* INT meta=0 nullable=0 is_null=0 */
###   @9=1 /* TINYINT meta=0 nullable=0 is_null=0 */
### SET
###   @1=1 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2=NULL /* LONGINT meta=192 nullable=1 is_null=1 */
###   @3=NULL /* LONGINT meta=384 nullable=1 is_null=1 */
###   @4=15811111111 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @5='bc41014a6785b133a3c4fe29c1fc181e' /* STRING(96) meta=65120 nullable=0 is_null=0 */
###   @6=1 /* LONGINT meta=0 nullable=1 is_null=0 */
###   @7=1393409384 /* TIMESTAMP meta=0 nullable=0 is_null=0 */
###   @8=3 /* INT meta=0 nullable=0 is_null=0 */
###   @9=1 /* TINYINT meta=0 nullable=0 is_null=0 */

在binlog里面找到刚刚的update数据,开始进行回滚
python mysqlbinlog_back.py --host="127.0.0.1" --port=3306 --username="root" --password="wangxin@sl" --schema=scheduler --tables="user" -S "mysql-bin.000006"  -L "700692"

在log目录下生产反向sql文件flashback_scheduler_20170221_154300.sql
#end_log_pos 701812  2017-02-21T15:26:27 1487661987 mysql-bin.000006;
update `user` set`username`=null,`cell_phone`=13930226699,`register_time`='2014-02-26 18:09:44',`school_code`=1,`email`=null,`usertype`=3,`state`=1,`password`='bc41014a6785b133a3c4fe29c1fc181e',`id`=1 where `id`=1;
update `user` set`username`=null,`cell_phone`=18818272661,`register_time`='2014-02-26 23:08:14',`school_code`=1,`email`=null,`usertype`=3,`state`=1,`password`='2b7dc70e9ef4aec3b36d9ed01f6c3917',`id`=664 where `id`=664;
update `user` set`username`=null,`cell_phone`=15821823213,`register_time`='2014-02-26 23:08:15',`school_code`=1,`email`=null,`usertype`=3,`state`=1,`password`='19c0f7f7008765f55cfd64af4b7b7009',`id`=666 where `id`=666;
update `user` set`username`=null,`cell_phone`=18817817795,`register_time`='2014-02-26 23:08:17',`school_code`=1,`email`=null,`usertype`=3,`state`=1,`password`='86b28ea44b6e4bc0b7d5c5010d288f1c',`id`=670 where `id`=670;
update `user` set`username`=null,`cell_phone`=13482311832,`register_time`='2014-02-26 23:08:26',`school_code`=1,`email`=null,`usertype`=1,`state`=1,`password`='db79ffb99fafbf059d525c93e7c1e38c',`id`=681 where `id`=681;
update `user` set`username`=null,`cell_phone`=15026616052,`register_time`='2014-02-26 23:08:28',`school_code`=1,`email`=null,`usertype`=1,`state`=1,`password`='aa237deac77a9b5c652e14b888aefccf',`id`=682 where `id`=682;
update `user` set`username`=null,`cell_phone`=15121110056,`register_time`='2014-02-26 23:08:29',`school_code`=1,`email`=null,`usertype`=1,`state`=1,`password`='dae5acb6bd5de68011dd55f1b4d31303',`id`=685 where `id`=685;

将数据导入mysql恢复
mysql -uroot -p scheduler <flashback_scheduler_20170221_154300.sql

最后验证下数据,释放全局表锁

心得:这个回滚工具在误操作急救的时候比较好用,相对于使用全备加binlog恢复的方式更加便捷有效
---------------------
作者:隔壁master王
来源:CSDN
原文:https://blog.csdn.net/jerry____wang/article/details/56285859
版权声明:本文为博主原创文章,转载请附上博文链接!

基于binlog恢复工具mysqlbinlog_flashback的更多相关文章

  1. (4.11)mysql备份还原——mysql闪回技术(基于binlog)

    0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...

  2. MySQL数据库备份还原(基于binlog的增量备份)

    MySQL数据库备份还原(基于binlog的增量备份) 一.简介 1.增量备份      增量备份 是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味 ...

  3. 基于binlog来分析mysql的行记录修改情况(python脚本分析)

          最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎 ...

  4. MySQL基于binlog主从复制

    MySQL复制介绍 默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库 ,也可以是一个数据库里的指定 ...

  5. 基于binlog的增量备份

    1.1 增量备份简介 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件:第二次增 ...

  6. Mysql 数据恢复流程 基于binlog redolog undolog

    注:文中有个易混淆的地方 sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态. 日志持久化事务,为了保证redolog和 ...

  7. mysql5.6 基于Binlog ROW记录方式进行数据恢复(无备份)

    数据库配置注意事项 /etc/my.cnf 必须要开户binlog支持,字符集要求 是utf8 binlog类型为row server-id=121 log_bin=/home/mysqllog bi ...

  8. mysql基于binlog回滚工具_flashback(python版本)

        update.delete的条件写错甚至没有写,导致数据操作错误,需要恢复被误操作的行记录.这种情形,其实时有发生,可以选择用备份文件+binlog来恢复到测试环境,然后再做数据修复,但是这样 ...

  9. MySQL系列:基于binlog的增量订阅与消费(一)

    在一些业务场景中,像在数据分析中我们有时候需要捕获数据变化(CDC):在数据审计中,我们也往往需要知道数据从这个点到另一个点的变化:同样在实时分析中,我们有时候需要看到某个值得实时变化等. 要解决以上 ...

随机推荐

  1. 【java】Java组件概览(1)

    如上图所示,Oracle的Java SE8有两个产品:JDK和JRE.其中,JRE的内容包括图中①~⑤,它是JDK的子集. ⑥中的红色部分与JRE有重合. [参考] 1.https://docs.or ...

  2. SonarLint 代码质量管理

    Below are the instructions of how to install and use SonarLint. Install SonarLint Extensions in VS20 ...

  3. 如何解决 kubernetes 重启后,启来不来的问题

    参考了 https://blog.csdn.net/nklinsirui/article/details/80855415 最近在调研 kubeneter ,准备把线上的服务器架构再调整下,然后模拟各 ...

  4. 001 python基础实战

    报名了阿里大学的AI,一直没有学习,今天开始正式学习. 今天是第一节,Python的基础编程实战,里面包含两个示例. 一:任务实现文件的批量重命名. 1.创建一个目录 2.程序 #!/usr/bin/ ...

  5. 权限管理——shiro

    1.shiro整合spring a.导入依赖 <properties> <shiro.version>1.2.4</shiro.version> </prop ...

  6. 网络编程-Python高级语法-GIL全局解释器锁

    知识点:GIL全局解释器锁其实和Python没有任何关系,是由于当初编写Python解释器时留下的,它只对多线程有影响,GIL保证同一时刻只有一个线程在运行,即使是多核配置电脑,同一时刻也只会让一个线 ...

  7. Selector-背景选择器

    Selector-背景选择器 1.主要属性 <?xml version="1.0" encoding="utf-8"?> <selector ...

  8. windows安装nexus3

    1.下载nexus3 https://www.sonatype.com/download-oss-sonatype 2.解压文件D:\javatool\ 3.在path中配置环境变量 D:\javat ...

  9. SVN-您的主机中的软件中止了一个已建立的连接

    关于这个问题,网络上有各种解决的办法,关闭防火墙,HTTP/HTTPS切换,改端口... ...但我都试了没有用.本来一直用的好好的,突然就出现了这个问题,而且在几分钟前都是正常的.下面来说说我都干了 ...

  10. mysql完整性约束

    第一:完整性约束介绍 为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能写入数据库,以确保数据库中存储的 ...