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

  • 相关阅读:
    86. Partition List
    2. Add Two Numbers
    55. Jump Game
    70. Climbing Stairs
    53. Maximum Subarray
    64. Minimum Path Sum
    122. Best Time to Buy and Sell Stock II
    以场景为中心的产品设计方法
    那些产品经理犯过最大的错
    Axure教程:如何使用动态面板?动态面板功能详解
  • 原文地址:https://www.cnblogs.com/zmc60/p/14471538.html
Copyright © 2011-2022 走看看