MySQL Flashback拯救手抖党

2023-11-12

MySQL Flashback拯救手抖党

2019-06-12 黄子程

 

黄子程

 

黄子程,网易游戏资深运维工程师,曾参与多款网易代理游戏产品的运营维护工作,后逐渐转向数据库管理维护领域。目前主要工作方向为网易游戏 Relational DBaaS 的后台功能开发和数据库管理维护,在 MySQL 性能调优、故障诊断等方面有丰富的实战经验,爱好学习开发和数据库内核技术知识,致力于成为一名了解业务、熟悉开发的 DBA。

 

Outline

  1. 简单介绍:在 mysql 中 binlog 的功能,flashback 介绍,在 MySQL 业界现有的 flashback 的几种实现。

  2. 着重讲解:  flashback 的代码实现细节

  3. 延伸介绍:对比一下其他 DB 如 MariaDB、Oracle、TiDB 等的数据回滚

  4. 延伸思考:flashback 真的 flash 吗?回滚需要注意些什么?

一、简介:MySQL binlog 与 flashback

 

MySQL 的 Flashback 功能最初是由淘宝彭立勋在大概 7 年前并实现的一个很强劲的作品,起初他在 2012 年提交到 Feature Request 到官方 Oracle MySQL 团队的,点击链接可见目前信息仍大都停留在了 2012 年。直至今年稍早时候,又有其他开发者重新提出希望实现这个 feature 的声音。

另一边厢, MariaDB 分支从 10.2.4 版本开始支持 Flashback 功能,起初我们曾尝试使用 MariaDB 版的 mysqlbinlog 来直接实现回滚功能,但无奈经过我们的测试发现由于两个分支的一些实现不同(如 JSON 字段),使用 MariaDB 分支的 mysqlbinlog 工具来解析 MySQL 分支的 binlog 文件会出现错误。

因此为实现这一轻快方便的重要功能,网易游戏数据库团队,在参考前人设计思想(彭立勋,MySQL 下实现闪回的设计思路,美团 MyFlash 闪回工具等等)以及 MariaDB 分支源代码的基础上,自行将这一套 FLASHBACK  Patch 移植到网易游戏自有的 MySQL 代码中去,目前在日常测试和各项应用均表现出色。

本文则着重为各位读者讲解数据库团队在实现 FLASHBACK 上所做的事情,一说就要说彻底,因此我们从最底层的概念科普开始。

1、binlog 是什么, flashback 又是什么鬼?

Whenever the master's database is modified, the change is written to a file, the so-called binary log, or binlog. This is done by the client thread that executed the query that modified the database.

binlog 是 MySQL sever 层维护的一种二进制日志,其主要是用来记录对 MySQL 数据更新或潜在发生更新的 SQL 语句,并以「事务」的形式保存在磁盘中。可以简单将 binlog 理解成为记录数据变更的日志。

有了解 MySQL 或者阅读过 MySQL 数据同步机制介绍的童鞋应该对上面这张数据同步的经典图例不陌生,Binlog 的其中一个重要作用就是用于主从间的数据同步。此外,由于 Binlog 记录的是数据的变更,因此 Binlog 在很多场景中也被用于数据恢复。我们今天谈论的主角 Flashback 也正是基于此。

Flashback 按字面理解是闪回,即将数据回滚到某个时刻的「状态」,市面上现有的 MySQL flashback 工具,均是基于 binlog 这种数据修改日志 ,对数据再次进行与原有的修改相反的操作,从而实现将数据回滚到某个时刻的「状态」。

Note: 当前的 flashback 实现上仅考虑针对 DML 的回滚,针对 drop table/database 等 DDL 暂无法实现(思考为什么?下面详述 binlog 格式会给出相关答案)。

下面给一个简单的 flashback 实现图形举例: 

如上图,假设一个学生表有如下操作,在 10:01 分只有 Tony 和 Lucy 两个学生,在 10:05 分新增 Lee 学生,在 10:10 该 Lee 学生年龄被 update 为 33 岁,在 10:15 分从表中删除该 lee 学生。

假设 10:15 分之后没有任何其他数据变更操作,业务在 10:16 发现该删除是误操作,希望将表数据恢复至 10:05 分的状态,那么我们的数据回滚方案即是反转原有的数据操作,并逆序执行:先将该 LEE 学生 INSERT 回表中(此时该学生年龄为 33 岁),再执行 update 操作,将该学生年龄从 33 岁变更为 23 岁。完成这两部操作之后,数据即回滚到 10:05 的状态了。

