MySQL Flashback 闪回功能详解

阅读目录

回到顶部

1. 简介

mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据。在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos)。比如忘了带where条件的update、delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速、简单。

目前MySQL的flashback功能是利用binlog完成的,第一个实现该功能的是阿里云的彭立勋, 他在MySQL 5.5版本上就已实现,并将其提交给MariaDB。

回到顶部

2. 闪回原理

原理:flashback工具(-B 参数)可对rows格式的binlog可以进行逆向操作,delete反向生成insert、update生成反向的update、insert反向生成delete。

MySQL的binlog以event的形式,记录了MySQL中所有的变更情况,利用binlog我们就能够重现所记录的所有操作。

MySQL引入binlog主要有两个用途/目的:一是为了主从复制;二是用于备份恢复后需要重新应用部分binlog,从而达到全备+增备的效果。

MySQL的binlog有三种格式:

  • statement,基于SQL语句的模式,一般来说生成的binlog尺寸较小,但是某些不确定性SQL语句或函数在复制过程可能导致数据不一致甚至出错;
  • row,基于数据行的模式,记录的是数据行的完整变化。相对更安全,推荐使用(但通常生成的binlog会比其他两种模式大很多);
  • mixed,混合模式,可以根据情况自动选用statement抑或row模式;这个模式下也可能造成主从数据不一致。它属于MySQL 5.1版本时期的过渡方案,已不推荐使用了。

注意:使用mysqlbinlog flashback 工具必须设置:binlog_format = row

回到顶部

3. flashback安装

下载flashback工具 mysqlbinlog : https://pan.baidu.com/s/1c1Ub1x2,并将mysqlbinlog文件移至mysql安装路径的bin目录下(可备份原来的mysqlbinlog为mysqlbinlog_bak),执行mysqlbinlog --help命令,可能会报错(系统版本为 CentOS 6.4_x64):

[[email protected] bin]# mysqlbinlog --help
mysqlbinlog: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15‘ not found (required by mysqlbinlog)

需要安装新版本的libstdc++.so.6,下载链接:https://pan.baidu.com/s/1gfIarCn

[[email protected] ~]# cp libstdc++.so.6.0.20  /usr/lib64/
[[email protected] ~]# cd /usr/lib64/
[[email protected] lib64]# mv libstdc++.so.6 libstdc++.so.6_bak
[[email protected] lib64]# ln -s libstdc++.so.6.0.20 libstdc++.so.6
[[email protected] lib64]# ll libstdc*
lrwxrwxrwx  1 root root      19 4月   6 09:30 libstdc++.so.6 -> libstdc++.so.6.0.20
-rwxr-xr-x. 1 root root  987096 7月  19 2013 libstdc++.so.6.0.13
-rw-r--r--  1 root root 1011824 4月   6 09:28 libstdc++.so.6.0.20
lrwxrwxrwx. 1 root root      19 1月  14 12:25 libstdc++.so.6_bak -> libstdc++.so.6.0.13

