版本更新
  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 tb1\G
*************************** 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

mysqlbinlog flashback 5.6完全使用手册与原理的更多相关文章

  1. mysqlbinlog flashback 使用最佳实践

    mysqlbinlog限制 该软件利用binlog中记录了操作前的数据镜像和操作后的数据镜像.有如下限制 1)binlog_format=row 2)必须打开binlog 3)只支持insert.up ...

  2. MySQL闪回原理与实战

    本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较. DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除 ...

  3. MySQL的binlog2sql闪回

    从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途=========== * 数据快速回滚(闪回)* 主从切换后新m ...

  4. 常用控件产品官方文档/手册/API列表 c#控件文档API列表 asp.net控件产品技术文档中文版

    .netCHARTING报表图表控件 文档帮助手册Ab3d.PowerToys 文档帮助手册Ab3d.Reader3ds 文档帮助手册ABViewer 文档帮助手册 (工程图纸文档管理系统)Activ ...

  5. MySQL flashback 功能

    1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带wh ...

  6. MySQL Flashback 闪回功能详解

    1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带wh ...

  7. MySQL实战45讲学习笔记:第二十四讲

    一.引子 在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致 ...

  8. 24 | MySQL是怎么保证主备一致的?

    在前面的文章中,我不止一次地和你提到了binlog,大家知道binlog可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了binlog就可以跟主库保持一致了呢?今天我就正式地 ...

  9. 关于MySql数据库误操作数据找回的办法

    先讲个事,前段时间,系统长时间不用的一个功能被开放出来了,想当然的我没有在测试平台上测试,直接操作了正式系统(的确是我不严谨),导致好多数据异常,页面展示错乱了.于是我想到的第一个就是进行备份还原.项 ...

随机推荐

  1. spring 以Ant Build方式运行build.xml文件,报warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds 的解决办法

    Buildfile: F:\experience\spring_pdf\sourcecode\example1\build.xml compile: [javac] F:\experience\spr ...

  2. SSD果然劲爆!

    前两周入手了一块浦科特128G盘,不说多了,有图为证 以前把机械盘放在主硬盘位的时候,鲁大师显示是SATA II接口,现在把SSD放在主硬盘位,显示居然是SATA III接口了,看上面测试,确实是II ...

  3. php递归遍历目录计算其大小(文件包括目录和普通文件)

    <?php function countdir($path){ $size = 0; //size = 0; 跟 size = null; 怎么结果不一样 $path = rtrim($path ...

  4. erlang rabbitmq-server安装

    erlang rabbitmq-server安装 yum -y install   xsltproc fop tk unixODBC unixODBC-devel make gcc gcc-c++ k ...

  5. Spring task executor同异步

    1. spring提供了哪些任务执行器,是否有同步的任务执行器 有ThreadPoolTaskExecutor等执行器 同步可以用SyncTaskExecutor,但这个可以说不算一个线程池,因为还在 ...

  6. (一)s3c2440 地址分配讲解 (很难很纠结)

    mini2440的地址怎么分配.mini2440处理器的地址怎么分配. S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 00 ...

  7. java基本数据类型包装类

    Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...

  8. Excel 统计在某个区间内数值的个数

    =COUNTIF(A1:A50,"<=1.0E-5")-COUNTIF(A1:A50,"<60")

  9. ALLOCATE语句分配FORTRAN动态数组方法(转自http://blog.csdn.net/zhuxianjianqi/article/details/8067174)

    数组的动态分配 a)    可分配数组 数组可以是静态的也可以是动态的.如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放.程序运行时静态数组的大小不能改变.静态数组的缺 ...

  10. linux初始化配置-----网络配置

    一.设置linux网络 1)零时设置ip地址 由于centos7默认没有ifconfig命令所以为了使用方便我们先安装net-tool使我们能使用ifconfig命令查看ip地址 ·挂载系统光盘 [r ...