关于mysql:赵强老师MySQL的闪回

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的模式。

show global variables like "%binlog_format%";

闪回的实战

实在的闪回场景中,最要害的是能疾速筛选出真正须要回滚的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;

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如下:

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

上面是生成的闪回语句:

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

mysql -uroot -pWelcome_1 < /root/tools/rollback.sql

7、检查数据是否复原

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理