2、当前 MySQL 业界的几种 flashback 实现

  • mysqlbinlog 工具配合 sed、awk:先将 binlog 解析成类 SQL 的文本,再使用 sed、awk 把类 SQL 文本转换成真正的 SQL,同时实现语句的翻转。

    • 优点:当 SQL 中字段类型比较简单时,可以快速生成需要的 SQL ,且编程门槛也比较低。

    • 缺点:需要考虑极其复杂的转义等情况,出错概率很大。事实上基本也不会有人这么干的了

  • 直接使用 MariaDB 的 mysqlbinlog 工具,该工具已支持 flashback

    • 优点:「官方」出品;直接使用

    • 缺点:由于部分功能的实现不同(例如JSON字段的实现),容易出现不兼容原生 MySQL 的 binlog 文件的情况:目前已知的是使用 MariaDB 的 mysqlbinlog 工具对原生 MySQL server 产生的 binlog 中带有 json 字段则会解析失败

  • 基于业界开源的 binlog 解析库(python-mysql-replication)进行二次开发,直接实现回滚 SQL 的构造,优秀代表是美团点评团队:binlog2sql

    • 优点:使用现成解析库方便就手,信手拈来,上手难度低

    • 缺点:实现上受制于开源库提供的功能,运行效率低,需要使用开源解析库,将 binlog 解析成文本,再操作文本回滚

  • 自行开发工具对 binlog 文件进行解析与修改:优秀代表同样是美团点评团队在2017年开源的MyFLash

    • 优点:binary 层面的操作,只须关注 binlog 格式与字段类型计算,对于数据库的代码重构不敏感,只要 binlog 版本不变,则不需要大改

    • 缺点:实现上只适配了 v4 版本的 binlog 格式,不能解析 v4 以前的老版本;由于不能复用 binlog 解析代码,需要处理 binlog 中复杂的字段大小关系

  • 给源码打 patch:直接修改源码扩展 mysqlbinlog 工具的功能,增加 Flashback 的选项操作。

    • 优点:复用了server 层中 binlog 解析代码,因此无须关心复杂的字段类型;能够结合使用到 mysqlbinlog 原有的一些过滤选项

    • 缺点:需要对 mysql 的复制代码结构和细节需要有较为清晰深入的理解;改动的代码分布在 MySQL 的各个文件和函数中,MySQL 版本更新有可能需要重新对 patch 进行适配

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL Flashback拯救手抖党 的相关文章

  • 指针和数组笔试题解析【下篇】

    文章目录 6 指针笔试题 6 1 试题 1 6 2 试题 2 6 3 试题 3 6 4 试题 4 6 5 试题 5 6 6 试题 6 6 7 试题 7 6 8 试题 8 6 指针笔试题 6 1 试题 1 下面代码输出的结果是什么 int m
  • 数学建模国赛论文latex代码汇总

    目录 一 写在前面的话 二 latex环境安装和编辑器的选择 三 基础配置 写作环境 中文支持 页面设置 分级目录 四 数学公式 方程 矩阵编写与特殊符号的输入 五 三线表的输入 六 图片和参考文献的插入 七 最后附上完整配置代码 一 写在
  • Java的jdk安装教程:

    一 jdk安装流程 1 从官网下载jdk https www oracle com java technologies downloads 2 进入官网 3 选择需要的版本 4 下载后 双击安装 二 配置环境变量 1 桌面右键计算机点击属性
  • 利用Audacity软件分析ctf音频隐写

    分析音频得到摩斯电码 看波的宽度分辨长短音 比较细的就是短音 代表 比较粗的就是长音 代表 中间的间隔就是 得到摩斯电码
  • unity点击场景内物体进行交互

    提示 本文展示点击事件 另有其他自行研究 前言 一 原理 二 使用步骤 1 使用前提 2 使用脚本 总结 前言 很多情况下我们需要对场景内的物体进行交互 今天我们采用射线检测的方法进行点击 例如 点击场景内的Cube 进行开始旋转 提示 以
  • 宏DECLARE_DYNCREATE与DECLARE_DYNAMIC

    一 作用 DECLARE DYNCREATE的主要作用 支持对象的动态创建 使用 DECLARE DYNCREATE 宏声明的类可以在运行时动态创建对象 支持对象的序列化 MFC框架提供了对象的序列化支持 允许将对象的状态保存到磁盘 序列化
  • VS2010编译QT4.8.4遇到“LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 “问题

    在用VS编译qt时候很少有人遇到如上所示问题 因此当我遇到时很不幸的找不到对应的解决办法 相关的国内外网站资料没有少折腾可都不行 还有的说修改项目属性 但这种方法只适合对具体的项目就行修改 在编译qt的时候就丈二和尚摸不着头脑 下面就介绍一
  • 分页显示该休矣

    当你有很多东西要显示给用户 而且内容多得远非一个屏幕可以放得下的时候 你会怎么办 很自然 你会想到分页 在2007年 Vitaly Friedman写了一篇文章叫 Pagination Gallery ExamplesAnd Good Pr
  • 【android】数据库升级完整解决方案

    作者 飞翔的猫咪 http flyingcat2013 blog 51cto com 7061638 1537074 原创作品 允许转载 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 http flyin
  • 如何计算c++中开数组中占的内存

    如何计算c 中开数组中占的内存 引入 在比赛中一般都会有数组的身影 但是比赛时内存是一定的 若是操作不当 那么正解也会被数组而拖累 可是如何确保自己的数组占的内存的呢 首先要知道你自己开数组是的类型是不一样的内存的 也就是说类型不一样 内存
  • Android Studio操作SQLite数据库简要示例

    Android Studio操作SQLite数据库 主要分三步 1 创建数据库及数据表 2 写数据库表 3 读数据库表 下面用例子进行介绍 我们做一个简单的登记用户名及电话号码并进行显示的例子 首先创建EmptyActivity工程Test
  • [深入研究4G/5G/6G专题-34]: URLLC-5-《中国联通5G URLLC技术白皮书3.0版本》解读-1-业务场景

    目录 第1章 背景与URLLC的发展历程 1 1 URLLC的应用场景 1 2 URLLC的业务特点 第2章 URLLC的业务需求
  • 南京邮电大学操作系统复试

    目录 第 1 章 计算机系统概述 多道运行的特征 第 2 章 进程与线程 2 1 进程与线程 1 进程与程序 2 PID Process ID 进程ID 3 PCB Process Control Block 进程控制快 4 进程的特征 5
  • 【NAS工具箱】Pytorch中的Buffer

    Parameter 模型中的一种可以被反向传播更新的参数 第一种 直接通过成员变量nn Parameter 进行创建 会自动注册到parameter中 def init self super MyModel self init self p
  • 垃圾收集器知识点4:Java中垃圾收集器的实现

    目录 java8垃圾收集器组合一览 serial GC 串行GC 的实现 串行gc日志分析 Minor GC 小型GC Full GC 完全GC Parallel GC 并行GC 的实现 并行GC日志分析 Minor GC 小型GC Ful
  • 第二十九章、containers容器类部件QFrame框架部件详解

    一 概述 容器部件就是可以在部件内放置其他部件的部件 在Qt Designer中可以使用的容器部件有如下 容器中的Frame为一个矩形的框架对象 对应类QFrame QFrame类是PyQt中带框架部件的所有类的基类 如菜单 进度条 Lab
  • SQLServer 数据加密解密:常用的加密解密(一)

    都是基本示例 更多参考官方文档 1 Transact SQL 函数 2 数据库密钥 3 证书 4 非对称密钥 5 对称密钥 sql view plain copy drop table EnryptTest create table Enr
  • Win10 WSL运行docker报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

    我安装的子系统是Ubuntu 1804 安装docker步骤如下 sudo apt update 更新软件源 sudo apt install y docker io 安装docker sudo usermod aG docker leo

