zoukankan      html  css  js  c++  java
  • mysqlbinlog flashback 5.6完全使用手册与原理

    版本更新
      2016/3/7 首次发布
         2016/3/9  修复update无效问题
         2016/4/8  修复带有秒级别以下的日期数据bug
    下载地址

          http://pan.baidu.com/s/1nvGOOIl 

    注意事项

       在指定--start-position时,需要注意包含table_map_event的位置,否则工具无法找到相关表的元数据信息。

    如有疑问请联系微信:onesoft007

    简介

    DBA或者开发人员,有时会误删除或者误更新数据。传统的数据库恢复方法是利用之前的备份再加上误操作之前的binlog,来恢复数据。该方法需要耗费较长时间来恢复备份,甚至需要停机维护,严重降低系统的可用性。

    MySQL的flashback功能是由淘宝的彭立勋,在MySQL-5.5.18的基础上开发的。随着binlog格式的变动和类型的增加,基于5.5.18的版本,无法用于目前主流的5.6版本的。因此平民软件将该功能移植到5.6版本上,让相关人员对数据库有更强的掌控能力。

     

    binlog格式选择

    MySQL的binlog格式分为三类:statement、mixed、row。其中,

        statement格式,记录了所有客户端的执行语句。比如 update tb1 set name='aaa' where id=1;

        row格式,记录了数据库的变更前和变更后数据。比如 update tb1 set name='aaa' ,id=1 where name='bbb' , id=1;

        mixed格式,是二者的混合。在使用statement格式不会造成主从不一致时,使用statement格式,否则使用row模式。

    因此想要把数据回退到上一个时间点,必须保证binlog_format=row

    闪回原理

    单个event闪回

    举例说明

    • 在数据库中创建如下表

    mysql> show create table tb1G
    *************************** 1. row ***************************
    Table: tb1
    Create Table: CREATE TABLE `tb1` (
    `id` int(11) DEFAULT NULL,
    `name` varchar(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

    • 执行增、删、改动作

    insert into tb1 values(1,'aaa'),(2,'aaa');

    delete from tb1 where id=2;

    update tb1 set name='bbb' where id=1;

    • 查看binlog文件

    mysqlbinlog -v 128.000129

    ########################################

    SET TIMESTAMP=1459999601/*!*/;
    BEGIN
    /*!*/;
    # at 301
    #160407 11:26:41 server id 10 end_log_pos 346 Table_map: `test`.`tb1` mapped to number 224
    # at 346
    #160407 11:26:41 server id 10 end_log_pos 395 Write_rows: table id 224 flags: STMT_END_F

    BINLOG '
    cdMFVxMKAAAALQAAAFoBAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
    cdMFVx4KAAAAMQAAAIsBAAAAAOAAAAAAAAEAAgAC//wBAAAAA2FhYfwCAAAAA2FhYQ==
    '/*!*/;
    ### INSERT INTO `test`.`tb1`
    ### SET
    ### @1=1
    ### @2='aaa'
    ### INSERT INTO `test`.`tb1`
    ### SET
    ### @1=2
    ### @2='aaa'
    # at 395
    #160407 11:26:41 server id 10 end_log_pos 422 Xid = 271
    COMMIT/*!*/;
    # at 422
    #160407 11:27:04 server id 10 end_log_pos 490 Query thread_id=5 exec_time=0 error_code=0
    SET TIMESTAMP=1459999624/*!*/;
    BEGIN
    /*!*/;
    # at 490
    #160407 11:27:04 server id 10 end_log_pos 535 Table_map: `test`.`tb1` mapped to number 224
    # at 535
    #160407 11:27:04 server id 10 end_log_pos 575 Delete_rows: table id 224 flags: STMT_END_F

    BINLOG '
    iNMFVxMKAAAALQAAABcCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
    iNMFVyAKAAAAKAAAAD8CAAAAAOAAAAAAAAEAAgAC//wCAAAAA2FhYQ==
    '/*!*/;
    ### DELETE FROM `test`.`tb1`
    ### WHERE
    ### @1=2
    ### @2='aaa'
    # at 575
    #160407 11:27:04 server id 10 end_log_pos 602 Xid = 272
    COMMIT/*!*/;
    # at 602
    #160407 11:27:22 server id 10 end_log_pos 670 Query thread_id=5 exec_time=0 error_code=0
    SET TIMESTAMP=1459999642/*!*/;
    BEGIN
    /*!*/;
    # at 670
    #160407 11:27:22 server id 10 end_log_pos 715 Table_map: `test`.`tb1` mapped to number 224
    # at 715
    #160407 11:27:22 server id 10 end_log_pos 765 Update_rows: table id 224 flags: STMT_END_F

    BINLOG '
    mtMFVxMKAAAALQAAAMsCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
    mtMFVx8KAAAAMgAAAP0CAAAAAOAAAAAAAAEAAgAC///8AQAAAANhYWH8AQAAAANiYmI=
    '/*!*/;
    ### UPDATE `test`.`tb1`
    ### WHERE
    ### @1=1
    ### @2='aaa'
    ### SET
    ### @1=1
    ### @2='bbb'
    # at 765
    #160407 11:27:22 server id 10 end_log_pos 792 Xid = 273
    COMMIT/*!*/;
    # at 792
    #160407 11:28:04 server id 10 end_log_pos 829 Rotate to 128.000130 pos: 4
    DELIMITER ;

    ###################################################

    • 反转

    insert:event中包含该行数据的每个字段值,删除即可
    delete:event中包含了删除前,该行数据的所有字段值。将删除的数据,重新插入即可
    update:只需将set和where部分调换,即可完成反转。

    多个event闪回

    如果误操作的事务是由多个event组成的,那么必须将整个事务倒序恢复,即从最后一个event恢复到第一个event。

    使用方法

    举例说明

    • insert into tb1 values(1,'aaa'),(2,'aaa');
    • delete from tb1 where id=2;
    • update tb1 set name='bbb' where id=1;
    • select * from tb1;

    +------+------+
    | id     | name |
    +------+------+
    | 1      | bbb |
    +------+------+

    • mysqlbinlog -v --start-pos=557 128.000132

    #####################

    # at 557
    #160407 12:04:15 server id 10 end_log_pos 602 Table_map: `test`.`tb1` mapped to number 224
    # at 602
    #160407 12:04:15 server id 10 end_log_pos 652 Update_rows: table id 224 flags: STMT_END_F

    BINLOG '
    P9wFVxMKAAAALQAAAFoCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
    P9wFVx8KAAAAMgAAAIwCAAAAAOAAAAAAAAEAAgAC///8AQAAAANhYWH8AQAAAANiYmI=
    '/*!*/;
    ### UPDATE `test`.`tb1`
    ### WHERE
    ### @1=1
    ### @2='aaa'
    ### SET
    ### @1=1
    ### @2='bbb'
    # at 652
    #160407 12:04:15 server id 10 end_log_pos 679 Xid = 540
    COMMIT/*!*/;

    #####################

    • mysqlbinlog -v -B --start-pos=557 128.000132

    ############################

    BINLOG '
    P9wFVxMKAAAALQAAAFoCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
    P9wFVx8KAAAAMgAAAIwCAAAAAOAAAAAAAAEAAgAC///8AQAAAANiYmL8AQAAAANhYWE=
    '/*!*/;
    ### UPDATE `test`.`tb1`
    ### WHERE
    ### @1=1
    ### @2='bbb'
    ### SET
    ### @1=1
    ### @2='aaa'

    ############################

    可以看出update已经被反转

    执行反转

    • mysqlbinlog -B -v --start-pos=557 128.000132 | mysql -utest -ptest test

    mysql> select * from tb1;
    +------+------+
    | id     | name |
    +------+------+
    | 1      | aaa |
    +------+------+

    有兴趣的,可以继续往下恢复。

           注意:恢复之前先在不使用的从机上做测试,测试成功后,再在主库上做。

    限制

           该软件利用binlog中记录了操作前的数据镜像和操作后的数据镜像。有如下限制

    1)        binlog_format=row

    2)        只支持insert、update、delete

    3)        不支持drop 、truncate、alter等ddl语句

    结论

           flashback功能,可以在紧急情况下,避免用户漫长的数据库恢复过程。让高可用提升一个级别。

     

    下载地址

      http://pan.baidu.com/s/1nutwWg5

    如有疑问请联系微信:onesoft007

    MySQL限时解答,24小时内友哥专业解答
    http://www.yougemysqldba.com
    如有进一步需要请联系微信onesoft007
    微博账号@友哥一指
  • 相关阅读:
    欧拉回路
    2018 年 ACM-ICPC 焦作站现场赛感受
    3.1 基础-抛小球
    2.2 进阶-禁忌雷炎
    初学Java-循环输入直到文件结束
    1.1 基础-取近似值
    1.2 进阶-对称的二叉树
    LEETCODE
    算法
    算法
  • 原文地址:https://www.cnblogs.com/youge-OneSQL/p/5249736.html
Copyright © 2011-2022 走看看