MySQL Flashback 闪回功能详解

2023-11-17

1. 简介

mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据。在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos)。比如忘了带where条件的update、delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速、简单。

目前MySQL的flashback功能是利用binlog完成的,第一个实现该功能的是阿里云的彭立勋, 他在MySQL 5.5版本上就已实现,并将其提交给MariaDB。

 

2. 闪回原理

原理:flashback工具(-B 参数)可对rows格式的binlog可以进行逆向操作,delete反向生成insert、update生成反向的update、insert反向生成delete。

MySQL的binlog以event的形式,记录了MySQL中所有的变更情况,利用binlog我们就能够重现所记录的所有操作。

MySQL引入binlog主要有两个用途/目的:一是为了主从复制;二是用于备份恢复后需要重新应用部分binlog,从而达到全备+增备的效果。

MySQL的binlog有三种格式:

  • statement,基于SQL语句的模式,一般来说生成的binlog尺寸较小,但是某些不确定性SQL语句或函数在复制过程可能导致数据不一致甚至出错;
  • row,基于数据行的模式,记录的是数据行的完整变化。相对更安全,推荐使用(但通常生成的binlog会比其他两种模式大很多);
  • mixed,混合模式,可以根据情况自动选用statement抑或row模式;这个模式下也可能造成主从数据不一致。它属于MySQL 5.1版本时期的过渡方案,已不推荐使用了。

注意:使用mysqlbinlog flashback 工具必须设置:binlog_format = row

 

3. flashback安装

下载flashback工具 mysqlbinlog : https://pan.baidu.com/s/1c1Ub1x2,并将mysqlbinlog文件移至mysql安装路径的bin目录下(可备份原来的mysqlbinlog为mysqlbinlog_bak),执行mysqlbinlog --help命令,可能会报错(系统版本为 CentOS 6.4_x64):

[root@centos64-slave1 bin]# mysqlbinlog --help
mysqlbinlog: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mysqlbinlog)

需要安装新版本的libstdc++.so.6,下载链接:https://pan.baidu.com/s/1gfIarCn 

[root@centos64-slave1 ~]# cp libstdc++.so.6.0.20  /usr/lib64/
[root@centos64-slave1 ~]# cd /usr/lib64/
[root@centos64-slave1 lib64]# mv libstdc++.so.6 libstdc++.so.6_bak
[root@centos64-slave1 lib64]# ln -s libstdc++.so.6.0.20 libstdc++.so.6
[root@centos64-slave1 lib64]# ll libstdc*
lrwxrwxrwx  1 root root      19 4月   6 09:30 libstdc++.so.6 -> libstdc++.so.6.0.20
-rwxr-xr-x. 1 root root  987096 7月  19 2013 libstdc++.so.6.0.13
-rw-r--r--  1 root root 1011824 4月   6 09:28 libstdc++.so.6.0.20
lrwxrwxrwx. 1 root root      19 1月  14 12:25 libstdc++.so.6_bak -> libstdc++.so.6.0.13

安装完后执行mysqlbinlog --help,若报错:mysqlbinlog: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib64/libstdc++.so.6),需要更新/lib64库文件。下载链接:https://pan.baidu.com/s/1kViGrIZ

# tar zxvf  glibc-2.14.tar.gz
# cd glibc-2.14
# mkdir build
# cd build
# ../configure  --prefix=/opt/glibc-2.14
 ## 检查是否有问题。
# make  ## (4核可加-j4 ,8核可加-j8)
# make install
# strings libc.so | grep GLIBC   ## 这是我们需要的lib了,然后去更新系统的库
# cp libc.so  /lib64/libc-2.14.so
# mv /lib64/libc.so.6   /lib64/libc.so.6_bak
# LD_PRELOAD=/lib64/libc-2.14.so ln -s  /lib64/libc-2.14.so  /lib64/libc.so.6  
# strings /lib64/libc.so.6 | grep GLIBC 

安装完成后执行:

[root@centos64-slave1 ~]# mysqlbinlog -V
mysqlbinlog Ver 3.4-InnoSQL for Linux at x86_64
[root@centos64-slave1 ~]# mysqlbinlog --help |grep flashback
  -B, --flashback     Flashback data to start_postition or start_datetime.
  -E, --fb-event=name only flashback this type of
flashback                         FALSE

发现mysqlbinlog版本已变为3.4-InnoSQL(之前的版本为3.4),且多了一个 -B 参数,此参数即用于实现flashback功能。到此,mysqlbinlog已安装完成!

 

4. ldconfig 解决依赖库

上面我们介绍过了直接替换 /lib64 的软连接来解决 mysqlbinlog 的依赖问题,但是这样做对于系统来说有一定的风险性,这里采用 ldconfig 解决。ldconfig 是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享。

mysqlbinlog5.7 -V    #该命令已经集成到系统环境变量,可以直接调用
mysqlbinlog5.7: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mysqlbinlog5.7)

