设为首页 收藏本站
查看: 563|回复: 0

[经验分享] MyFlash MySQL闪回工具

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-10-4 07:06:49 | 显示全部楼层 |阅读模式
  安装:
  环境要求:
  1、binlog格式必须为row,且binlog_row_image=full
  2、仅支持5.6与5.7
  3、只能回滚DML(增、删、改)

  • 下载地址:https://github.com/Meituan-Dianping/MyFlash
  安装:
  unzip MyFlash-master.zip
  mv MyFlash-master /usr/local/MyFlash/
  gcc -w  pkg-config --cflags --libs glib-2.0 source/binlogParseGlib.c  -o binary/flashback
  闪回:
  update,情景描述,程序1误将xtr库下面的t2表 12,11 更改后0了,这是一个错误的操作;而后面的程序2将13、14更改0了,这是一个正确的操作,需要闪回程序1的误操作。
  模似上述场景:
  原表:
  mysql> select * from xtr.t2;
  +------+

  |>  +------+
  |   12 |
  |   11 |
  |    4 |
  |    3 |
  |   13 |
  |   14 |
  +------+
  6 rows in set (0.00 sec)
  update操作:

  update xtr.t2 set>
  update xtr.t2 set>
  update xtr.t2 set>
  update xtr.t2 set>  DBA接到开发的报警后:
  1、flush logs;
  需要闪回的动作所在的二进制文件,这个文件必须是稳定的,需要flush logs;
  2、记录当前的binlog文件
  3、解析binlog
  mysqlbinlog -vv bin.000038|less
at 838
  #180326 21:41:59 server>xtr.t2 mapped to number 268                                         #这个position开始进入xtr.t2库
at 882

  #180326 21:41:59 server>  BINLOG '
  twa5WhMLAAAALAAAAHIDAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAXuITTA=
  twa5Wh8LAAAALgAAAKADAAAAAAwBAAAAAAEAAgAB///+CwAAAP4AAAAAV46sjw==
  '/!/;
UPDATE xtr.t2                                                                    #更改的第一条语句
WHERE
@1=11 / INT meta=0 nullable=1 is_null=0 /
SET
@1=0 / INT meta=0 nullable=1 is_null=0 /
at 928

  #180326 21:41:59 server>  COMMIT/!/;
at 959

  #180326 21:42:04 server>  SET @@SESSION.GTID_NEXT= '148e1f5e-befd-11e7-ac58-08002738f0ad:207'/!/;
at 1024

  #180326 21:42:04 server>  SET TIMESTAMP=1522075324/!/;
  BEGIN
  /!/;
at 1095
  #180326 21:42:04 server>xtr.t2 mapped to number 268
at 1139

  #180326 21:42:04 server>  BINLOG '
  vAa5WhMLAAAALAAAAHMEAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAWvZzdY=
  vAa5Wh8LAAAALgAAAKEEAAAAAAwBAAAAAAEAAgAB///+DAAAAP4AAAAALXZjvQ==
  '/!/;
UPDATE xtr.t2                              #更改的第二条语句
WHERE
@1=12 / INT meta=0 nullable=1 is_null=0 /
SET
@1=0 / INT meta=0 nullable=1 is_null=0 /
at 1185

  #180326 21:42:04 server>  COMMIT/!/;
