mysql有闪回吗_【赵强老师】MySQL的闪回

![](https://oscimg.oschina.net/oscnet/up-3ab312d1fb0fcbc300d5e1788a9ddf52830.JPEG)

MySQL DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚。传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据。此法费时费力,甚至需要停机维护,并不适合快速回滚。也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能。MySQL闪回(flashback)利用binlog直接进行回滚,能快速恢复且不用停机。

# 闪回的原理

MySQL binlog以event的形式,记录了MySQL server从启用binlog以来所有的变更信息,能够帮助重现这之间的所有变化。MySQL引入binlog主要有两个目的:一是为了主从复制;二是某些备份还原操作后需要重新应用binlog。有三种可选的binlog格式,各有优缺点:

– statement:基于SQL语句的模式,binlog数据量小,但是某些语句和函数在复制过程可能导致数据不一致甚至出错;

– row:基于行的模式,记录的是行的完整变化。很安全,但是binlog会比其他两种模式大很多;

– mixed:混合模式,根据语句来选用是statement还是row模式;

利用binlog闪回,需要将binlog格式设置为row。利用下面的语句可以查看当前binlog的模式。

“`sql

show global variables like “%binlog_format%”;

“`

![](https://oscimg.oschina.net/oscnet/up-3f48c862b8f187be1cdd9a932c8fe9241c3.png)

# 闪回的实战

真实的闪回场景中,最关键的是能快速筛选出真正需要回滚的SQL。我们使用开源工具binlog2sql来进行实战演练。binlog2sql由美团点评DBA团队(上海)出品,多次在线上环境做快速回滚。

## ① 安装binlog2sql工具

“`

首先安装Python工具管理表pip

yum -y install epel-release

yum -y install python-pip

安装binlog2sql

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql

pip install -r requirements.txt

“`

## ② 闪回案例实战

1、我们使用之前的员工表数据,单独建立一个数据库

“`

create database testflashback;

use testflashback;

source /root/tools/scott.sql

“`

2、误操作,执行下面的事务。

“`

start transaction;

delete from emp where sal>3000;

update emp set sal=6000;

delete from emp where job=’CLERK’;

commit;

“`

3、查看目前的binlog文件

“`

show master logs;

“`

![](https://oscimg.oschina.net/oscnet/up-fb49ca39e9cb25d24dfbf1341ab64cc66b7.png)

4、最新的binlog文件是mysql-binlog.000001。我们的目标是筛选出需要回滚的SQL,由于误操作人只知道大致的误操作时间,我们首先根据时间做一次过滤。只需要解析testflashback库emp表。(注:如果有多个sql误操作,则生成的binlog可能分布在多个文件,需解析多个文件)

“`

python binlog2sql/binlog2sql.py -uroot -pWelcome_1

–start-file=’mysql-binlog.000001′ > /root/tools/raw.sql

“`

上面的语句将列车emp表的所有binlog日志。如果能够确定大致的时间范围,可以使用参数–start-datetime和–stop-datetime进行过滤。例如:

“`

–start-datetime=’2016-12-26 11:44:00′ –stop-datetime=’2016-12-26 11:50:00′

“`

解析处理的binlog如下:

![](https://oscimg.oschina.net/oscnet/up-ac5bd80b5122b8891f60ad66804ca432cd8.png)

5、根据位置信息,我们确定了误操作sql来自同一个事务,准确位置在14956-16791之间(binlog2sql对于同一个事务会输出同样的start position)。再根据位置过滤,使用 -B 选项生成回滚sql,检查回滚sql是否正确。(注:真实场景下,生成的回滚SQL经常会需要进一步筛选。结合grep、编辑器等)

“`

python binlog2sql/binlog2sql.py -uroot -pWelcome_1 –start-file=’mysql-binlog.000001′

–start-position=14956 –stop-position=16791 -B > /root/tools/rollback.sql

“`

下面是生成的闪回语句:

![](https://oscimg.oschina.net/oscnet/up-96a7a3c8f9aec833785b1c795f349c67336.png)

6、与业务方确认回滚sql没问题,执行回滚语句。登录mysql,确认回滚成功。

“`

mysql -uroot -pWelcome_1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值