添加 MySQL的库环境到 ldconfig 配置文件:

echo "/data/mysql-5.7.21-linux-glibc2.12-x86_64/lib" >> /etc/ld.so.conf

然后把需要的库文件上传到  /data/mysql-5.7.21-linux-glibc2.12-x86_64/lib  目录下。

# chmod +x libc-2.14.so libstdc++.so.6.0.20 
# ldconfig  重载,系统会给库文件自动创建软连接
# mysqlbinlog5.7 -V
mysqlbinlog5.7: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /data/dmx/mysql-5.7.21-linux-glibc2.12-x86_64/lib/libstdc++.so.6)

报错发生了变化,
echo $LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/data/mysql-5.7.21-linux-glibc2.12-x86_64/lib
并将 LD_LIBRARY_PATH 写到 /etc/profile :
export LD_LIBRARY_PATH=/data//mysql-5.7.21-linux-glibc2.12-x86_64/lib
source /etc/profile
但是这个方法需要退出bash,重新登录,对于consul等一些监控程序不友好。

 

5. 使用简介

先创建一张表user,向user表中插入一条数据,查看binlog日志内容,可以找到刚才插入的记录:

# mysqlbinlog -vv mysql-bin.000004 

### INSERT INTO `test`.`user`
### SET
###   @1=30 /* SHORTINT meta=0 nullable=1 is_null=0 */
###   @2='Stephen Curry' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */

然后使用flashback工具(-B参数)查看binlog内容,可以找到刚才插入记录的逆向操作:

# mysqlbinlog -vv mysql-bin.000004 -B

### DELETE FROM `test`.`user`
### WHERE
###   @1=30 /* SHORTINT meta=0 nullable=1 is_null=0 */
###   @2='Stephen Curry' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */

同理,delete操作将会被转换为insert,update被转换为反向的update;若在一个事务中既有insert、update、delete语句,通过使用-B参数后,不仅三种DML语句完成了逆向转换,并且语句顺序也会发生颠倒。

在binlog中找到误操作的pos变化区间后,使用mysqlbinlog -B 恢复:

# mysqlbinlog -B --start-position=296 --stop-position=429 mysql-bin.000004 | mysql -uroot -p

 注意:MySQL5.7版本执行恢复时不能加 --base64-output=decode-rows 参数,-v 参数可以加,否则binlog中的语句不会被执行。

另外,如果遇到:ERROR 1782 (HY000) at line 13: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.

需要加上 --skip-gtids 参数, mysqlbinlog mysql-bin.001024 -B --start-position=908 --stop-position=1156 --skip-gtids | mysql

 

6. Flashback工具使用注意点

  • binlog日志格式必须是ROW格式:binlog_format = row ;
  • 一个事务中的DML语句不仅会逆向转换,并且语句顺序也会发生颠倒;
  • 只支持 insert、update、delete , 不支持drop 、truncate、alter等DDL语句。

 

美团点评又出了另一款闪回工具MyFlash,据说比 mysqlbinlog 具有更高效的闪回效果,项目地址:https://github.com/Meituan-Dianping/MyFlash 

 

转载于:https://www.cnblogs.com/waynechou/p/mysql_flashback_intro.html

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

MySQL Flashback 闪回功能详解 的相关文章

  • 昨晚做梦面试官问我三色标记算法

    本文已收录至GitHub 推荐阅读 Java随想录 微信公众号 Java随想录 原创不易 注重版权 转载请注明原作者和原文链接 文章目录 三色标记算法 增量更新 原始快照 某天 爪哇星球上 一个普通的房间 正在举行一场秘密的面试 面试官 我

