生产环境中我们有必要get到一些dba技能,在危急时刻能对误操作实现回滚。
没记错的话mysql开源版是不支持flashback的,商业版应该有。flashback最早由阿里云在mysql5.5实现了该功能,并将其开源然后提交给了MariaDB,目前MariaDB应该已经自带了flashback功能。
环境:
centos6.10
mysql5.7
基于gtid的主从读写分离架构
我这里用的是”美团网”目前正在使用的flashback,配置需要升级glibc,glibc是操作系统底层api,如果不会操作请谨慎。”唯品会”内部也开源了一个工具,直接提供二进制包供使用,有兴趣的自行查找。
用的时候自己注意几点:
- flashback仅适用于DML语句,不支持DDL语句。
- binlog日志格式必须是row,这里是我们线上的默认配置,如果你是mixed/statement请自己改
- 支持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也可以实现回滚,对事物语句工具可以自己按顺序把你执行的命令倒序过来。
最新评论
世间因为有你而美丽!我也一直想当个志愿者,奈何身体不允许
告诉那小孩 叫哥哥
666
123
此时此刻,感慨万千,旧的一年已经过去,新的一年已经到来,展望未来,美好的日子正等 着我们去奋斗,愿在新的一年里,我们能够继续经受住考验,克服困难,春暖花开
智能插座都是扯,插座还是公牛好用
下载链接失效了 求补
连接失效了