• mysql binlog2sql闪回数据


    利用binlog2sql快速闪回误删除数据 - 别拿豆包不当干粮

    转原文地址: http://blog.51cto.com/sumongodb/2046073?cid=699139

    各位兄弟们,好久不见了!最近一直忙于新书的创作,所以一直没有时间更新博客。不知道这段时间大家学习得怎么样,希望大家通过看我的文章给大家带来帮助。
    老张我也花费了大量时间录制一些数据库的视频课程,大家要是感兴趣,也可以去学习,不要错过啊!

    今儿抽出时间,给大家分享一篇利用binlog2sql闪回工具,来恢复误删除的数据。我们都知道binlog的作用是备份恢复和完成MySQL的主从复制功能。利用mysqlbinlog工具可以进行基于时间点或者位置偏移量的数据恢复工作,在生产环境中遇到误删除,改错数据的情况,那是常有的事儿。我们都知道Oracle数据库有闪回功能,而MySQL本身没有自带闪回,但我们可以使用binlog2sql来完成这项工作。

    我们都知道binlog是以event作为单位,来记录数据库变更的数据信息,闪回就是可以帮助我们重现这些变化数据信息之前的操作。也就是说对于insert操作,会生成delete语句,反之delete操作,会生成insert语句。对于update操作,也会生成相反的update语句。这款工具只能使用在binlog格式为row模式下。

    下面进行实战演练:
    binlog2sql工具的下载地址: https://github.com/danfengcao/binlog2sql
    第一步:环境准备安装各种依赖的工具包列表

    python-pip ,
    PyMySQL ,
    python-mysql-replication,
    wheel argparse

    第二步:解压binlog2sql软件,命令如下

    unzip  binlog2sql-master.zip
    cd binlog2sql-master
    pip install –r requirements.txt

    第三步:通过python binlog2sql.py --help命令,来查看重要参数的使用;

    -B, --flashback 生成回滚语句
    --start-file 需要解析的binlog文件
    --start-position 解析binlog的起始位置
    --stop-position解析binlog的结束位置
    --start-datetime 从哪个时间点的binlog开始解析,格式必须为datetime
    --stop-datetime 到哪个时间点的binlog停止解析,格式必须为datetime
    -d, --databases 只输出目标db的sql
    -t, --tables 只输出目标tables的sql

    第四步:开始模拟数据删除
    首先删除掉zs库下,t表中的数据

    root@db 14:26:  [zs]> select * from t;
    +----+------+---------+
    | id | name | address |
    +----+------+---------+
    |  1 | aaa  | bj      |
    |  2 | bbb  | sh      |
    |  3 | ccc  | gz      |
    |  4 | ddd  | sy      |
    |  5 | eee  | fj      |
    +----+------+---------+
    5 rows in set (0.00 sec)
    
    root@db 14:26:  [zs]> delete from t;
    Query OK, 5 rows affected (0.04 sec)
    
    root@db 14:27:  [zs]> select * from t;
    Empty set (0.00 sec)

    第五步:需要创建一个闪回用户

    create user 'zs_test'@'%' identified by '123456';
    grant select,replication slave,replication client on *.* to 'zs_test'@'%' ;
    flush privileges;

    第六步:确定当前binlog文件和position位置

    root@db 14:41:  [zs]> show master status;
    +---------------------+----------+--------------+------------------+------------------------------------------+
    | File                | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
    +---------------------+----------+--------------+------------------+------------------------------------------+
    | mysql-binlog.000002 |     2091 |              |                  | e10f0ead-d595-11e7-82cb-080027cd683a:1-8 |
    +---------------------+----------+--------------+------------------+------------------------------------------+
    

    可以看到当前binlog是:mysql-binlog.000002
    位置偏移量:2091

    第七步:需要预估下时间,误操作的时间范围应该在下午2点20分到2点30分之间。命令如下:
    python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-datetime='2017-11-30 14:20:00' --stop-datetime='2017-11-30 14:30:00'
    输出结果:
    DELETE FROM zs.t WHERE address='bj' AND id=1 AND name='aaa' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
    DELETE FROM zs.t WHERE address='sh' AND id=2 AND name='bbb' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
    DELETE FROM zs.t WHERE address='gz' AND id=3 AND name='ccc' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
    DELETE FROM zs.t WHERE address='sy' AND id=4 AND name='ddd' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
    DELETE FROM zs.t WHERE address='fj' AND id=5 AND name='eee' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46

    从解析结果中我们了解到,误操作sql的位置是在1214~1427之间;这样就可以进一步过滤,使用flashback模式生成回滚sql;
    命令如下:
    python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-position=1214 --stop-position=1427 -B >t_rollback.sql

    查看闪回导出文件:

    [root@node3 binlog2sql]# cat t_rollback.sql 
    INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('fj', 5, 'eee'); #start 1214 end 1427 time 2017-11-30 14:27:46
    INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sy', 4, 'ddd'); #start 1214 end 1427 time 2017-11-30 14:27:46
    INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('gz', 3, 'ccc'); #start 1214 end 1427 time 2017-11-30 14:27:46
    INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sh', 2, 'bbb'); #start 1214 end 1427 time 2017-11-30 14:27:46
    INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('bj', 1, 'aaa'); #start 1214 end 1427 time 2017-11-30 14:27:46

    第八步:应用回滚文件,恢复数据。命令如下:
    /usr/local/mysql/bin/mysql -uroot -proot123 zs < t_rollback.sql

    第九步:检验恢复数据是否成功

    root@db 15:09:  [zs]> select * from t;
    +----+------+---------+
    | id | name | address |
    +----+------+---------+
    |  1 | aaa  | bj      |
    |  2 | bbb  | sh      |
    |  3 | ccc  | gz      |
    |  4 | ddd  | sy      |
    |  5 | eee  | fj      |
    +----+------+---------+
    5 rows in set (0.00 sec)

    验证恢复数据成功!

  • 相关阅读:
    TCP和UDP的区别
    DATAX 实现python调用cmd 系统控制台,实现在开发工具中内嵌datax (python 多行执行cmd命令)
    DATAX 实现java调用cmd 系统控制台,实现在开发工具中内嵌datax
    六大质量属性——可测试性代码层面描述(以“信息领域热词分析系统”为例)
    信息领域热词分析——质量属性
    DATAX 从scv到csv 从csv到mysql
    DATAX避坑点——MySQL到MYSQL,某个垃圾教程(简书)中,误导新手
    DATAX 按照官方实例 python datax.py ./stream2stream.json 乱码
    Python中plot使用方法小白的福音
    Python 最简实现逻辑回归,针对二维数据进行机器学习
  • 原文地址:https://www.cnblogs.com/l-h-h/p/10387051.html
Copyright © 2020-2023  润新知