随机推荐

  • 3个技术男搞恋爱版ChatGPT,估值10亿美元

    过去几个月 我们见证了GPT从3 5到4 0 从只能做结构化搜索整合到接近人类思维的对话 我们还看到了 GPT逐步掌握画画 写作 剪辑 制表 做 PPT 等技能 最可怕的是AI的迭代速度 简直是一天一个样 这股这股前所未有的技术浪潮 一时间
  • sklearn中的LogisticRegression

    sklearn中的逻辑回归接口如下 sklearn linear model LogisticRegression penalty l2 dual False tol 0 0001 C 1 0 fit intercept True inte
  • [专利与论文-14]:研究员级(正高)高级工程师评审不通过的常见原因(实际案例)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 专利与论文 14 研究员级 正高 高级工程师评审不通过的常见原因 实际案例 文火冰糖 王文兵 的博客 CSDN博客 作者主页 文火冰糖的硅基
  • 策略模式+工厂模式的使用

    在项目开发过程中 经常会遇到项目代码中充斥着大量的if else 每次增加类型都要整体代码逻辑看一遍才可以修改 如下代码 if wx equals type do else if zfb equals type do else if ban
  • JSONObject 与 JSON 互转

    使用目的 目前数据交互大多以 JSON 字符串为信息传输 主要格式有 age 22 name 李四 age 21 name 张三 最常见的应用场景是前后端对接 第三方平台文档对接 下面展示转换使用 一 引入 jar 此处引入 com ali
  • IMAU鸿蒙北向开发-2023年9月5日学习日志

    1 5种调试方式 1 1 Previewer 在侧边 Previewer 选项卡内可以预览Entry 如果要单独预览组件 可以在给组件加 Preview 装饰器 1 2 Local Emulator 本地模拟 1 3 Remote Emul
  • 测试框架pytest教程(6)钩子函数hook开发pytest插件

    pytest hook 函数也叫钩子函数 pytest 提供了大量的钩子函数 可以在用例的不同生命周期自动调用 比如 在测试用例收集阶段 可利用 hook 函数修改测试用例名称的编码 pytest的hook是基于Python的插件系统实现的
  • mac mini u盘安装系统_2020年mac系统下制作win10引导安装盘,亲测可用

    一 背景 最近组装了一台电脑 需要安装系统 由于家里只有一台Macbook pro 在网上找了很多关于mac环境下制作支持win10启动盘教程 尝试过下面几种方式都失败 即u盘插入后主板不会识别 无法自动安装 1 利用终端指令拷贝iso镜像
  • Linux提权之内核漏洞提权篇

    前言 在渗透过程中 有时利用某些漏洞可以获取一个低权限的用户 然后想办法提权 提升到root用户权限 从而控制整个系统 在获取到低权限shell后 通常会检查操作系统的发行版本 内核版本 老版本的系统可能会存在一些漏洞 于是我们可以利用这些
  • 点云处理,点云处理算法程序

    点云处理 算法程序代编 top5硕博团队 高质量的服务 基于pcl cgal程序代编 联系方式 q 958417691 或闲鱼id专业点云处理 1 点云分割 单木分割 林下地形提取 DEM制作 等高线制作 地形补洞 2 点云重建 多种方法点
  • H5页面调用扫一扫功能

    想要实现H5页面调用微信扫一扫功能 必须先了解微信JS SDK接口 企业号开发接口文档地址 https qydev weixin qq com wiki index php title E9 A6 96 E9 A1 B5 我们来看下使用的大
  • 将任意一个数解析为2的幂的和的方法

    将任意一个数解析为2的幂的和的方法 递归 规律 如给定 14 2 3 lt 14 lt 2 4 14中必有8 2 3 14 8 6 2 2 lt 6 lt 2 3 6中必有4 2 2 6 4 2 2 2 14 2 3 2 2 2 1 Par
  • 第36.1节 动画-刚体动画控制

    目录 本节功能 具体实现 存放动画 寻找动画 播放 暂停 复位 加速 减速 最后用一个事件响应来联接这一切 所有代码 本节功能 本节后几个章节会介绍和动画有关的课程 本节实现一个从3DMAX导出的地板破碎的动画的控制 这类动画叫做刚体动画
  • python对两个list取交集、并集、和异或

    第一种方法 使用python基本数据结构set集合 优点 集合运算长度可以不一致 运算效率高 缺点 两个进行运算的集合中不能够含有重复的元素 如果含有的话 转成set集合后 会自动去掉重复元素 a 1 2 3 b 1 2 6 9 12
  • MyBatis-Plus&Druid数据源理解

    SpringBoot集成MyBatis Plus 1 1MyBatis Plus简介 MyBatis Plus 简称 MP 是一个 MyBatis 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 1 12
  • Unity(Input.GetAxis和Input.GetAxisRaw)

    Input GetAxis 描述 数值返回是慢慢向上加的 1 gt 0 3 gt 1 类似于车慢慢加速的过程 Input GetAxisRaw 描述 数值返回是固定的是 1 gt 0 gt 1
  • undo表空间出现问题的几种情况与处理

    undo空间出现问题的处理 一 数据库正常关闭immediate或normal 创建pfile并使用pfile启动数据库 startup nomount create pfile from spfile shutdown abort sta
  • 【python】实现list除以一个数

    文章目录 新建一个list 存放数据 使用numpy np divide list如何除以一个数 有如下两种方法 import random my list random randint 0 100 for x in range 10 pr
  • mysql 页和叶子页_一看就懂的:MySQL数据页以及页分裂机制,别在说不会了

    下面我们就一起看下 究竟什么是MySQL的数据页 数据区等概念 二 数据页长啥样 数据页长下面这样 image png 三 什么是数据区 在MySQL的设定中 同一个表空间内的一组连续的数据页为一个extent 区 默认区的大小为1MB 页
  • MySQL Flashback拯救手抖党

    MySQL Flashback拯救手抖党 2019 06 12 黄子程 黄子程 黄子程 网易游戏资深运维工程师 曾参与多款网易代理游戏产品的运营维护工作 后逐渐转向数据库管理维护领域 目前主要工作方向为网易游戏 Relational DBa