安装完后执行mysqlbinlog --help,若报错:mysqlbinlog: /lib64/libc.so.6: version `GLIBC_2.14‘ not found (required by /usr/lib64/libstdc++.so.6),需要更新/lib64库文件。下载链接:https://pan.baidu.com/s/1kViGrIZ

# tar zxvf  glibc-2.14.tar.gz
# cd glibc-2.14
# mkdir build
# cd build
# ../configure  --prefix=/opt/glibc-2.14
 ## 检查是否有问题。
# make  ## (4核可加-j4 ,8核可加-j8)
# make install
# strings libc.so | grep GLIBC   ## 这是我们需要的lib了,然后去更新系统的库
# cp libc.so  /lib64/libc-2.14.so
# mv /lib64/libc.so.6   /lib64/libc.so.6_bak
# LD_PRELOAD=/lib64/libc-2.14.so ln -s  /lib64/libc-2.14.so  /lib64/libc.so.6
# strings /lib64/libc.so.6 | grep GLIBC 

安装完成后执行:

[[email protected] ~]# mysqlbinlog -V
mysqlbinlog Ver 3.4-InnoSQL for Linux at x86_64
[[email protected] ~]# 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

发现mysqlbinlog版本已变为3.4-InnoSQL(之前的版本为3.4),且多了一个 -B 参数,此参数即用于实现flashback功能。到此,mysqlbinlog已安装完成!

回到顶部

4. 使用简介

先创建一张表user,向user表中插入一条数据,查看binlog日志内容,可以找到刚才插入的记录:

# mysqlbinlog -vv mysql-bin.000004

### INSERT INTO `test`.`user`
### SET
###   @1=30 /* SHORTINT meta=0 nullable=1 is_null=0 */
###   @2=‘Stephen Curry‘ /* VARSTRING(80) meta=80 nullable=1 is_null=0 */

然后使用flashback工具(-B参数)查看binlog内容,可以找到刚才插入记录的逆向操作:

# mysqlbinlog -vv mysql-bin.000004 -B

### DELETE FROM `test`.`user`
### WHERE
###   @1=30 /* SHORTINT meta=0 nullable=1 is_null=0 */
###   @2=‘Stephen Curry‘ /* VARSTRING(80) meta=80 nullable=1 is_null=0 */

同理,delete操作将会被转换为insert,update被转换为反向的update;若在一个事务中既有insert、update、delete语句,通过使用-B参数后,不仅三种DML语句完成了逆向转换,并且语句顺序也会发生颠倒。

在binlog中找到误操作的pos变化区间后,使用mysqlbinlog -B 恢复:

# mysqlbinlog -B --start-position=296 --stop-position=429 mysql-bin.000004 | mysql -uroot -p

回到顶部

5. Flashback工具使用注意点

  • binlog日志格式必须是ROW格式:binlog_format = row ;
  • 一个事务中的DML语句不仅会逆向转换,并且语句顺序也会发生颠倒;
  • 只支持 insert、update、delete , 不支持drop 、truncate、alter等DDL语句。

原文地址:https://www.cnblogs.com/hanxiaohui/p/8304667.html

时间: 2024-10-06 00:06:48

MySQL Flashback 闪回功能详解的相关文章

Oracle闪回技术详解

概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEGMENT) 在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段.因为大部分闪回技术

oracle闪回表详解

--- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间内的各个版本 --- 使用闪回事务查询查看事务处理历史记录或行 会还原表及其关联对象(如索引.约束条件.触发器等)中的数据. 所谓闪回表,就是将表里的数据回退到历史的某个时间点,比如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复回来,在这个操作过程中,数据库仍然可用而且不需要额外的空间.

binlog2sql之MySQL数据闪回

DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护,并不适合快速回滚.也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能.现在有不少好用而且效率又高的开源闪回工具如binlog2sql.mysqlbinlog_flashback,这些工具在工作中给DBA减轻了不少痛苦,以下针对binlog2sql的使用进行实践演练. bin

Mysql数据闪回的奇技淫巧(binlog2sql)

一.概述 binlog2sql是一个开源项目,应用于大众点评线上环境.类似于ORACLE中的闪回功能,binlog2sql可以基于时间点或者位置偏移量进行数据恢复.从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等.也就是对于insert操作会生成对应的delete语句,反之delete操作会生出对应的insert语句,update操作会生成相反的语句. 关于binlog2sql的闪回详细介绍可参考闪回原理与实战.我也是

PHP5.2至5.6的新增功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数

开启数据库闪回功能

1.闪回功能必须,设置数据库为归档 SQL> select log_mode from v$database; LOG_MODE ------------------------ NOARCHIVELOG SQL> shutdown immediate; SQL> startup mount; 设置闪回区位置和大小 SQL> show parameter db_recovery NAME TYPE VALUE ---------- --------- ----------- db_

Oracle OCP笔记(31)使用闪回功能

Oracle OCP笔记(31)使用闪回功能 Oracle的闪回功能受到3个数据库结构之一的支持: 撤消数据.闪回恢复区和回收站. 撤消表空间中的撤销数据不仅支持事务回滚,也支持大多数闪回表操作.Flashback Data Archives允许查询先前版本的表行,它在撤销表空间之外的一个或多个表空间中提供一个区域,支持的保留期比撤销表空间还长.闪回日志保存在闪回恢复区中,从而无需执行传统的还原和恢复操作,即可方便地将整个数据库回滚到过去的时间点.每个表空间中的回收站包含一个或多个版本的已删除的

PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解

PHP 5.2.5.3.5.4.5.5.5.6 对比以及功能详解 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注]. 因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣. 本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型

CentOS 6.5 MySQL/MariaDB数据备份与恢复备份详解

MySQL/MariaDB数据备份与恢复备份 数据对我们来说再重要不过了,那我们如何做到对数据尽可能的安全呢,当我们的数据丢失了那又该怎么做呢,所以说数据备份对我们的数据安全性来说太重要了. 数据对我们来说再熟悉不过了,也最平常不过了,我们每天都在接触各色各样的数据,数据记录了我们平常相关的业务信息,所以数据对于我们来说是很重要的,这么重要的数据如果我们的数据丢失了那我们是不是相关的业务都没法进行了呢,这应该是个很麻烦的问题,那我们怎么保护我们的数据的安全呢,这就要用到我们的数据备份了. 如何执