如何高效的flashback闪回

生产环境中我们有必要get到一些dba技能,在危急时刻能对误操作实现回滚。

没记错的话mysql开源版是不支持flashback的,商业版应该有。flashback最早由阿里云在mysql5.5实现了该功能,并将其开源然后提交给了MariaDB,目前MariaDB应该已经自带了flashback功能。

环境:
centos6.10
mysql5.7
基于gtid的主从读写分离架构

我这里用的是”美团网”目前正在使用的flashback,配置需要升级glibc,glibc是操作系统底层api,如果不会操作请谨慎。”唯品会”内部也开源了一个工具,直接提供二进制包供使用,有兴趣的自行查找。

用的时候自己注意几点:

  1. flashback仅适用于DML语句,不支持DDL语句。
  2. binlog日志格式必须是row,这里是我们线上的默认配置,如果你是mixed/statement请自己改
  3. 支持mysql5.6/mysql5.7,不支持mysql8.0

首先我们来创建测试数据库、表、记录:

create database testdb;
create table lijian(name char(3), level int(3));
insert into lijian values("lijian1",1024);
insert into lijian values("lijian2",1024);

创建完毕,我们记录下大致时间:
date
Thu Sep 20 02:10:09 CST 2018

对数据进行回滚操作,支持时间、post位置、gtid回滚,对大文件也支持分片回滚,我这里按时间段作为flashback的标准:

flashback --binlogFileNames=bin.000028 --outBinlogFileNameBase=bin.000028.flashback --start-datetime='2018-09-20 02:00:00' --stop-datetime='2018-09-20 02:10:09'

指定数据库回滚:

flashback --binlogFileNames=bin.000028 --databaseNames=testdb --outBinlogFileNameBase=bin.000028.flashback --start-datetime='2018-09-20 02:00:00' --stop-datetime='2018-09-20 02:10:09'

指定表回滚:

flashback --binlogFileNames=bin.000028 --databaseNames=testdb --tableNames=lijian --outBinlogFileNameBase=bin.000028.flashback --start-datetime='2018-09-20 02:00:00' --stop-datetime='2018-09-20 02:10:09'

回滚指定类型DML语句,这里筛选insert和update的操作:

flashback --binlogFileNames=bin.000028 --databaseNames=testdb --tableNames=lijian --sqlTypes=INSERT,UPDATE --outBinlogFileNameBase=bin.000028.flashback --start-datetime='2018-09-20 02:00:00' --stop-datetime='2018-09-20 02:10:09'

大文件切片,按1M切割分片回滚:

flashback --binlogFileNames=bin.000028 --databaseNames=testdb --tableNames=lijian --sqlTypes=INSERT,UPDATE --maxSplitSize=1 --outBinlogFileNameBase=bin.000028.flashback --start-datetime='2018-09-20 02:00:00' --stop-datetime='2018-09-20 02:10:09'

执行完毕之后,目录下会对应生成bin.000028.flashback文件,接着把flashback闪回文件重新执行到库里:
注意这里如果是gtid方式主从架构记得添加–skip-gtids参数

mysqlbinlog --skip-gtids bin.000028.flashback | mysql

如果flashback文件做了切割,需要依次

mysqlbinlog --skip-gtids bin.000028.flashback.000001 | mysql
mysqlbinlog --skip-gtids bin.000028.flashback.000002 | mysql
mysqlbinlog --skip-gtids bin.000028.flashback.000003 | mysql
mysqlbinlog --skip-gtids bin.000028.flashback.00000x | mysql

如果在执行之前想看看flashback文件的内容:

mysqlbinlog --skip-gtids --base64-output=decode-rows -v binlog_output_base.flashback >output_flashback.sql

到这就对insert、update类型的DML语句flashback成功了,还有delete也可以实现回滚,对事物语句工具可以自己按顺序把你执行的命令倒序过来。

原创文章,作者:lijian,如若转载,请注明出处:https://www.lijian.me/79.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:root#lijian.me(把#改为@)