MySQLFlashback闪回功能详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MySQLFlashback闪回功能详解
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 :,并将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,下载链接:
[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⽉609:30 libstdc++.so.6 -> libstdc++.so.6.0.20
-rwxr-xr-x. 1 root root 987096 7⽉192013 libstdc++.so.6.0.13
-rw-r--r-- 1 root root 1011824 4⽉609:28 libstdc++.so.6.0.20
lrwxrwxrwx. 1 root root 19 1⽉1412: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库⽂件。

下载链接:
# 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
注意: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 具有更⾼效的闪回效果,项⽬地址:。

相关文档
最新文档