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
mysql有闪回吗_【赵强老师】MySQL的闪回相关推荐
- 视频教程-赵强老师:Oracle数据库从10g到11g(16)闪回-Oracle
赵强老师:Oracle数据库从10g到11g(16)闪回 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblogic)和大数 ...
- oracle 锁表如何查看_【赵强老师】第一个Oracle的手工备份和恢复
欢迎关注赵强老师微信公众号:myitshare 一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子 ...
- hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题
欢迎关注赵强老师微信公众号:myitshare 一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你 ...
- oracle select 行数据_【赵强老师】什么是Oracle的数据字典?
欢迎关注赵强老师微信公众号:myitshare 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一 ...
- redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅
欢迎关注赵强老师微信公众号:myitshare Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向 ...
- 赵强老师:Oracle数据库系列课程(12)管理数据库的存储结构与数据的并发-赵强老师-专题视频课程...
赵强老师:Oracle数据库系列课程(12)管理数据库的存储结构与数据的并发-82人已学习 课程收益 从零开始学习Oracle数据库,让学员读整个Oracle数据库有个全面清除的认识和学习. ...
- 视频教程-赵强老师:大数据从入门到精通(23)配置Hive On Spark-Spark
赵强老师:大数据从入门到精通(23)配置Hive On Spark 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblogi ...
- 赵强老师免费公开课第一季:Hadoop的背景起源
标签:免费直播课 Hadoop 大数据 赵强 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://51edu.blog.51cto.c ...
- 【赵强老师】MapReduce编程案例之求工资总额
先看视频. [赵强老师]MapReduce编程案例之求工资总额 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上, ...
- 【赵强老师】大数据平台的整体架构
先看视频. [赵强老师]大数据平台的整体架构 大数据平台中的主要组件,如下: HDFS(Hadoop分布式文件系统) 源自于Google的GFS论文,发表于2003年10月,HDFS是GFS的山寨版. ...
最新文章
- java输出流输入流的使用_Java中的IO流之文件输入输出流
- Android系统所有版本源码Kernel源码
- 运算符重载 返回类型说明符后加_Java学习:运算符的使用与注意事项
- 为什么祖国没有农历生日? | 今日最佳
- mysql python 中文_python操作mysql中文显示乱码的解决方法
- mysql lock trx id_MySQL中RR模式下死锁一例
- 设备描述符请求失败_如果用户发出过多请求 苹果将取消Apple ID帐户恢复
- LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)
- python用户登录界面设计_python如何做一个登录注册界面
- sniffer超级详细介绍
- MongoDB 后台创建索引、查看创建进度等
- TalkingData Ad Tracking开启反作弊模式
- 2020年中国干旱灾害受灾面积、饮水困难人口数量及造成经济作物损失分析[图]
- 丢番图生平编程java_丢番图与麦乐鸡购买问题
- 平面设计中的插画设计技巧
- ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议
- 抖音小程序Tiktok教程之 01 编写您第一个hello world程序(含视频教程)
- 南电转债上市价格预测
- 防止域名被劫持的七种方法域名被劫持怎么办
- 【哈佛学习力8:创新思维】
热门文章
- 计算机等级考试oracle,用spt更新ORACLE
- 图标圆角角度_教你在 iOS 和 macOS 上获取 App 图标
- linux内核percpu变量声明,Linux内核对per-cpu变量的实现
- java序列不存在错误_java.sql.SQLException: ORA-02289: 序列不存在 已解决!
- 建筑电气工程设计常用图形和文字符号_电气设计绘图线宽是什么标准,需要遵循哪些基本原则?你知道吗?...
- 模块ntdll中出现异常eaccessviolation_SAP ERP软件中的物料凭证 MIGO
- c语言中函数的递归调用,用C语言函数调用与递归解决问题
- CSS Hacks / Conditional Comments For IE
- C++设计模式实现--职责链(Chain of Responsibility)模式
- Docker存储驱动之总览