zoukankan      html  css  js  c++  java
  • MyFlash工具

    MyFlash工具是美团开发的一个开源辅助性工具,主要用来恢复数据(误删删除是每个DBA比较头疼的事情)

    MyFlash的安装和使用

    下载地址:https://github.com/Meituan-Dianping/MyFlash

    1.环境说明:

      1)本机是centos7.x

      2)mysql5.7.26 默认的binlog模式是row 且binlog_row_image=full

      3)只支持DML语句的回滚(insert/delete/update) 

    2.安装

      1)安装依赖包

        >>yum -y  install gcc*  pkg-config glib2 libgnomeui-devel  glib2-devel

      2) 下载并安装Myflash工具

        >>git clone XXXXXXXXXXXXXXXX

           >>cd Myflash   --->gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c  -o binary/flashback  编译安装

    3.使用

        ./flashback --binlogFileName=binlog文件 --start-position= --stop-position=  --databaseNames='' --tableNames=''  --sqlTypes='DELETE|INSERT|UPDATE'

    4.参数说明:

    1.databaseNames    指定需要回滚的数据库名。多个数据库可以用“,”隔开。如果不指定该参数,相当于指定了所有数据库。  2.tableNames?指定需要回滚的表名。多个表可以用“,”隔开。如果不指定该参数,相当于指定了所有表。
    3.start-position?指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚
    4.stop-position?指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚
    5.start-datetime?指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
    6.stop-datetime?指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
     7.sqlTypes?指定需要回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用“,”隔开。
     8.maxSplitSize?一旦指定该参数,对文件进行固定尺寸的分割(单位为M),过滤条件有效,但不进行回滚操作。该参数主要用来将大的binlog文件切割,防止单次应用的binlog尺寸过大,对线上造成压力
    9.binlogFileNames?指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持
    10.outBinlogFileNameBase?指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback
    11.logLevel?仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多
     12.include-gtids?指定需要回滚的gtid,支持gtid的单个和范围两种形式。
    13.exclude-gtids?指定不需要回滚的gtid,用法同include-gtids

    解析文件后会在同名文件夹下生成 binlog_output_base.flashback 文件

    5.恢复:

      mysqlbinlog binlog_output_bash.flashback|mysql -u -p  建议先在测试环境进行恢复,研发进行数据校对,再进行线上恢复

    6.结论

      1.MyFlash生成的结果是原生binlog格式,所以要用mysqlbinlog应用,如果想可视化,用mysqlbinlog再度解析即可

      2.MyFlash是离线解析,速度也很快,非常方面

      3MyFlash能增强恢复精度,能根据操作类型过滤

    7.补充:

      1.经过最新测试 myflash是支持mysql5.7-MGR 架构数据恢复的

      2.针对gtid复制模式,需要在应用回滚日志时加上--skip-gtids可以防止报错,恢复成功

    案例1(测试成功:

    (1)创建数据并修改数据

    ###创建数据
    root@localhost:liulin>desc t;
    +-------+---------+------+-----+---------+----------------+
    | Field | Type    | Null | Key | Default | Extra          |
    +-------+---------+------+-----+---------+----------------+
    | id    | int(11) | NO   | PRI | NULL    | auto_increment |
    | f     | int(11) | YES  |     | NULL    |                |
    +-------+---------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    
    root@localhost:liulin>insert into t values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
    Query OK, 10 rows affected (0.00 sec)
    Records: 10  Duplicates: 0  Warnings: 0
    
    root@localhost:liulin>
    root@localhost:liulin>
    root@localhost:liulin>select * from t;
    +----+------+
    | id | f    |
    +----+------+
    |  1 |    1 |
    |  2 |    2 |
    |  3 |    3 |
    |  4 |    4 |
    |  5 |    5 |
    |  6 |    6 |
    |  7 |    7 |
    |  8 |    8 |
    |  9 |    9 |
    | 10 |   10 |
    +----+------+

    ####修改数据

    root@localhost:liulin>update t set f=100 where id<5;
    Query OK, 4 rows affected (0.00 sec)
    Rows matched: 4 Changed: 4 Warnings: 0

    
    

    root@localhost:liulin>select * from t;
    +----+------+
    | id | f |
    +----+------+
    | 1 | 100 |
    | 2 | 100 |
    | 3 | 100 |
    | 4 | 100 |
    | 5 | 5 |
    | 6 | 6 |
    | 7 | 7 |
    | 8 | 8 |
    | 9 | 9 |
    | 10 | 10 |
    +----+------+

     

    (2)使用mysqlbinlog或show binlog events in 'xxxxx'找到闪回的起点和终点

       例如:>>mysqlbinlog mysql-bin.000004  –base64-output=decode-rows -vv   可以更加详细查看binlog日志文件中的内容找到要恢复的起点位置和终点位置

    (3)再使用flashback工具生产要闪回的文件

      命令:>>flashback  --binlogFileNames=/data/mysql/3308/binlog/mysql-bin.000004 --start-position=680 --stop-position=1005

      这时会生成一个binlog_output_base.flashback

    (4)然后再应用该文件到数据中执行数据库中数据闪回

      命令:>>mysqlbinlog binlog_output_base.flashback   --skip-gtids |mysql -uroot -p123 -S /data/mysql/3308/mysql.sock

    (5)进行检查,看是否进行闪回成功

    案例2:

      基于时间点恢复:

       >>./binary/flashback --databaseNames="d1" --tableNames="t1" --start-datetime="2020-11-29 17:22:30" --stop-datetime="2020-11-29 17:24:30" --sqlTypes="UPDATE,DELETE" --binlogFileNames=/opt/mysql/log/binlog/3308/mysql-bin.000001 --outBinlogFileNameBase=test.sql

  • 相关阅读:
    java内存泄漏的几种情况
    关于ajax请求,在参数中添加时间戳的必要性
    Linux启动界面切换:图形界面-字符界面(转)
    setTimeout 和 setInterval 的区别
    【域渗透】利用S4U2self提权
    【大数据之Hadoop篇】【1】hadoop集成环境搭建
    《windows核心编程》笔记(API)
    判断是64位操作系统还是32位系统
    centos7中搭建mysql5.7数据库
    Metasploit学习笔记(一) Samba服务 usermap_script安全漏洞相关信息
  • 原文地址:https://www.cnblogs.com/zmc60/p/14471538.html
Copyright © 2011-2022 走看看