zoukankan      html  css  js  c++  java
  • mysql误删除数据后如何恢复

    Mysql 误删除是我最头痛的一件事,网络也有很多惨痛的教训,为了减少企业损失,应迅速恢复业务数据,后续在人员操作行为上建立完善的制度及流程,将风险扼杀在摇篮才是上上策。

    本次使用的原美团开源Mysql 数据闪回工具

    传送门:https://github.com/Meituan-Dianping/MyFlash

    一,MyFlash简介

    MyFlash的前身是binlong2,后续是由美团点评公司技术工程部开发维护的一个回滚DML操作的工具。该工具通过解析V4版本的二进制日志,完成回滚操作。相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易。 该工具已经在美团点评内部使用

    二,MyFlash使用限制

    1. 二进制日志格式必须为【row】行级模式 ,且binlog_row_image =full
    2. 仅支持5.6与5.7 (如果是低版本的mysql 二种方案 1,升级mysql 2,使用binlog2)
      [binlog2sql工具的下载地址:]
    3. 只能回滚DML(增,删,改)

    三,详细说明

    3.1 安装部署

    git clone https://github.com/Meituan-Dianping/MyFlash.git
    cd MyFlash/
    [root@gitlab MyFlash]# yum install glib2*
    [root@gitlab MyFlash]# gcc -w  `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c  -o binary/flashback
    #动态编译

    3.2 开启mysql-binlog

    [root@gitlab mysql]# cat /etc/my.cnf|grep "log_bin*"
    # log_bin
    log-bin=mysql-bin  #名字前缀
    log_bin=/var/lib/mysql/mysql-bin  #路径
    log_bin_index=/var/lib/mysql/mysql-bin.index  #索引
    binlog_format=row   #binlog模式 (行、混合、sql语句)
    max_binlog_size = 512M #单个文件大小
    expire_logs_day = 30 #保留最近30天
    server-id = 1 #ID编号
    
    [root@gitlab mysql]# /etc/init.d/mysqld restart
    Restarting mysqld (via systemctl):                         [  OK  ]
    登陆mysql 查看binlog开启情况
    mysql> show variables like '%log_bin%'

    注意:此工具必须使用"row 行级模式"
    
    show variables like  'binlog%';
    ##行级模式缺点,binlog日志会增大 原来的3倍  优点:相对安全

    3.3 使用方法

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

    3.4 测试用例

    1) 测试环境介绍:

    [root@gitlab binary]# cat /etc/redhat-release   #系统版本7.4
    CentOS Linux release 7.4.1708 (Core) 
    [root@gitlab binary]# uname -a   #系统内核3.10 64位
    Linux gitlab.example.com 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    [root@gitlab binary]# mysql -V      #mysql 版本
    mysql  Ver 14.14 Distrib 5.6.39, for Linux (x86_64) using  EditLine wrapper

    2)模拟数据
    我这里把测试库的一些数据拿啦,直接导入sql作为案例使用

    SELECT * FROM `sys_member_msg` WHERE id <=666

     3) 模拟误删除

    delete from `sys_member_msg` where id<=666  #在查看id小于666的就显示空了

    4)回滚指定文件中的所有【插入、删除、修改】语句
    row行级模式 查看binlong,需要添加参数(--base64-output=decode-rows -v)对输出结果解码。

    4.1 查看开启binlong 

    mysql> show variables like 'log_%'; 
    +----------------------------------------+--------------------------------+
    | Variable_name                          | Value                          |
    +----------------------------------------+--------------------------------+
    | log_bin                                | ON                             |
    | log_bin_basename                       | /var/lib/mysql/mysql_bin       |
    | log_bin_index                          | /var/lib/mysql/mysql-bin.index |
    
    13 rows in set (0.00 sec)

    4.2 查看最新binlog位置

    mysql> show master status;  #查看最新binlog位置
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql_bin.000007 | 16696881 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    4.3 生成回滚数据文件

    [root@gitlab binary]# time ./flashback  --sqlTypes='DELETE' --binlogFileNames=/var/lib/mysql/mysql_bin.000007
    
    real    0m0.053s
    user    0m0.015s
    sys 0m0.035s
    #参数意思 看上面用法介绍
    #比如:开始时间  -结束时间 --DML语句类型(增删改)、post点、大数据要拆分
    #默认产生一个binlog_output_base.flashback文件

    4.4 恢复到数据库

    [root@gitlab binary]# mysqlbinlog binlog_output_base.flashback |mysql -uroot -p
    Enter password:  #输入mysql密码
    #没有反馈,应该OK了

    3.5查看数据回滚情况

    SELECT * FROM `sys_member_msg` WHERE id <=666

    四 总结:

    1,myflash 只支持 row 模式,如果你现在的binlog是其它模式,切换的时候,会影响主从同步
    2,row模式很安全,但是binlog数据量会增加 3-5倍
    3,查看row模式下的binlog 需要添加参数(--base64-output=decode-rows -v)对输出结果解码
    4,必要给开发生产数据库开放权限,让他们select去吧
    5,筛选恢复数据有很多比如:开始时间 -结束时间 --DML语句类型(增删改)、post点、大数据要拆分后逐去恢复 等等
    Mysql 误删除数据-快速回滚

    本文转载:https://www.dgstack.cn/archives/971.html

    [root@gitlab binary]# cat /etc/redhat-release   #系统版本7.4
    CentOS Linux release 7.4.1708 (Core) 
    [root@gitlab binary]# uname -a   #系统内核3.10 64位
    Linux gitlab.example.com 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    [root@gitlab binary]# mysql -V      #mysql 版本
    mysql  Ver 14.14 Distrib 5.6.39, for Linux (x86_64) using  EditLine wrapper
  • 相关阅读:
    SQL Azure (17) SQL Azure V12
    Microsoft Azure News(5) Azure新DV2系列虚拟机上线
    Azure Redis Cache (3) 在Windows 环境下使用Redis Benchmark
    Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
    Windows Azure Virtual Machine (31) 迁移Azure虚拟机
    Windows Azure Web Site (16) Azure Web Site HTTPS
    Azure China (12) 域名备案问题
    一分钟快速入门openstack
    管理员必备的Linux系统监控工具
    Keepalived+Nginx实现高可用和双主节点负载均衡
  • 原文地址:https://www.cnblogs.com/cpw6/p/12518726.html
Copyright © 2011-2022 走看看