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):
[root@centos64-slave1 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

[root@centos64-slave1 ~]# cp libstdc++.so.6.0.20 /usr/lib64/
[root@centos64-slave1 ~]# cd /usr/lib64/
[root@centos64-slave1 lib64]# mv libstdc++.so.6 libstdc++.so.6_bak
[root@centos64-slave1 lib64]# ln -s libstdc++.so.6.0.20 libstdc++.so.6
[root@centos64-slave1 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

安装完成后执行:
[root@centos64-slave1 ~]# mysqlbinlog -V
mysqlbinlog Ver 3.4-InnoSQL for Linux at x86_64
[root@centos64-slave1 ~]# 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. ldconfig 解决依赖库
上面我们介绍过了直接替换 /lib64 的软连接来解决 mysqlbinlog 的依赖问题,但是这样做对于系统来说有一定的风险性,这里采用 ldconfig 解决。ldconfig 是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享。
mysqlbinlog5.7 -V #该命令已经集成到系统环境变量,可以直接调用
mysqlbinlog5.7: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mysqlbinlog5.7)
添加 MySQL的库环境到 ldconfig 配置文件:
echo "/data/mysql-5.7.21-linux-glibc2.12-x86_64/lib" >> /etc/ld.so.conf
然后把需要的库文件上传到 /data/mysql-5.7.21-linux-glibc2.12-x86_64/lib 目录下。

# chmod +x libc-2.14.so libstdc++.so.6.0.20
# ldconfig 重载,系统会给库文件自动创建软连接
# mysqlbinlog5.7 -V
mysqlbinlog5.7: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /data/dmx/mysql-5.7.21-linux-glibc2.12-x86_64/lib/libstdc++.so.6) 报错发生了变化,
echo $LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/data/mysql-5.7.21-linux-glibc2.12-x86_64/lib
并将 LD_LIBRARY_PATH 写到 /etc/profile :
export LD_LIBRARY_PATH=/data//mysql-5.7.21-linux-glibc2.12-x86_64/lib
source /etc/profile
但是这个方法需要退出bash,重新登录,对于consul等一些监控程序不友好。

5. 使用简介
先创建一张表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
注意:执行恢复时不能加 -v、--base64-output=decode-rows 等参数,否则binlog中的语句不会被执行。
另外,如果遇到:ERROR 1782 (HY000) at line 13: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.
需要加上 --skip-gtids 参数, mysqlbinlog mysql-bin.001024 -B --start-position=908 --stop-position=1156 --skip-gtids | mysql
6. Flashback工具使用注意点
- binlog日志格式必须是ROW格式:binlog_format = row ;
- 一个事务中的DML语句不仅会逆向转换,并且语句顺序也会发生颠倒;
- 只支持 insert、update、delete , 不支持drop 、truncate、alter等DDL语句。
MySQL Flashback 闪回功能详解的更多相关文章
- oracle 闪回功能详解
Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前 ...
- Oracle闪回技术详解
概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速 ...
- oracle闪回表详解
--- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...
- MySQL数据库表分区功能详解
1.什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 ...
- MySQL日志功能详解
MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...
- MySQL的用户密码过期功能详解
MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...
- binlog2sql之MySQL数据闪回实践
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- MySQL数据类型以及基本使用详解
MySQL数据类型以及基本使用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL服务器的主要组件 我们知道MySQL的主要组件主要是由服务端(mysqld)和客户端 ...
随机推荐
- Asp.NET中把DataTable导出为Excel ,中文有乱码现象解决办法
//DataTable为要导出的数据表 DataGrid dg = new DataGrid(); dg.DataSource = DataTable; ...
- tornado+nginx上传视频文件
[http://arloz.me/tornado/2014/06/27/uploadvideotornado.html] [NGINX REFRER:Nginx upload module] 由于to ...
- android MVP模式简单介绍
原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...
- 小度wifi在window server2008R2系统下创建不了
小度wifi在window server2008R2系统下创建的时候会一直显示正在创建,然后又消失的情况.这是因为win server 2008下默认的无线lan服务没开启 解决方法: 在“服务管理器 ...
- iOS App 内部跳转(设置、Wifi、蓝牙...)关键词
1.iOS 10 以前: 蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID Wi-Fi:prefs:root=WIFI 定位服务:prefs:root=LOCATION_ ...
- 【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT
Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向 ...
- 洛谷P2287 [HNOI2004]最佳包裹(三维凸包)
题面 传送门 题解 左转板子,调个精度就能\(A\)了 //minamoto #include<bits/stdc++.h> #define R register #define fp(i ...
- Python实现——决策树实例(离散数据/香农熵)
决策树的实现太...繁琐了. 如果只是接受他的原理的话还好说,但是要想用代码去实现比较糟心,目前运用了<机器学习实战>的代码手打了一遍,决定在这里一点点摸索一下该工程. 实例的代码在使用上 ...
- 利用EFCore 封装Repository(可扩展不同数据的sql操作)
本篇是对EFCore 进行下封装并实现基本的增删改查的同步异步方法及针对不同数据库的批量插入.sql语句直接操作数据库: 一. 先定义基础仓储接口IRepository public interfac ...
- WebStorm ES6 语法支持设置和ES6语法的JS文件编译为ES5语法文件
ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...