随机推荐

  • Sql server 存储过程加密

    本方法可用于加密SQL存储过程 函数或者触发器 使用 WITH ENCRYPTION 选项 WITH ENCRYPTION 子句对用户隐藏存储过程的文本 例子 IF OBJECT ID N Pro Encrypt Test IS NOT N
  • PySide6-控件教程-005-QLabel标签控件-内边距、缩放、伙伴关系

    QLabel 标签控件 本文摘录自我的开源教程 PySide6 代码式教程 QLabel CSDN 平台仅做镜像 答疑 纠错请至 GitHub 提交 issue 内边距 QLabel还可以调整内边距 启用内容缩放 以更细致地调节显示效果 s
  • 与游戏世界交互作业

    一 编写一个简单的鼠标打飞碟 Hit UFO 游戏 游戏内容要求 游戏有 n 个 round 每个 round 都包括10 次 trial 每个 trial 的飞碟的色彩 大小 发射位置 速度 角度 同时出现的个数都可能不同 它们由该 ro
  • 如何将Python项目部署到新电脑上运行?

    如何将Python项目部署到新电脑上运行 在工作中 可能需要在新服务器上部署项目代码 例如新增服务器 把测试环境的代码部署到生产环境等 在生活中 也会遇到换新电脑 需要将自己在旧电脑上写的 项目 代码拷贝到新电脑上运行 本文将这个过程中的关
  • SSH版本信息可被获取漏洞解决方法CVE-1999-0634

    直接执行 cd etc touch ssh banner change echo Version is empty gt gt etc ssh banner change cd etc ssh cp sshd config sshd con
  • log4j漏洞复现

    第一步 下载marshalsec 源码进行编译 https github com mbechler marshalsec 下载后进行编译打包 mvn clean package DskipTests 得到jar文件 在这里插入图片描述 第二
  • Stable Diffusion 系列教程

    目录 1 提示词 基本的规则 2 提示词分类 2 1内容性提示词 2 2 画风艺术派提示词 2 3 画幅视角 2 4画质提示词 3 反向提示词 3 1 内容性反向提示词 3 2 画质性反向提示词 4 实例分析 5 权重 5 1 方法一 5
  • 无线传感网必知必会

    一 填空题 传感器网络三大基本要素 传感器 感知对象 用户 观测者 传感器节点的基本功能模块包括 数据采集模块 数据处理和控制模块 通信模块 供电模块 四个 其中 通信模块 能量消耗最大 传感器节点通信模块的工作模式有 发送 接收 空闲 睡
  • java七大排序——7_归并排序

    归并排序 将数组分为2块 再到每一小块再分为两块 直到最后一个元素为一块 然后进行有序数组合并 最终合并为一个有序数组 代码实现 public static void mergeSorts int array mergeSortsInter
  • 软件设计师--结构化开发

    结构化开发 耦合 真题 内聚 真题 设计原则 真题 系统文档 真题 数据流图 数据流图基本数据元素 外部实体 数据存储 加工 数据流 父图子图平衡 加工既要有输入数据流也要有输出数据流 数据守恒 真题 数据字典 真题 杂题精选 耦合 真题
  • [1051]python yagmail发邮件

    文章目录 安装 开通SMTP服务 常用邮箱host以及port yagmail 可以更简单的来实现自动发邮件功能 github项目地址 https github com kootenpv yagmail 安装 pip install yag
  • 备战金九银十: GitHub 上标星 46k+的《10 万字Java面试总结》,助你搞定面试官

    不论是校招还是社招都避免不了各种面试 笔试 如何去准备这些东西就显得格外重要 不论是笔试还是面试都是有章可循的 我这个有章可循 说的意思只是说应对技术面试是可以提前准备 运筹帷幄之后 决胜千里之外 不打毫无准备的仗 我觉得大家可以先从下面几
  • python tkinter 点击按钮选择文件,返回文件路径

    关于python tkinter 点击按钮选择文件 返回文件路径 这个方法我找了好几天 终于曲线救国实现了 首先分为两步 1 设计对话框选择文件 下面的代码搞了好几天 才发现全局变量的获取 必须放在root mainloop的最后 反正网上
  • MAC软件推荐(Java方向)

    MAC软件推荐 Tabby 终端控制工具 keka 解压工具 typora Markdown工具 QuickRedis Redis视图工具 UTM 虚拟机 Navicat Premium 数据库工具 Adobe Photoshop CC 2
  • Android-App的设计架构经验谈,终获offer

    前言 想要成为一名优秀的Android开发 你需要一份完备的知识体系 在这里 让我们一起成长为自己所想的那样 学算法真的很痛苦 虽然大数据现在很火 但找到适合自己定位的职业也未尝不是一种合理选择 投百度的经历非常坎坷 想写出来和大家分享一下
  • runtimeService 运行时服务组件

    在Activiti中 启动一个流程后 会创建一个流程实例 ProcessInstance继承Execution 两个都是接口 每个流程实例至少会有一个执行流 Execution 当流程实例没有流程分支时 一般情况下只会存在一个执行流 假设出
  • 计算机采用二进制每秒,计算机为什么采用二进制

    计算机为什么采用二进制 2018 09 12 电脑为什么要采用二进制计算 计算机中的一切计算都是用二进制进行的 平时我们用的十进制是逢十进一 二进制则是逢二进一 我们用的算盘事实上有两种用法 一种是十进制 一种是十六进制 算盘中代表 五 的
  • 嵌入式Linux下用C语言写后端接口——CGI实现

    文章目录 简介 实验环境 下载CGIC库源码 配置CGIC编译 测试CGI接口 编写一个简单的获取表单的CGI接口 测试login cgi CGIC接口API 简介 CGI Common Gateway Interface 公共网关接口 是
  • Python更改文件的编码格式

    Python更改文件的编码格式 import os from chardet universaldetector import UniversalDetector def change encode file change 2 type d
  • MySQL Flashback 闪回功能详解

    1 简介 mysqlbinlog flashback 闪回 用于快速恢复由于误操作丢失的数据 在DBA误操作时 可以把数据库恢复到以前某个时间点 或者说某个binlog的某个pos 比如忘了带where条件的update delete操作