Ⅰ、背景

早先操作数据误操作后,我们一般通过全量备份+binlog的方式来实现恢复(前滚)

有时只想撤销一个几分钟前的操作,采用这种方式就会显得很笨重

大家都知道Oracle有个叫做flashback的功能,很遗憾MySQL官方并没有提供类似的工具

但姜老师的innosql中实现了这个功能,而且还兼容官方MySQL,目前支持到5.7版本

Ⅱ、玩两手

关注微信公众号:InsideMySQL,找姜老师要下压缩包即可,直接解压,开箱即用,方便快捷

[root@VM_0_5_centos flashback]# ./mysqlbinlog -V
./mysqlbinlog Ver 3.4-InnoSQL for Linux at x86_64
[root@VM_0_5_centos flashback]# ./mysqlbinlog --help |grep flashback
-B, --flashback Flashback data to start_postition or start_datetime.
-E, --fb-event=name only flashback this type of
flashback FALSE

演示闪回功能

(root@localhost) [test]> select version();
+------------+
| version() |
+------------+
| 5.7.20-log |
+------------+
1 row in set (0.08 sec) (root@localhost) [test]> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec) (root@localhost) [test]> select * from flashback;
+------+------+------+------+
| a | b | c | d |
+------+------+------+------+
| 1 | 2 | 3 | 4 |
| 2 | 3 | 4 | 5 |
| 3 | 4 | 5 | 6 |
| 4 | 5 | 6 | 7 |
+------+------+------+------+
4 rows in set (0.00 sec) (root@localhost) [test]> show master status;
+------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| bin.000001 | 3028 | | | |
+------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec) 误删数据
(root@localhost) [test]> delete from flashback;
Query OK, 4 rows affected (0.01 sec) (root@localhost) [test]> select * from flashback;
Empty set (0.00 sec) [root@VM_0_5_centos flashback]# ./mysqlbinlog --base64-output=decode-rows -v bin.000001 --start-position=3028
截取重点部分如下:
### DELETE FROM `test`.`flashback`
### WHERE
### @1=1
### @2=2
### @3=3
### @4=4
### DELETE FROM `test`.`flashback`
### WHERE
### @1=2
### @2=3
### @3=4
### @4=5
### DELETE FROM `test`.`flashback`
### WHERE
### @1=3
### @2=4
### @3=5
### @4=6
### DELETE FROM `test`.`flashback`
### WHERE
### @1=4
### @2=5
### @3=6
###   @4=7
可以看到删除了4条记录 来看下flashback的核心参数-B,同样截取重点
[root@VM_0_5_centos flashback]# ./mysqlbinlog -B --base64-output=decode-rows -v bin.000001 --start-position=3028
### INSERT INTO `test`.`flashback`
### SET
### @1=1
### @2=2
### @3=3
### @4=4
### INSERT INTO `test`.`flashback`
### SET
### @1=2
### @2=3
### @3=4
### @4=5
### INSERT INTO `test`.`flashback`
### SET
### @1=3
### @2=4
### @3=5
### @4=6
### INSERT INTO `test`.`flashback`
### SET
### @1=4
### @2=5
### @3=6
###   @4=7
可以看到删除变成插入了 [root@VM_0_5_centos flashback]# ./mysqlbinlog -B -v bin.000001 --start-position=3028 |mysql -S /tmp/mysql3306.sock
(root@localhost) [test]> select * from flashback;
+------+------+------+------+
| a | b | c | d |
+------+------+------+------+
| 1 | 2 | 3 | 4 |
| 2 | 3 | 4 | 5 |
| 3 | 4 | 5 | 6 |
| 4 | 5 | 6 | 7 |
+------+------+------+------+
4 rows in set (0.00 sec)
恢复成功 tips:
恢复的时候不要加--base64-output=decode-rows,导不进去,没反应

Ⅲ、关于flashback回放的位置点

假设Master宕机切到了Slave,Master恢复后,可能需要将部分数据Flashback掉(宕机前最后一部分未传过去的binlog),Flashback掉的位置很关键,这个位置一般以Slave上SQL线程最终回放完的位置为准

