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.: 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. /usr/lib64/
[root@centos64-slave1 ~]# cd /usr/lib64/
[root@centos64-slave1 lib64]# mv libstdc++.so. libstdc++.so.6_bak
[root@centos64-slave1 lib64]# ln -s libstdc++.so.6.0. libstdc++.so.
[root@centos64-slave1 lib64]# ll libstdc*
lrwxrwxrwx root root 4月 : libstdc++.so. -> libstdc++.so.6.0.
-rwxr-xr-x. root root 7月 libstdc++.so.6.0.
-rw-r--r-- root root 4月 : libstdc++.so.6.0.
lrwxrwxrwx. root root 1月 : libstdc++.so.6_bak -> libstdc++.so.6.0.
安装完后执行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. /lib64/libc.so.6_bak
# LD_PRELOAD=/lib64/libc-2.14.so ln -s /lib64/libc-2.14.so /lib64/libc.so.
# strings /lib64/libc.so. | 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. -V #该命令已经集成到系统环境变量,可以直接调用
mysqlbinlog5.: /usr/lib64/libstdc++.so.: 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.
# ldconfig 重载,系统会给库文件自动创建软连接
# mysqlbinlog5. -V
mysqlbinlog5.: /lib64/libc.so.: version `GLIBC_2.' 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.-linux-glibc2.-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
### @= /* SHORTINT meta=0 nullable=1 is_null=0 */
### @='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
### @= /* SHORTINT meta=0 nullable=1 is_null=0 */
### @='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= --stop-position= mysql-bin. | mysql -uroot -p
注意:MySQL5.7版本执行恢复时不能加 --base64-output=decode-rows 参数,-v 参数可以加,否则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语句。
附
美团点评又出了另一款闪回工具MyFlash,据说比 mysqlbinlog 具有更高效的闪回效果,项目地址:https://github.com/Meituan-Dianping/MyFlash
MySQL flashback 功能的更多相关文章
- MySQL Flashback 闪回功能详解
1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带wh ...
- MySQL Flashback 工具介绍
MySQL Flashback 工具介绍 DML Flashback 独立工具,通过伪装成slave拉取binlog来进行处理 MyFlash 「大众点点评」 binlog2sql 「大众点评(上海) ...
- oracle flashback功能
2). 检查Flashback 功能, 缺省时功能是关闭的. SQL> select name, current_scn, flashback_on from v$database; NAME ...
- MySQL日志功能详解
MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...
- mysql分区功能(三个文件储存一张表)(分区作用)(分区方式)
mysql分区功能(三个文件储存一张表)(分区作用)(分区方式) 一.总结 1.mysql数据表的存储方式(三个文件储存一张表): 一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放 ...
- Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中
一.开启MyS远程访问功能 1.进入服务器输入netstat -an | grep 3306确认3306是否对外开放,MySQL默认状态下是不对外开放访问功能的.输入以上命令之后如果端口没有被开放就会 ...
- 使用mysql profiling功能剖析单条查询
5.1版本开始引入show profile剖析单条语句功能,支持show profiles和show profile语句,参数have_profiling;控制是否开启: 查看是否支持这个功能(查询为 ...
- PHP - PDO 之 mysql 事务功能
<?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...
- mysql分区功能详细介绍,以及实例
一,什么是数据库分区 前段时间写过一篇关于mysql分表的 的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下 ...
随机推荐
- nginx.conf完整配置实例
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; ...
- 【排序算法】快速排序算法 Java实现
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 基本思想 先从数组中找出一个数作为基 ...
- Matlab将三维变量分割为多个二维变量的方法
最近在处理 Matlab 中的三维矩阵的时候,遇到了一个问题: 假如m 为 5*5*5的矩阵,如果以第三个维度为基础,分割为5个不同的矩阵 m1,m2,m3,m4,应该如何解决? 解决方法:eval函 ...
- 每天一个linux命令(26)--用SecureCRT来上传和下载文件
用SSH管理Linux 服务器时经常需要远程与本地之间交互文件,而直接使用 SecureCRT 自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmod ...
- Unity播放Gif动画
Unity目前对图形图像的支持还不是很完善,支持的图形文件格式有 PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT等,但却不支持Gif动画.但是经过查阅资料发 ...
- 知识管理(KM) - 数据流
快速链接: 人力资源知识体系索引 本章主要列出知识管理(KM)中涉及到的所有表. 步骤 操作 相关表 说明 1 知识管理资料 基础资料,见附表1 2 知识主题(107301) KMBlg:主题 K ...
- C#中运算符的应用
c#中的运算符(只说我自己熟悉和常用的)一.算数运算:加 +减 -乘 *除 / (整型的除法是不算小数点的,也就是说结果是整数,余数舍去了,求余数看下面)求余数 % 加减乘好理解,整型的除法和求余数因 ...
- Jmeter+Badboy实战经验三 Jmeter关联相关知识
1. 什么时候需要使用关联? 有些参数是动态变化的,获取之后,再次操作的时候,参数的值已经发生了变化,这种情况下就会出现脚本不可运行的问题,就需要用到了关联 2. 关联是什么概念? 3.jmeter ...
- MATLAB(5)——生成归一化直方图
作者:桂. 时间:2017-03-10 22:13:36 链接:http://www.cnblogs.com/xingshansi/p/6533579.html 声明:欢迎转载,不过记得注明出处哦~ ...
- node c++多线程插件构想
最近想写一个node的c++插件实现线程.提供的api使用回调并进行二次包装使其返回一个promise,并且要求需要在工作线程里执行的函数为async函数.如果是node7.0以下的版本,函数必须返回 ...