at 1216                                         #两个事务结束的position点位置
  4、./flashback --sqlTypes='UPDATE' --binlogFileNames=/data/mysql/bin.000038  --start-position=838 --stop-position=1216 --outBinlogFileNameBase=update
  反解析UPDATE操作,生成以update开头的文件
  生成的文件名:binlog_output_base.flashback
  5、 mysqlbinlog binlog_output_base.flashback --skip-gtids |mysql -uroot -p'123' -S /tmp/mysql_3306.sock
  导入数据库
  6、查询数据库
  mysql> select * from xtr.t2;
  +------+

  |>  +------+
  |   12 |
  |   11 |
  |    4 |
  |    3 |
  |    0 |
  |    0 |
  +------+
  6 rows in set (0.00 sec)
  闪回完成
  insert 场景闪回
  原表:
  mysql> select * from xtr.t2;
  +------+

  |>  +------+
  |   12 |
  |   11 |
  |    4 |
  |    3 |
  |    0 |
  |    0 |
  +------+
  6 rows in set (0.00 sec)
  插入数据
  mysql> insert into xtr.t2 values(99);
  Query OK, 1 row affected (0.00 sec)
  mysql> insert into xtr.t2 values(88);
  Query OK, 1 row affected (0.00 sec)
  mysql> insert into xtr.t2 values(77);
  Query OK, 1 row affected (0.00 sec)
  mysql> select * from xtr.t2;
  +------+

  |>  +------+
  |   12 |
  |   11 |
  |    4 |
  |    3 |
  |    0 |
  |    0 |
  |   99 |
  |   88 |
  |   77 |
  +------+
  9 rows in set (0.00 sec)

  mysql> delete from xtr.t2 where>  Query OK, 2 rows affected (0.03 sec)
  mysql> select * from xtr.t2;
  +------+

  |>  +------+
  |   12 |
  |   11 |
  |    4 |
  |    3 |
  |   99 |
  |   88 |
  |   77 |
  +------+
  7 rows in set (0.00 sec)
  现在需要闪回insert的操作,id=99,id=99,id=77的全部的闪回
  mysql> show master logs;
  +------------+-----------+
  | Log_name   | File_size |
  +------------+-----------+ |
  | bin.000036 |      1759 |
  | bin.000037 |       749 |
  | bin.000038 |      1771 |
  | bin.000039 |       217 |
  | bin.000040 |      2979 |
  +------------+-----------+
  17 rows in set (0.00 sec)
  mysql> flush logs;
  Query OK, 0 rows affected (0.08 sec)
  ./flashback --binlogFileNames=/data/mysql/bin.000040 --sqlTypes='INSERT' --start-position=1851 --stop-position=2462 --outBinlogFileNameBase=insert
  mysqlbinlog insert.flashback --skip-gtids |mysql -uroot -p'123' -S /tmp/mysql_3306.sock
  mysql> select * from xtr.t2;
  +------+

  |>  +------+
  |   12 |
  |   11 |
  |    4 |
  |    3 |
  +------+
  4 rows in set (0.00 sec)
  insert 闪回完成
  可以用mysqlbinlog查看insert.flashback文件:
DELETE FROM xtr.t2
WHERE
@1=77 / INT meta=0 nullable=1 is_null=0 /
at 207
  #180327 21:20:37 server>xtr.t2 mapped to number 268
at 251

  #180327 21:20:37 server>  BINLOG '
  NVO6WhMLAAAALAAAAPsAAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAUWsybY=
  NVO6WiALAAAAKAAAACMBAAAAAAwBAAAAAAEAAgAB//5YAAAAs8f6Pg==
  '/!/;
DELETE FROM xtr.t2
WHERE
@1=88 / INT meta=0 nullable=1 is_null=0 /
at 291
  #180327 21:20:34 server>xtr.t2 mapped to number 268
at 335

  #180327 21:20:34 server>  BINLOG '
  MlO6WhMLAAAALAAAAE8BAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAf0iAeE=
  MlO6WiALAAAAKAAAAHcBAAAAAAwBAAAAAAEAAgAB//5jAAAAHMBDmQ==
  '/!/;
DELETE FROM xtr.t2
WHERE
@1=99 / INT meta=0 nullable=1 is_null=0 /
  SET @@SESSION.GTID_NEXT= 'AUTOMATIC' / added by mysqlbinlog / /!/;
  DELIMITER ;
End of log file
  /!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE/;
  /!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0/;
  生成还是binlog文件,把二进制文件一行一行的读出来,反向解析了
  安装报错:
  [root@mysql MyFlash]# gcc -w  pkg-config --cflags --libs glib-2.0 source/binlogParseGlib.c  -o binary/flashback
  Package glib-2.0 was not found in the pkg-config search path.
  Perhaps you should add the directory containing `glib-2.0.pc'
  to the PKG_CONFIG_PATH environment variable
  No package 'glib-2.0' found
  解决:
  yum -y install  glib2-devel
  导入报错
  [root@mysql binary]# mysqlbinlog binlog_output_base.flashback |mysql -uroot -p'123' -S /tmp/mysql_3306.sock
  mysql: [Warning] Using a password on the command line interface can be insecure.
  ERROR 1782 (HY000) at line 17: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.
  根据官方建议加入--skip-gtids
  [root@mysql binary]# mysqlbinlog binlog_output_base.flashback --skip-gtids |mysql -uroot -p'123' -S /tmp/mysql_3306.sock
  mysql: [Warning] Using a password on the command line interface can be insecure.
  ERROR 1032 (HY000) at line 36: Can't find record in 't2'    t2是我需要回滚的表
  但加上这个参数还是会报错,但在数据库里查询此时数据已经回滚进去了,第二天在测试就没有这个问题了?
  问题:
  这是因为找错了position点的位置
DSC0000.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-611607-1-1.html 上篇帖子: mysql主从同步完整命令 下篇帖子: mysql性能测试工具之tpcc-mysql 及 mysql 用户管理和权限设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表