Ⅳ、相关小结

  • flashback是基于binlog的逆操作(逻辑),Oracle的闪回是基于undo做的(物理)
  • 使用flashback,binlog_format必须为row,这个之前binlog章节有简单提到过
  • binlog_row_image必须设为full
  • flashback仅支持DML操作的闪回,不支持ddl
  • 实例开启gtid的情况下,不支持flashback
  • 同一事务中的DML语句不仅闪回,语句执行顺序也会倒过来(有兴趣的可以测试,篇幅原因只贴了一个delete操作)

tips:

①DDL的闪回功能,商业版InnoSQL是支持的,修改了MySQL源码,将删除的库或者表保存在回收站(Recycle Bin Tablespace)

②这里我们分析的是出事之后的挽回,那我们最好的办法就是尽量不要惹事,这里推荐一个参数sql_safe_updates,默认是off的,开启此参数,执行的sql中存在不带where条件的delete和update就会报错1175

最后祝大家,永远不用flashback,一路平安!!!

闪回工具flashback的更多相关文章

  1. MySQL 闪回工具之 binlog2sql

    生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...

  2. Mysql闪回工具之binlog2sql的原理及其使用

    生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成 ...

  3. binlog2sql闪回工具的使用

    binlog2sql闪回工具的使用 一.下载安装依赖的python yum install openssl-devel bzip2-devel expat-devel gdbm-devel readl ...

  4. MySQL闪回工具之myflash 和 binlog2sql

    MySQL闪回工具之:binlog2sql  https://github.com/danfengcao/binlog2sql MYSQL Binglog分析利器:binlog2sql使用详解  :h ...

  5. mysql闪回工具--binlog2sql实践

    DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...

  6. MySQL闪回工具之binlog2sql

    一.binlog2sql 1.1 安装binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd b ...

  7. Oracle 闪回特性(FLASHBACK DATABASE)

    --===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --======================= ...

  8. SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改)

    SQL Fundamentals || Oracle SQL语言 1.表的基本操作 (CREATE TABLE, DROP TABLE,TRUNCATE TABLE, RENAME tablename ...

  9. oracle闪回(flashback)的部分实用操作(彻底删除的除外)

    一.数据delete并且commit提交之后的闪回 (一):根据时间来恢复:1.查询数据库当前时间(目的是为了检查数据库时间是否与你电脑时间相近,避免时间不同而将数据恢复到错误时间点)select  ...

随机推荐

  1. 队列链式存储 - 设计与实现 - API函数

    队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...

  2. java--银行业务调度系统

    转载请申明出处:http://blog.csdn.net/xmxkf   1. 银行调度业务系统的题目来源与需求阐述 银行业务调度系统: 模拟实现银行业务调度系统逻辑,具体需求如下: 1.银行内有6个 ...

  3. Windows核心编程读书笔记1

    今天特别困啊,这是为什么?!!刚刚把第一章看了一下,困到不行,所以写blog清醒一下. 第一章标题是“错误处理”,看了之后吓了一跳,难道第一章就讲这么高大上的东西?!不是不是,我现在的理解是,这章主要 ...

  4. WebRTC MCU( Multipoint Conferencing Unit)服务器调研

    接触过的有licode.kurento. licode的缺陷:文档支持有限,licode的app client库只有js的 kurento的优势:文档齐全,Demo俱备,封装API比较齐全.它的主要特 ...

  5. Java永久代去哪儿了

    http://www.infoq.com/cn/articles/Java-PERMGEN-Removed 在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法 ...

  6. AngularJS + RequireJS

    http://www.startersquad.com/blog/AngularJS-requirejs/ While delivering software projects for startup ...

  7. 点聚weboffice隐藏自带工具栏

    webObj = document.getElementById(webofficeID); webObj.ShowToolBar = false;   //隐藏weboffice自带工具栏

  8. 测试驱动开发 TDD

    一.详解TDD 1.1.TDD概念 :Test Drived Develop 测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种方法论.TDD的原理是在开发功能代码之前,编写单元测试用例代码,测试 ...

  9. HTML学习笔记8:表单

      什么是表单?     一个网页表单可以将用户输入的数据发送到服务器进行处理.因为互联网用户使用复选框,单选按钮或文本字段填写表格,所以WebForms的形式类似文件或数据库.例如,WebForms ...

  10. 为什么「margin:auto」可以让块级元素水平居中?

    知乎链接:http://www.zhihu.com/question/21644198 关于BFC的解释:W3CFans http://www.w3cfuns.com/thread-5595727-1 ...